Извлечение аудиопотока FFmpeg в AVI без чередования - медленное по сравнению с AviSynth - PullRequest
0 голосов
/ 03 мая 2019

Я хочу извлечь аудиопоток из файла avi как файл wav, он работает, но он действительно медленный (~ 4-5 кадров в секунду), хотя я просто хочу скопировать поток.

Вот тип потока, который я хочу извлечь (информация ffprobe):
Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s

Прохождение AviSynth делает это примерно в 100 раз быстрее, но я бы предпочел чистое решение FFmpeg. Почему такая разница в скорости? Похоже, что FFmpeg читает и обрабатывает весь файл, тогда как AviSynth может просто извлечь данные, не читая их.

Пример:
ffmpeg -i file.avi -vn -ac 2 -c:a copy audio.wav
или
ffmpeg -i file.avi -map 0:a -ac 2 -c:a copy audio.wav
оба работают нормально, но требуют времени.

Использование скрипта AviSynth в качестве ввода:
ffmpeg -i script.avs -map 0:a -ac 2 -c:a copy audio.wav
с script.avs, содержащим только:
AviSource("file.avi")
делает то же самое, но почти мгновенно!

Есть идеи, почему AviSynth намного быстрее и есть ли способ получить ту же скорость в FFmpeg?

Редактировать: добавление журналов
Использование FFmpeg напрямую:

E:\>ffmpeg -i "file.avi" -map 0:a -c:a copy -y -benchmark "output.wav"
ffmpeg version N-92936-ged3b64402e Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20181201
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 25.100 / 56. 25.100
  libavcodec     58. 43.100 / 58. 43.100
  libavformat    58. 25.100 / 58. 25.100
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 47.100 /  7. 47.100
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
[avi @ 0000018d3c38a680] non-interleaved AVI
Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, avi, from 'file.avi':
  Duration: 00:18:37.49, start: 0.000000, bitrate: 534682 kb/s
    Stream #0:0: Video: rawvideo, bgr24, 1280x720, 533183 kb/s, 24.11 fps, 24.11 tbr, 24.10 tbn, 24.10 tbc
    Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Output #0, wav, to 'output.wav':
  Metadata:
    ISFT            : Lavf58.25.100
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Stream mapping:
  Stream #0:1 -> #0:0 (copy)
Press [q] to stop, [?] for help
size=  192445kB time=00:18:37.12 bitrate=1411.2kbits/s speed=4.77x
video:0kB audio:192445kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000040%
bench: utime=1.188s stime=50.766s rtime=234.254s
bench: maxrss=17468kB

Использование AviSynth:

E:\>ffmpeg -i "soundout.avs" -map 0:a -c:a copy -y -benchmark "output.wav"
ffmpeg version N-92936-ged3b64402e Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20181201
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 25.100 / 56. 25.100
  libavcodec     58. 43.100 / 58. 43.100
  libavformat    58. 25.100 / 58. 25.100
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 47.100 /  7. 47.100
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, avisynth, from 'soundout.avs':
  Duration: 00:18:37.49, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: rawvideo (BGR[24] / 0x18524742), bgr24, 1280x720, 24.11 fps, 24.11 tbr, 24.10 tbn, 24.10 tbc
    Stream #0:1: Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s
Output #0, wav, to 'output.wav':
  Metadata:
    ISFT            : Lavf58.25.100
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Stream mapping:
  Stream #0:1 -> #0:0 (copy)
Press [q] to stop, [?] for help
size=  192445kB time=00:18:37.11 bitrate=1411.2kbits/s speed= 155x
video:0kB audio:192445kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000040%
bench: utime=0.234s stime=1.047s rtime=7.236s
bench: maxrss=23792kB

Редактировать: тесты после "перекодирования" AVI-файла:
На что-то ...
Скажи, что мой оригинальный файл - f.avi. Вот результаты ffprobe:

[avi @ 0x55a9c4b1e740] non-interleaved AVI
Input #0, avi, from 'f.avi':
  Duration: 00:00:38.18, start: 0.000000, bitrate: 1104582 kb/s
    Stream #0:0: Video: rawvideo, bgr24, 1632x1200, 1104265 kb/s, 23.47 fps, 23.47 tbr, 23.47 tbn, 23.47 tbc
    Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s

Извлечение аудио занимает много времени.
Теперь, если я «перекодирую» файл в другой AVI:

ffmpeg -i f.avi -c copy f2.avi

Я могу извлечь аудио из f2.avi в миллисекундах!
FFprobe на f2.avi:

Input #0, avi, from 'f2.avi':
  Metadata:
    encoder         : Lavf57.56.101
  Duration: 00:00:38.18, start: 0.000000, bitrate: 1104456 kb/s
    Stream #0:0: Video: rawvideo, bgr24, 1632x1200, 1104265 kb/s, 23.47 fps, 23.47 tbr, 23.47 tbn, 23.47 tbc
    Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s

Это то же самое, кроме метаданных, которые не должны иметь значения, но с этим сравнением я вижу, что проблема должна быть связана с тем фактом, что оригинал не чередуется!
Я бы предположил, что было проще читать и извлекать аудио из файла без чередования, но, может быть, это не соответствует стандартам AVI, поэтому необходима дополнительная работа?

1 Ответ

0 голосов
/ 06 мая 2019

Вы сами ответили на свой вопрос: похоже, что у вас узкая полоса пропускания входной полосы, и ffmpeg читает необработанное видео, чтобы просто выбросить его, в то время как avisynth (который, вероятно, будет использовать AVI Splitter из DirectShow) читает только аудиоданные с диска.Я не вижу способа заставить ffmpeg делать то же самое.

...