Estou simplesmente tentando extrair uma faixa de áudio de um vídeo de várias faixas gerado pelo OBS usando -c:a copy
para evitar a recodificação, comando completo:
ffmpeg -y -i "C:\Users\gabri\Videos\OBS Replay Buffer\Replay 2020-01-26 00-19-35.mkv" `
-map a:2 -c:a copy "C:\Users\gabri\Videos\OBS Replay Buffer\Test.wav"
No entanto, o arquivo resultante está claramente corrompido. Ele contém apenas segmentos silenciosos / curtos (basicamente blips) do que deveria e reproduz apenas 1/50 de sua duração real. Eu até tentei reproduzir o arquivo usando o FFplay:
ffplay -i "C:\Users\gabri\Videos\OBS Replay Buffer\Test.wav"
sem sorte, observando os mesmos resultados. Testando este comando em outros vídeos do OBS com uma em vez de várias faixas de áudio, e os vídeos gerados pelo OBS com diferentes contêineres (mp4, flv, etc.) cuspiram os mesmos arquivos ilegíveis. Usando exatamente as mesmas opções / comando em um vídeo gerado pelo FFmpeg, no entanto, e outros arquivos de vídeo que eu tinha em mãos, parecia funcionar muito bem. Eu tentei recodificar o áudio com estas opções:
ffmpeg -y -i "C:\Users\gabri\Videos\OBS Replay Buffer\Replay 2020-01-26 00-19-35.mkv" `
-map a:2 -c:a aac -ar 44100 -b:a 320k "C:\Users\gabri\Videos\OBS Replay Buffer\Test.wav"
e para minha surpresa obtive os mesmos resultados novamente. Eu descobri que a única maneira de fazer com que os arquivos wav recém-gerados realmente se pareçam com o áudio dos vídeos gerados pelo OBS, eu tinha que usar o pcm_s16le
codificador, exemplo:
ffmpeg -y -i "C:\Users\gabri\Videos\OBS Replay Buffer\Replay 2020-01-26 00-19-35.mkv" `
-map a:2 -c:a pcm_s16le "C:\Users\gabri\Videos\OBS Replay Buffer\Test.wav"
Com essas opções, o novo arquivo wav é reproduzido exatamente como você esperaria. No entanto, agora tenho que esperar que ele recodifique o arquivo, em alguns casos várias vezes, dependendo do cenário. Nunca tive falha na cópia de fluxo em nenhum outro arquivo de vídeo / áudio em que o usei, alguém sabe o que pode estar causando isso?
Saída completa do FFmpeg:
PS C:\Users\gabri> ffmpeg -y -i "C:\Users\gabri\Videos\OBS Replay Buffer\Replay 2020-01-26 00-19-35.mkv" `
>> -map a:2 -c:a copy "C:\Users\gabri\Videos\OBS Replay Buffer\Test.wav" ffmpeg version git-2020-01-29-de1b2aa Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9.2.1 (GCC) 20200122
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --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-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
libavutil 56. 38.100 / 56. 38.100
libavcodec 58. 67.100 / 58. 67.100
libavformat 58. 36.100 / 58. 36.100
libavdevice 58. 9.103 / 58. 9.103
libavfilter 7. 71.100 / 7. 71.100
libswscale 5. 6.100 / 5. 6.100
libswresample 3. 6.100 / 3. 6.100
libpostproc 55. 6.100 / 55. 6.100
Input #0, matroska,webm, from 'C:\Users\gabri\Videos\OBS Replay Buffer\Replay 2020-01-26 00-19-35.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: 00:04:58.52, start: 0.000000, bitrate: 60553 kb/s
Stream #0:0: Video: h264 (High), yuv420p(tv, bt470bg/bt709/bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 60 fps, 60 tbr, 1k tbn, 120 tbc (default)
Metadata:
DURATION : 00:04:58.517000000
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
Metadata:
title : Track1
DURATION : 00:04:58.423000000
Stream #0:2: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
Metadata:
title : Track2
DURATION : 00:04:58.423000000
Stream #0:3: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
Metadata:
title : Track3
DURATION : 00:04:58.423000000
Stream #0:4: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
Metadata:
title : Track4
DURATION : 00:04:58.423000000
Stream #0:5: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
Metadata:
title : Track5
DURATION : 00:04:58.423000000
Stream #0:6: Audio: aac (LC), 44100 Hz, stereo, fltp (default)
Metadata:
title : Track6
DURATION : 00:04:58.423000000
Output #0, wav, to 'C:\Users\gabri\Videos\OBS Replay Buffer\Test.wav':
Metadata:
ISFT : Lavf58.36.100
Stream #0:0: Audio: aac (LC) ([255][0][0][0] / 0x00FF), 44100 Hz, stereo, fltp (default)
Metadata:
title : Track3
DURATION : 00:04:58.423000000
Stream mapping:
Stream #0:3 -> #0:0 (copy)
Press [q] to stop, [?] for help
size= 11658kB time=00:04:58.42 bitrate= 320.0kbits/s speed= 331x
video:0kB audio:11658kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000787%
Aqui estão minhas configurações de OBS: https://postimg.cc/gallery/1kahe1o4q/
E por último aqui está um dos arquivos de vídeo que me dá dor de cabeça: https://drive.google.com/open?id=10QneHPO_lRMDA0qNFCuyn5S90Eubn8q0
O AAC deve estar no enquadramento ADTS, mas o multiplexador WAV não tem capacidade para reformatar fluxos AAC, portanto, canalize-o através do multiplexador MPEG-TS que o faz.
ffmpeg -i "C:\Users\gabri\Videos\OBS Replay Buffer\Replay 2020-01-26 00-19-35.mkv" -map a:2 -c:a copy -f mpegts - | ffmpeg -y -f mpegts -i - -c copy "C:\Users\gabri\Videos\OBS Replay Buffer\Test.wav"
As faixas de áudio são aac. mas estão escrevendo para um wav. Mas você está dizendo ao ffmpeg que ele não deve converter de aac para wav via -c:a copy. Portanto, é impossível para o ffmpeg lidar com esse requisito.