音视频实战(5)- FFmpeg 处理音视频常见问题集锦
目录
问题4. Error reinitializing filters
问题5. An error occured when convert ts
问题6. Option did not match anything
问题7. Unknown bitstream filter h264_mp4toannexb
问题8. Unknown bitstream filter aac_adtstoasc
问题9. Could not find codec parameters
问题 1. Protocol not found
Protocol not found. Did you mean file:
分析:这个报错的重点是 file:而不是前边的 format 类型,如果我们只看上半句就会被带跑偏。
解决方法就是在编译 ffmpeg 文件的时候,增加--enable-protocols 选项。
如果 ffmpeg 可执行文件不是自己编译的话,可以更换其他全量编译的 ffmpeg,或者直接去官网下载。
问题 2. Invalid data found
Invalid data found when processing input
分析:这个问题就比较笼统了,很可能的原因是封装格式不支持造成的。所以需要检查一下文件格式是否在 ffmpeg 支持的封装格式列表中,使用 ffmpeg -formats 命令进行查看。
如果 ffmpeg 可执行文件不是自己编译的话,可以更换其他全量编译的 ffmpeg,或者直接去官网下载,具体操作和注意事项可以参考链接:从官网下载FFmpeg时的坑,你有遇到吗?_liuzhen007的专栏-CSDN博客。
问题 3. Decoder not found
Decoder (codec pcm_f32le) not found for input stream #0:0
分析:需要增加对音频 pcm 编码格式的支持,尽管报错信息提示是没有 pcm_f32le 解码器,但其实 pcm 的格式非常多。
简单点的话,我们可能只需要增加--enable-decoder=pcm_f32le 编译选项。但实际场景中很可能出现不同编码的 pcm 格式,需要我们提前预判可能出现的不兼容情况。我们先来看一下 pcm 编码都有哪些格式:
我去,不少啊,我们需要一项一项增加吗?
比如 --enable-decoder=pcm_alaw --enable-decoder=pcm_s16be --enbale-decoder=pcm_s64le ...
当然不能!还不累死。
直接正则匹配一下:--enable-decoder=pcm*
完美!!!
如果 ffmpeg 可执行文件不是自己编译的话,可以更换其他全量编译的 ffmpeg,或者直接去官网下载。
问题 4. Error reinitializing filters
Error: ffmpeg exited with code 1: Press [q] to stop, [?] for help'aresample' filter not present, cannot convert audio formats.Error reinitializing filters!Failed to inject frame into filter network: Invalid argumentError while processing the decoded data for stream #0:0Conversion failed!
分析:在进行音频转码的过程中必须要进行音频重采样,即使是 pcm 转 aac 编码,这个过程也不能省略。
所以编译 ffmpeg 的时候需要增加 --enable-filter=aresample 配置选项,这个选项大概会让 ffmpeg 变大 30KB 左右。
如果 ffmpeg 可执行文件不是自己编译的话,可以更换其他全量编译的 ffmpeg,或者直接去官网下载。
问题 5. An error occured when convert ts
An error occured when convert ts: ffmpeg exited with code 1: *.mp4: Invalid data found when processing input
分析:报错的原因是不能识别 ts 格式的视频文件,需要增加 --enable-muxer=mpegts 和 --enable-demuxer=mpegts 配置选项,这两个选项大概占 600KB 左右。
注意:ts 的封装格式对应的配置项名字是 mpegts,而不是简单的 ts,但我们还可以理解二者的关系,毕竟有 ts 的影子。但有一个例子就没有那么好理解了,它就是 webm 格式,如果你不了解,你绝对想不到它对应的配置项是 matroska。
下图是对比 ffmpeg 文件在增加配置项之前和增加配置项之后的大小情况:
问题 6. Option did not match anything
WARNING: Option --enable-demuxer=mp4 did not match anything
分析:mp4 解封装格式的配置项 mov,不是 mp4,所以在编译 ffmpeg 的时候需要配置 --enable-demuxer=mov。
mov 的解复用器可以用于 mp4。
其实 mov,mp4,m4a,3gp,3g2,mj2 它们共用一个解复用器 mov,如果想了解源码可以查看文件: libavformat/mov.c 。
增加配置前后大小对比:
问题 7. Unknown bitstream filter h264_mp4toannexb
An error occured when convert ts: ffmpeg exited with code 1: Unknown bitstream filter h264_mp4toannexb
分析:H264 的封装格式有两种,annexb 和 mp4,前者属于传统模式,很多解码器只支持这种格式,它有 startcode,SPS 和 PPS 存储在 ES 中;后者没有 startcode,SPS 和 PPS 存储在 container 容器中。
ffmpeg 中定义的 H264 封装格式是 annexb 格式的。对于某些封装格式(比如 MP4/FLV/MKV 等)中的 H.264,需要用到名称为“h264_mp4toannexb”的 bitstream filter。
解决这个问题就是增加编译配置项 --enable-bsf=h264_mp4toannexb 。
增加配置前后大小对比:
问题 8. Unknown bitstream filter aac_adtstoasc
An error occured when convert ts: ffmpeg exited with code 1: Unknown bitstream filter aac_adtstoasc
分析:对于某些封装格式(比如 MP4/FLV/MKV 等)中的 AAC,需要用到名称为“aac_adtstoasc”的 bitstream filter。
所以解决这个问题就是增加编译配置项:
--enable-bsf=aac_adtstoasc
增加配置前后大小对比:
问题 9. Could not find codec parameters
分析:这里就是比较有意思的地方了,当 ts 封装转 mp4 封装的时候,尽管音频编码 aac 和视频编码 h264 是拷贝复用关系,但是某些参数还是需要进行解码 aac 或者 h264 才能拿到的,所以 ffmpeg 必须支持 --enable-decoder=aac 以及 --enable-decoder=h264 。这和自己之前的理解确实存在很大的出入。
版权声明: 本文为 InfoQ 作者【liuzhen007】的原创文章。
原文链接:【http://xie.infoq.cn/article/25e701eac6d04af0f602e56fc】。文章转载请联系作者。
评论