开发环境:ubuntu16.04
qt版本:5.6.0
ffmpeg版本:ffmpeg-3.4
第一步:关于开发环境的搭建
对于ffmpeg开发环境的搭建,我就不再这里叙述了,参考下面博客,期间遇到问题一步步解决即可。
http://blog.csdn.net/haoxu135790/article/details/53171498
第二步:打开qt-creator创建qt项目
直接创建一个widget的窗口项目即可,然后后面再进行添加相应的控件。在此,我说一下本次qt+ffmpeg视频播放的思路:首先按照下面的ffmpeg编程模型,开个线程对视频文件进行解码最终得到一帧一帧的图片数据,然后将其加载到QImage对象上面去,然后通过信号与槽的关系将得到的图像数据传递给主窗口主函数,通过Qpainter实现显示。
具体的思路就是上面所说的,由于本篇文章的目的不是关于qt+ffmpeg播放器如何实现的步骤,因此在这里直接给出代码:
百度云链接:https://pan.baidu.com/s/1bppWreR 密码:yv3u
问题记录1:
如果你遇到下面这个错误,很有可能是你把开辟的内存给错对象了,比如本来给A函数的,你却给了B函数。
[swscaler @ 0x12cb1a0] bad dst image pointers
问题记录2:如果你遇到下面这个问题:
[swscaler @ 0xd9b180] deprecated pixel format used, make sure you did set range correctly
原因是因为你在下面的pixFormat没有设对
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
pixFormat, pCodecCtx->width, pCodecCtx->height,
AV_PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);
以下是其函数原型:
SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
int dstW, int dstH, enum AVPixelFormat dstFormat,
int flags, SwsFilter *srcFilter ,
SwsFilter *dstFilter, const double *param)
成功后返回SwsContext 类型的结构体。
参数1:被转换源的宽
参数2:被转换源的高
参数3:被转换源的格式,eg:YUV、RGB……(枚举格式,也可以直接用枚举的代号表示eg:AV_PIX_FMT_YUV420P这些枚举的格式在libavutil/pixfmt.h中列出)
参数4:转换后指定的宽
参数5:转换后指定的高
参数6:转换后指定的格式同参数3的格式
参数7:转换所使用的算法,
参数8:NULL
参数9:NULL
参数10:NULL
解决方法:
switch (pCodecCtx->pix_fmt) {
case AV_PIX_FMT_YUVJ420P :
pixFormat = AV_PIX_FMT_YUV420P;
break;
case AV_PIX_FMT_YUVJ422P :
pixFormat = AV_PIX_FMT_YUV422P;
break;
case AV_PIX_FMT_YUVJ444P :
pixFormat = AV_PIX_FMT_YUV444P;
break;
case AV_PIX_FMT_YUVJ440P :
pixFormat = AV_PIX_FMT_YUV440P;
break;
default:
pixFormat = pCodecCtx->pix_fmt;
break;
}
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
pixFormat, pCodecCtx->width, pCodecCtx->height,
AV_PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);
问题记录3:当你遇到下面这个问题,即segmentfault问题,这说明你的指针或内存操作有问题
段错误 (核心已转储)
解决方法:用gbd调试找到具体问题,如下:
Thread 1 "myplayer" received signal SIGSEGV, Segmentation fault.
__memmove_avx_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S:238
238 ../sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S: 没有那个文件或目录.
这个问题明显就是说可能产生段错误就是访问了错误的内存段,可能你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.
上面这句话很重要,指出了segmentfault的几个错误点,我这边的是,前面已经释放了分配好的内存,然后在最后对象释放的时候,有释放一次内存,所以出现了这个问题。
最后:附加一个挺全的ffmpeg音视频开发的博客
http://blog.csdn.net/leixiaohua1020/article/details/15811977
over!