FFMPEG爬坑记录
源码编译安装FFMPEG:
由于参考了很多雷神的帖子(雷霄骅(leixiaohua1020)的专栏——一个广院工科生的视音频技术笔记),而雷神已经去世好几年了,当年他写教程的时候用的还是比较老版本的ffmpeg,为了保证兼容性,所以这里选择安装比较低版本的ffmpeg 2.8.17。
首先对ffmpeg源码进行解压并进入目录:
tar xvf ffmpeg-2.8.17.tar.gz
cd ffmpeg-2.8.17
接下来运行configure,注意configure默认配置是不会生成动态库的,如需动态库,需要在configure后加入参数–enable-shared:
sudo ./configure --enable-shared --enable-decoder=h264 --prefix=/usr/local/ffmpeg
上述命令中的参数分别代表:
–enable-shared 生成动态库
–enable-decoder=h264 开启h264解码器
–prefix=/usr/local/ffmpeg 指定安装路径
然后编译并安装:
make -j8
sudo make install
由于指定了ffmpeg的安装路径,因此需要配置ld的环境变量,在/etc/ld.so.conf中添加:
/usr/local/ffmpeg
/usr/local/ffmpeg/lib
/usr/local/lib
然后更新ld配置:
sudo ldconfig
然后在~/.bashrc最后一行添加:
export PATH=$PATH:/usr/local/ffmpeg/bin
至此安装完成。
使用FFMPEG报Invalid UE golomb code错误:
FFMPEG项目在github上给出了解决方案:
https://github.com/FFmpeg/FFmpeg/commit/c51c08e0e70c186971385bdbb225f69edd4e3375
原因是FFMPEG源码中的get_ue_golomb()函数无法解析大于8190bit的数据,当遇到大于8190bit的数据时,就会报错,需要将源码中部分get_ue_golomb()函数修改为get_ue_golomb_long()。
这里我对原版的2.8.17版本源码进行了修改,可以直接使用下面的tar包进行编译安装,问题解决。
设置AVDictionary结构体参数无效果
AVDictionary是FFmpeg的键值对存储工具,FFmpeg经常使用AVDictionary设置/读取内部参数,avformat_open_input和avformat_find_stream_info函数都提供了AVDictionary参数,该参数可以在打开码流之前指定各种参数,比如:探测码流格式的时间,最大延时,超时时间,以及支持的协议的白名单等等。
实际上通过设置探测码流格式的时间以及码流数据的大小,一定程度上,减少了探测的时间,但是也会导致探测码流格式失败,因此这种方式仅用于码流格式不明确的时候,要求点播延时不苛刻的情况下
通过设置了AVDictionary的max_delay参数值无效,并且pFormatContext->max_delay也设置无效。
参考: