写点什么

音视频实战(5)- FFmpeg 处理音视频常见问题集锦

作者:liuzhen007
  • 2021 年 12 月 05 日
  • 本文字数:2961 字

    阅读完需:约 10 分钟

目录

问题1. Protocol not found

问题2. Invalid data found

问题3. Decoder not found

问题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 编码都有哪些格式:

pcm_s16be               pcm_s64le               pcm_zorkpcm_alaw                pcm_s16be_planar        pcm_s8pcm_bluray              pcm_s16le               pcm_s8_planarpcm_dvd                 pcm_s16le_planar        pcm_u16bepcm_f16le               pcm_s24be               pcm_u16lepcm_f24le               pcm_s24daud             pcm_u24bepcm_f32be               pcm_s24le               pcm_u24lepcm_f32le               pcm_s24le_planar        pcm_u32bepcm_f64be               pcm_s32be               pcm_u32lepcm_f64le               pcm_s32le               pcm_u8pcm_lxf                 pcm_s32le_planar        pcm_vidcpcm_mulaw               pcm_s64be               
复制代码


我去,不少啊,我们需要一项一项增加吗?

比如 --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

[mpegts @ 020d6180] Could not find codec parameters for stream 1 (Audio: aac ([15][0][0][0] / 0x000F), 0 channels): unspecified sample rate Consider increasing the value for the 'analyzeduration' and 'probesize' optionsInput #0, mpegts, from 'concat:C:\Users\PC\Downloads\20200601193107-2.webm.mp4.ts|C:\Users\PC\Downloads\20200601193107-1.webm.mp4.ts':        Duration: 00:02:42.67, start: 1.400000, bitrate: 1817 kb/s  Program 1    Metadata:      service_name    : Service01      service_provider: FFmpeg    Stream #0:0[0x100]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 1280x720, 14.83 tbr, 90k tbn, 60 tbc    Stream #0:1[0x101](eng): Audio: aac ([15][0][0][0] / 0x000F), 0 channels[mp4 @ 01f79580] sample rate not setCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
复制代码


分析:这里就是比较有意思的地方了,当 ts 封装转 mp4 封装的时候,尽管音频编码 aac 和视频编码 h264 是拷贝复用关系,但是某些参数还是需要进行解码 aac 或者 h264 才能拿到的,所以 ffmpeg 必须支持 --enable-decoder=aac 以及 --enable-decoder=h264 。这和自己之前的理解确实存在很大的出入。

发布于: 3 小时前阅读数: 6
用户头像

liuzhen007

关注

敲代码,搞开发。 2021.05.01 加入

本人深耕音视频技术,走全栈路线,前后端通吃,兼顾各端与流媒体服务器。 博客主页地址:https://liuzhen.blog.csdn.net 微信公众号:玩转音视频 欢迎交流学习!

评论

发布
暂无评论
音视频实战(5)- FFmpeg 处理音视频常见问题集锦