BUG解决记录
摘要 在使用FFmpeg合成H264和AAC为TS流时遇到两个关键问题:首先出现"mpegts格式不支持"的错误,原因是未调用av_register_all()注册编解码器;解决后又出现编解码器ID错位和结构体不匹配问题,发现是由于同时存在多个FFmpeg版本导致头文件与库版本不一致。最终通过完全卸载apt安装的FFmpeg及其相关库文件解决了问题。建议在验证解决方案前执行ma
问题描述
报错
在做一个用ffmpeg合成h264和acc为复合流ts的demo时,遇到了如下报错:
Requested output format ‘mpegts’ is not a suitable output format
位置
avformat_alloc_output_context2(&ffmpeg_config->oc, NULL, "mpegts", ffmpeg_config->network_addr);
avformat_alloc_output_context2函数内
if (!oformat) {
if (format) {
oformat = av_guess_format(format, NULL, NULL);
if (!oformat) {
av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
ret = AVERROR(EINVAL);
goto error;
}
} else {
oformat = av_guess_format(NULL, filename, NULL);
if (!oformat) {
ret = AVERROR(EINVAL);
av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
filename);
goto error;
}
}
}
原因
报错的原因是识别不到mpegts这种格式,排查bug过程中发现其它格式也识别不到,怀疑是ffmpeg安装不完整,经过多次不同方式的安装仍未解决。最后发现原因是未注册编解码器、复用器/解复用器
解决方案
在网上查阅解决办法,看到有人说必须在分配输出上下文之前调用av_register_all()注册编解码器、复用器/解复用器,但也有资料说FFmpeg 4.0+会自动注册,该方法以弃用。
虽然我的版本是4.2.3,但最终调用该方法后,解决了该bug
新的bug,ffmpeg头文件/库文件不匹配
描述
解决原bug后出现了新bug,包括:
- 音视频编码格式的枚举变量被函数引用后与实际值相错一位,比如AV_CODEC_ID_H264经过函数解析后变为了AV_CODEC_ID_CYUV
- Codec type or id mismatches ,头文件认为的H264参数结构体布局与库实际结构不一致,运行时库无法正确解析传入的AVCodecContext参数
原因
以上原因都是因为编译时使用的头文件版本与运行时链接的库版本不一致,根本原因是在解决前一个bug时,安装了多个ffmpeg,比如apt安装,源码安装。
解决方法
我个人是卸载了apt方式安装的版本后解决了问题,卸载命令如下:
sudo apt purge ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \
libavfilter-dev libavdevice-dev libavresample-dev libpostproc-dev \
libswresample-dev -y
sudo apt autoremove -y
也可以查找所有可能的安装路径:sudo find / -name "*ffmpeg*" -type d 2>/dev/null
然后酌情进行卸载,重装
最后
记得验证问题是否解决时,make clean并重新生成可执行文件,再进行测试
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)