audio - 使用 FFMPEG 进行快速 WAV 音频解码:加速 avformat_open_input / avformat_find_stream_info
问题描述
我正在为机器学习系统实现音频阅读后端。这意味着解码应该很快。可能的格式是.wav
, .gsm
, .opus
.
我已经在 FFMPEG 中实现了音频解码:https ://github.com/vadimkantorov/readaudio/blob/master/decode_audio_ffmpeg.c
目前使用scipy.io.wavfile.read
5 秒 8khz.wav
文件(我的工作负载的典型文件;实际上我正在并行加载和处理大约 1K 个此类文件)大约需要 0.02 毫秒(平均读取同一文件 100 次)。这是合理的,因为.wav
格式很简单。
在我的 FFMPEG 代码中,只调用doing大约需要0.45 毫秒(使用),avformat_open_input
并且比.慢20 倍。avformat_find_stream_info()
fmt_ctx->streams[0]-probe_packets=1
scipy.io.wavfile.read
到目前为止比 慢soundfile.read
5 倍scipy.io.wavfile.read
,比 .ffmpeg
慢 4 倍soundfile.read
。所以总共比 .ffmpeg
慢 20 倍scipy.io.wavfile.read
。
有谁知道如何避免受到这种延迟打击?似乎仍然如此,avformat_open_input
并且avformat_find_stream_info()
做了太多的工作。
我通过设置优化探测probe_packets=1
并用于AVIO
控制缓冲读取。我认为IO现在可以优化......
优化后的日志:
[wav @ 0x55f151175240] Format wav probed with size=2048 and score=99
decode_audio_BEFORE: 0.55 msec
[wav @ 0x55f151175240] Before avformat_find_stream_info() pos: 78 bytes read:65614 seeks:1 nb_streams:1
[wav @ 0x55f151175240] probing stream 0 pp:1
[wav @ 0x55f151175240] Probe with size=4096, packets=2500 detected mp3 with score=1
[wav @ 0x55f151175240] probed stream 0
[wav @ 0x55f151175240] parser not found for codec pcm_s16le, packets or times may be invalid.
[wav @ 0x55f151175240] After avformat_find_stream_info() pos: 80078 bytes read:145614 seeks:1 frames:20
优化前的日志:
decode_audio_BEFORE: 0.61 msec
[wav @ 0x563667d57b60] Before avformat_find_stream_info() pos: 78 bytes read:65614 seeks:1 nb_streams:1
[wav @ 0x563667d57b60] probing stream 0 pp:32
[wav @ 0x563667d57b60] Probe with size=4096, packets=2469 detected mp3 with score=1
[wav @ 0x563667d57b60] probing stream 0 pp:31
[wav @ 0x563667d57b60] Probe with size=8192, packets=2470 detected mp3 with score=1
[wav @ 0x563667d57b60] probing stream 0 pp:30
[wav @ 0x563667d57b60] probing stream 0 pp:29
[wav @ 0x563667d57b60] Probe with size=16384, packets=2472 detected mp3 with score=1
[wav @ 0x563667d57b60] probing stream 0 pp:28
[wav @ 0x563667d57b60] probing stream 0 pp:27
[wav @ 0x563667d57b60] probing stream 0 pp:26
[wav @ 0x563667d57b60] probing stream 0 pp:25
[wav @ 0x563667d57b60] probing stream 0 pp:24
[wav @ 0x563667d57b60] probing stream 0 pp:23
[wav @ 0x563667d57b60] probing stream 0 pp:22
[wav @ 0x563667d57b60] probing stream 0 pp:21
[wav @ 0x563667d57b60] probing stream 0 pp:20
[wav @ 0x563667d57b60] probing stream 0 pp:19
[wav @ 0x563667d57b60] probing stream 0 pp:18
[wav @ 0x563667d57b60] probing stream 0 pp:17
[wav @ 0x563667d57b60] probing stream 0 pp:16
[wav @ 0x563667d57b60] probing stream 0 pp:15
[wav @ 0x563667d57b60] probing stream 0 pp:14
[wav @ 0x563667d57b60] probing stream 0 pp:13
[wav @ 0x563667d57b60] probing stream 0 pp:12
[wav @ 0x563667d57b60] probed stream 0
[wav @ 0x563667d57b60] parser not found for codec pcm_s16le, packets or times may be invalid.
[wav @ 0x563667d57b60] After avformat_find_stream_info() pos: 80078 bytes read:145614 seeks:1 frames:20
decode_audio_AFTER: 7.90 msec
这个问题是众所周知的,但到目前为止我找不到解决方法:
解决方案
推荐阅读
- nginx - NGINX 将 SMTP 身份验证凭据转发到下一个服务器?
- python - 如何使用三角形提示制作 Qlabel
- oracleforms - 按钮和选项卡式画布
- java - 如何不断更新文本视图
- reactjs - 通过 blob URL 使用不同的流更新视频元素 src
- node.js - 纱线挂在添加包装上
- xamarin - System.ArgumentException:无法绑定到方法“GetGetDefaultCipherSuitesHandler”
- python - 找到由两个 3 位数字的乘积构成的最大回文数,只需稍作修改
- applescript - 如何使用 AppleScript 检测和操作 USB 上的文件
- python - 将 Python 2.7 字节字符串移植到 Python 3 的最佳方式