首页 > 解决方案 > 使用 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.read5 秒 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=1scipy.io.wavfile.read

到目前为止比 慢soundfile.read5 倍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

这个问题是众所周知的,但到目前为止我找不到解决方法:

标签: audioffmpeg

解决方案


推荐阅读