1

Так что да, тут есть проблема с ffmpeg.

В моем приложении я кодирую видео на основе кадров изображений и добавляю WAV-файл для звука из того же источника, но через другой веб-сокет. Может случиться, что WAV-файл не всегда будет иметь ту же длину, что и видео, на основе этих изображений + fps (плюс минус несколько секунд).

Как я могу сказать ffmpeg "растянуть" входной WAV-файл, чтобы он имел ту же длину, что и видео?

Вкратце: images (i) + WAV (w) = final video (v)

length(w) != length (v) ... что вызывает проблемы.

Вот пример команды ffmpeg, которую я сейчас использую:

ffmpeg -f image2 -thread_queue_size 512 -framerate 21,5 -i /frames/%d.webp -i videomail_preview.wav -y -acodec aac -strict экспериментальный -ac 1 -vcodec libx264 -crf 16 -представить быстрый -профиль:v базовый уровень - pix_fmt yuv420p -loglevel warning -movflags +faststart videomail_good.mp4 -acodec libvorbis -ac 1 -vcodec libvpx -crf 8 -dedeline good -cpu-used 1 -pix_fmt yuv420p-предупреждение о низком уровне -movflags_ fast

А вот версия ffmpeg + ее расширения

ffmpeg версия 2.8.6-1ubuntu2 Copyright (c) 2000-2016 разработчики FFmpeg, созданные с помощью gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) конфигурация 20160311: --prefix =/usr --extra-version = 1ubuntu2 --build -suffix = -ffmpeg --toolchain = усиленный --libdir =/usr/lib/x86_64-linux-gnu --incdir =/usr/include/x86_64-linux-gnu --cc = cc --cxx = g++ - enable-gpl --enable-shared --disable-stripping --disable-decoder = libopenjpeg --disable-decoder = libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable -libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable -libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable -libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-lib vpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable- libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60,100 / 56. 60.100 libavformat 56. 40,101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40,101 / 5. 40.101 libavresample 2. 1. 0/2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3,100

Любые предложения / хитрость, о которых я не знаю?

2 ответа2

3

резинка, вероятно, будет звучать лучше, чем атемпо ; особенно для больших различий в соотношениях. Если вы хотите использовать резинку, но у вас нет поддержки этого фильтра в вашем ffmpeg (и вы не хотите компилировать ffmpeg), то вы можете использовать автономный инструмент для rubberband.

пример rubberband

rubberband -D 12 input.wav output.wav
  • -D<X> , --duration <X> - растянуть или сквош, чтобы сделать выходной файл X секунд

Для получения дополнительной информации см. Текст справки утилиты командной строки rubberband -h или rubberband .

Пошаговый процесс

К сожалению, это не будет единой командой. Используя этот метод, вы должны будете:

  1. Кодируй видео.
  2. Получить продолжительность видео с ffprobe.
  3. Генерация аудио с rubberband .
  4. Mux видео и аудио:

    ffmpeg -i video -i audio -c copy -shortest output
    

Дополнительные примечания

  • -movflags +faststart Подходит для MP4, но игнорируется webm muxer.
  • FFmpeg версия 2.8.6 старая. Пользователям рекомендуется использовать сборку из текущей ветки git master. Самое простое решение - загрузить статическую сборку, но вы можете скомпилировать ее, если хотите. Компиляция позволит вам использовать резиновый фильтр в ffmpeg .
1

В аудиофильтрах FFMPEG есть 2 варианта, которые могут вам помочь: в обоих сценариях вы должны вручную рассчитать соотношение RATIO =(VIDEO_DURATION/AUDIO_DURATION) и ввести его в команду.

  1. atempo : с помощью этого фильтра вы можете ускорить или замедлить звук. для вашей цели ffmpeg -f image2 -thread_queue_size 512 -framerate 21.5 -i /frames/%d.webp -i videomail_preview.wav -y -acodec aac -strict experimental -ac 1 -vcodec libx264 -crf 16 -preset fast -profile:v baseline -pix_fmt yuv420p -loglevel warning -movflags +faststart -filter:a "atempo=RATIO" videomail_good.mp4 -acodec libvorbis -ac 1 -vcodec libvpx -crf 8 -deadline good -cpu-used 1 -pix_fmt yuv420p -loglevel warning -movflags +faststart -filter:a "atempo=RATIO" videomail_good.webm . ВАЖНОЕ примечание : фильтр atempo ограничен использованием значений от 0,5 до 2,0. Если вам нужно, вы можете обойти это ограничение, объединив несколько фильтров atempo.

  2. rubberband : благодаря этому вы можете лучше контролировать растяжение звука по сравнению с фильтром atempo . Вот одна из основных команд: ffmpeg -f image2 -thread_queue_size 512 -framerate 21.5 -i /frames/%d.webp -i videomail_preview.wav -y -acodec aac -strict experimental -ac 1 -vcodec libx264 -crf 16 -preset fast -profile:v baseline -pix_fmt yuv420p -loglevel warning -movflags +faststart -filter:a "rubberband=tempo=RATIO" videomail_good.mp4 -acodec libvorbis -ac 1 -vcodec libvpx -crf 8 -deadline good -cpu-used 1 -pix_fmt yuv420p -loglevel warning -movflags +faststart -filter:a "rubberband=tempo=RATIO" videomail_good.webm . этот фильтр имеет больше параметров, таких как pitch , transients , channels и многое другое.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .