QT+ffmpeg 简单视频播放代码及问题记录
来源:互联网 发布:js arguments用法 编辑:程序博客网 时间:2024/06/06 12:33
开发环境: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!
- QT+ffmpeg 简单视频播放代码及问题记录
- QT视频播放错误解决方法及视频播放实现代码
- ffmpeg简单视频播放器
- QT+ffmpeg视频播放器学习知识点
- 关于《最简单的基于FFMPEG+SDL的视频播放器》记录
- 关于《最简单的基于FFMPEG+SDL的视频播放器》记录二
- linux ffmpeg 简单视频播放器
- linux ffmpeg 简单视频播放器
- linux ffmpeg 简单视频播放器
- FFMPEG Qt视频播放器之播放控制
- ffmpeg解码视频及倒序播放
- 三、FFMPEG视频解码及播放
- FFMPEG Qt视频播放器之音视频同步
- ffmpeg使用记录--解决了压制的视频在安卓不播放的问题
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
- 选择排序
- 绘制决策树
- 90后“老头儿”和00后Go小子的硬盘夜话
- 网友吵翻了!自愿加班不算加班,那“被自愿加班”呢
- 一篇实用的Latex的入门教程
- QT+ffmpeg 简单视频播放代码及问题记录
- 数据结构第四次实验
- TCP可靠,UDP不可靠的原因
- c++中如何保留2位小数输出
- top
- UsacoTraining Chapter1.2 Greedy Gift Givers
- 模拟登陆,抓取会员课程
- bzoj 4590: [Shoi2015]自动刷题机 二分
- 在线流程图制作 https://www.processon.com/