您的位置:首页 > 编程语言 > Qt开发

QT+ffmpeg 简单视频播放代码及问题记录

2017-12-17 12:05 1021 查看
开发环境: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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ui 编程 qt5 ffmpeg ubuntu