Como esticar o arquivo WAV para o mesmo tamanho de vídeo?

1

Então, sim, ter um problema ffmpeg complicado aqui.

No meu aplicativo, estou codificando um vídeo com base em quadros de imagem e adiciono um arquivo WAV para o som da mesma fonte, mas por meio de um soquete da web diferente. Pode acontecer que o ficheiro WAV nem sempre tenha exactamente o mesmo comprimento que o vídeo baseado nessas imagens + fps (mais menos alguns segundos).

Como posso dizer ao ffmpeg para "esticar" o arquivo WAV de entrada para ter o mesmo comprimento que o vídeo?

Em resumo: images (i) + WAV (w) = final video (v)

length(w) != length (v) ... que está causando problemas.

Aqui está um exemplo do comando ffmpeg que estou usando no momento:

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 videomail_good.mp4 -acodec libvorbis -ac 1 -vcodec libvpx -crf 8 -deadline good -cpu-used 1 -pix_fmt yuv420p -loglevel warning -movflags +faststart videomail_good.webm

E aqui a versão do ffmpeg + suas extensões

ffmpeg version 2.8.6-1ubuntu2 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) 20160311 configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --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-libvpx --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

Alguma sugestão / truque não tenho conhecimento?

    
por Michael Heuberger 06.10.2016 / 00:56

2 respostas

2

o rubberband provavelmente soará melhor do que atempo ; especialmente para maiores diferenças de proporção. Se você quiser usar o rubberband, mas não tiver suporte para este filtro no seu ffmpeg (e não quiser compilar o ffmpeg ), então você pode usar a ferramenta autônoma rubberband .

rubberband example

rubberband -D 12 input.wav output.wav
  • -D<X> , --duration <X> - Estique ou esmague para tornar o arquivo de saída com X segundos de duração

Consulte rubberband -h ou rubberband texto de ajuda do utilitário de linha de comando para obter mais informações.

Processo passo a passo

Infelizmente, isso não será um único comando. Usando este método, você terá que:

  1. Codifique o vídeo.
  2. Obtenha a duração do vídeo com ffprobe .
  3. Gere o áudio com rubberband .
  4. Mux o vídeo e áudio:

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

Notas adicionais

  • -movflags +faststart É adequado para MP4, mas é ignorado pelo webm muxer.
  • A versão 2.8.6 do FFmpeg é antiga. Recomenda-se que os usuários usem uma compilação a partir da ramificação do master do git atual. A solução mais fácil é baixar uma versão estática, mas você pode compile se preferir. A compilação permitirá que você use o filtro de faixa de borracha em ffmpeg .
por 06.10.2016 / 20:49
1

Existem 2 opções nos filtros de áudio FFMPEG que podem ajudá-lo: nos dois cenários, você deve calcular manualmente a proporção de RATIO = (VIDEO_DURATION / AUDIO_DURATION) e colocá-la no comando.

  1. atempo : com este filtro, você pode acelerar ou desacelerar seu áudio. para sua meta 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 . Nota importante : O filtro atempo é limitado a usar valores entre 0,5 e 2,0. Se você precisar, você pode contornar essa limitação encadeando vários filtros atempo juntos.

  2. rubberband : com isso, você pode ter mais controle sobre esticar seu áudio em comparação com o filtro atempo . Um comando básico é: 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 . esse filtro tem mais opções, como pitch , transients , channels e muito mais.

por 06.10.2016 / 10:38

Tags