FFMPEG编码容错处理解决办法之途径----升级库文件
在qt开发环境下接收网络数据,调用ffmpeg解码播放视频,出现闪屏现象,具体现象可以使用操作系统自带的ffplay播放器播放原始视频流可复现;而使用操作系统自带的mpv播放器播放视频则不会出现闪屏;闪屏时会报Could not find ref with POC xx错误(由于是无线通信该错误无法避免)要求能达到mpv的播放效果就行,具体实现方式不限。
根本解决方法:通过测试不同版本的pplay功能,哪个版本容错能力强就用哪个版本。
当只使用 I 帧进行编码时,编码时间较短,但生成的视频流较长;而加入 P B 帧后,会使编码时间变长,但生成的视频流长度只有纯 I 帧编码的 25%。因此,P B 帧的加入本质上是用时间换空间的思路(跟算法设计思路刚好反过来)。
将无线传输过来的UDP协议视频,将UDP去掉包头及包尾将数据组合成一帧编码数据后保存成h265裸流文件。用ffmpeg4.2.2的命令ffplay播放有花屏现象并伴随报错误Could not find ref with POC xx。但是利用mpv播放虽然也有报错Could not find ref with POC xx但是不花屏。将一帧H265编码数据组成一帧后送入函数 avcodec_send_packet(进行解码)和avcodec_receive_frame(从解码的图像中获取YUV图像)这些函数的返回值也是对的。
为此解决此问题用到的方法进行梳理如下:
方法1、加入数据缓冲器---有少部分改善
由原来的收到一帧就进行处理修改为根据UDP协议序号帧收满数据后,再直接送入解码器进行解码(开辟有缓冲器)。
方法2、硬件解码---效果不明显
硬件解码数据不能为RGB24,
方法3、OPenGL显示图像数据--效果不明显
通过加入库文件进行显示
方法4、 MPV与FFMPEG播放处理不通--确定问题解决思路
发现MPV虽然是基于FFMPEG库上开发的但是对FFMPEG进行了优化,其播放效果优于FFMPEG
方法5、更新FFMPEG库---效果明显
Step 1 下载并编译FFMPEG库
1)下载ffmpeg源代码
说明:
ffmpeg下载地址 http://ffmpeg.org/releases/
点击Last modified(最后修改内容可看到最新版本--其实是快照版本)
- Snapshot版本:这是一种开发中的版本,表示该版本尚未正式发布,可能会频繁发生变化。它主要用于开发阶段,特别是多个团队或模块之间协同开发时,确保依赖的模块始终是最新的。12
- Release版本:这是一种正式发布的版本,表示该版本已经经过测试和验证,不会再有频繁的变化。它通常用于生产环境,确保依赖的版本是稳定和可靠的。
2) ffmpeg编译安装
首先,将下载好的ffmpeg压缩包解压。输入解压bz2压缩文件的命令
sudo tar -xjf ffmpeg-snapshot.tar.bz2
然后进入解压后的文件夹,打开终端,设置安装配置,配置文件是configure,在编译和安装之前,需要配置一下,不然无法执行编译指令.
配置configure的指令为:(注意将--enable-libx264去掉,否则配置报错)
sudo ./configure --enable-gpl --enable-libx264 --prefix=/media/cssc/708/ZHKZ/YTHWQ/FFMPEG_BUILD/ffmpeg-build --enable-shared
其中,gpl和libx264是额外的库,可根据情况选择,默认都是disable。
--prefix:指定安装路径,如果不指定,头文件会默认安装在/usr/local/include,库会默认在/usr/local/lib
--enable-shared:选择编译动态库,如果不加上这一句,编译出来的只有静态库(.a),加上之后才有动态库(.so)
配置完以后,执行编译和安装命令:
make -j8 && sudo make install
其中,make -j8:多线程编译的意思,加快编译速度,当然也要看电脑最大线程数。make install:安装各种头文件和库,要加上sudo,不然建不了文件夹。
编译以及安装完之后,在ffmpeg-build
文件夹下会多出四个文件夹,bin、include、lib、share;
如果没有指定安装路径,bin文件夹下的两个文件会默认至/usr/local/bin/
include文件夹下的内容会默认在/usr/local/include/下
lib文件夹下的内容会默认在/usr/local/lib/下
share文件夹下的内容默认在/usr/local/share/下
除此之外,还需要注意一点,每次编译之前都需要配置configure
,上次的配置在此次编译无效。
3)添加环境变量
打开ffmpeg(安装后的)下的bin,执行./ffmpeg -version会出现报错信息:这是因为ffmpeg库没有链接到系统库里边,建立链接有两种办法,第一种在环境变量中添加ffmpeg库路径,第二种是在/etc/ld.so.conf.d文件夹下建立ffmpeg.conf,推荐使用第一种,更简单快捷一些,第二种权当记录在此。
第一种方法:
将ffmpeg添加到环境变量,首先执行
sudo gedit /etc/profile
在文件末尾添加ffmpeg主程序路径和库路径:(也可命令行执行只对当前cmd用户有效)
export PATH=$PATH:/media/cssc/708/ZHKZ/YTHWQ/FFMPEG_BUILD/ffmpeg-build/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/media/cssc/708/ZHKZ/YTHWQ/FFMPEG_BUILD/ffmpeg-build/lib
保存后,再执行
source /etc/profile
再次执行ffmpeg -version
就可以正常显示ffmpeg版本信息了,也不用进入ffmpeg-build/bin
下了。不仅可以看到版本信息,还能看到编译ffmpeg时的configure
配置信息,以及库的版本。
补充说明:除了用新版本可以解决视频解码播放花屏问题,同时也尝试基于FFMPEG4.2.2版本的MPV库进行播放,因为MPV库对FFMPEG库进行了优化。
方法6、采用MPV库---效果明显
linux下GPU硬件解码接口,常用的有vdpau和vaapi。mpv是基于mplayer开发的一个播放器。此外,mpv还提供了函数库libmpv,通过使用libmpv可以编写一个简单的播放器。
mpv是一款一优秀的播放器。由于需要将其内嵌到代码中,所以需要将其编译成动态库的形式使用。编译流程如下:
1)mpv源码URL:
URL1: https://github.com/mpv-player/mpv
URL2: https://github.com/mpv-player/mpv-build
URL1是mpv的源码,而URL2是将源码和其所需要的库做了一个整合脚本。此文档使用URL2进行编译安装。
windows环境下的64为开发库的下载地址为:https://sourceforge.net/projects/mpv-player-windows/进入后页面如下,选择dev x86-64位的压缩包进行下载。
2)mpv编译安装流程记录: