博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ffmpeg系列:使用ffmpeg转换为RGB数据并缩放视频
阅读量:2418 次
发布时间:2019-05-10

本文共 2700 字,大约阅读时间需要 9 分钟。

main.cpp文件代码如下:

#include "myplayer.h"#include 
#pragma comment(lib,"avformat.lib")#pragma comment(lib,"avutil.lib")#pragma comment(lib,"avcodec.lib")#pragma comment(lib,"swscale.lib")extern "C"{ #include
#include
}static double r2d(AVRational r){ return r.num == 0 || r.den == 0 ? 0. : (double)r.num / (double)r.den;}int main(int argc, char *argv[]){ av_register_all(); char *path = "test.mp4"; AVFormatContext *ac = NULL; int re = avformat_open_input(&ac, path, 0, 0); if (re != 0){//打开文件失败 char buf[1024] = { 0 }; av_strerror(re, buf, sizeof(buf)); printf("file %s open failed because of : %s", path, buf); getchar(); return -1; } int totalSec = ac->duration / AV_TIME_BASE; printf("指定的视频文件有 %d分%d秒\n", totalSec / 60, totalSec % 60); int videoStream = 0; AVCodecContext *videoCtx = NULL; SwsContext *cCtx = NULL; int outWidth = 640; int outHeight = 480; char *rgb = new char[outWidth * outHeight * 4]; for (int i = 0; i < ac->nb_streams; i++) { AVCodecContext *enc = ac->streams[i]->codec; if (enc->codec_type == AVMEDIA_TYPE_VIDEO){ videoStream = i; videoCtx = enc; AVCodec *codec = avcodec_find_decoder(enc->codec_id); if (!codec){ printf("无法解码此视频文件\n"); return -1; } int err = avcodec_open2(enc, codec, NULL); if (err != 0){ char buf[1024] = { 0 }; av_strerror(err, buf, sizeof(buf)); printf(buf); return -2; } printf("\n"); printf("成功打开视频编码流\n"); } } AVFrame *yuv = av_frame_alloc(); for (;;){ AVPacket pkt; re = av_read_frame(ac, &pkt); if (re != 0){ break; } if (pkt.stream_index != videoStream) { av_packet_unref(&pkt); continue; } int pts = pkt.pts * r2d(ac->streams[pkt.stream_index]->time_base) * 1000;//得到帧的毫秒值 int re = avcodec_send_packet(videoCtx,&pkt); if (re != 0){ av_packet_unref(&pkt); continue; } re = avcodec_receive_frame(videoCtx,yuv); if (re != 0){ av_packet_unref(&pkt); continue; } printf("[D]___"); //打开ffmpeg格式转换和缩放器 cCtx = sws_getCachedContext(cCtx, videoCtx->width, videoCtx->height, videoCtx->pix_fmt, outWidth, outHeight, AV_PIX_FMT_BGRA, SWS_BICUBIC, NULL, NULL, NULL); if (!cCtx){ printf("sws_getCachedContext failed!\n"); break; } uint8_t *data[AV_NUM_DATA_POINTERS] = {0}; data[0] = (uint8_t *)rgb; int linesize[AV_NUM_DATA_POINTERS] = { 0 }; linesize[0] = outWidth * 4; int h = sws_scale(cCtx, yuv->data, yuv->linesize, 0, videoCtx->height, data, linesize); if (h > 0){ printf("(%d)", h); } printf("pts = %d 毫秒\n", pts); av_packet_unref(&pkt); } if (cCtx){ sws_freeContext(cCtx); cCtx = NULL; } avformat_close_input(&ac); ac = NULL; QApplication a(argc, argv); MyPlayer w; w.show(); return a.exec();}
运行结果如图:

你可能感兴趣的文章
jQuery Mobile权威指南
查看>>
决战第三屏:移动互联网时代的商业与营销新规则
查看>>
方刚先生谈《胜于言传——网站内容制胜宝典》
查看>>
php以图搜图
查看>>
php怎么实现根据图片搜索图片功能
查看>>
三种保证URL地址可信的加密方式
查看>>
memcached 并发原语CAS与GETS操作
查看>>
memcached(六)调优经验
查看>>
赶集mysql军规
查看>>
mysql使用索引优化order排序
查看>>
mysql复合索引、普通索引总结
查看>>
mysql explain中的using filesort
查看>>
MYSQL explain详解
查看>>
MySQL查询优化-explain
查看>>
Java 反射和动态代理真的没那么高深,一起来看看就知道了
查看>>
Lucky
查看>>
ERP100 論壇,ORACLE ERP
查看>>
ORA-600
查看>>
不止 5G 和鸿蒙,华为最新大招,扔出 AI 计算核弹
查看>>
【早报】做Java半年,挣的不如AI 1个月?第二句泪目..
查看>>