Extraer Opus de WebM sin pérdidas con FFmpeg o MKVToolNix

Extraer Opus de WebM sin pérdidas con FFmpeg o MKVToolNix

Me encontré con un problema extraño al remixar la transmisión de audio de Opus desde WebM a otro contenedor como ogg u opus.

Pasar los archivos de salida a través de un analizador de espectro muestra claramente que hay pérdida/cambio en los datos. No estoy seguro de que los resultados sean 100% precisos, aunque varios programas lo confirman. Probé varios métodos usando FFmpeg y MKVExtract, pero en ambos casos, los archivos extraídos tienen diferencias notables (también en tamaño).

Después de una investigación exhaustiva, descubríeste erroren FFmpeg, lo que podría explicar la desalineación y, por tanto, el cambio en el tamaño del archivo. Pero parece que están sucediendo más cosas aquí. Convertí el código fuente y todos los archivos extraídos a WAV de 32 bits usando Audacity y luego los analicé nuevamente. El desplazamiento es aún más pronunciado en este caso, junto con la diferencia en los datos reales.

¿Existen métodos de prueba más sólidos y herramientas confiables para un procesamiento por lotes más conveniente si es necesario?

Esta es la salida del espectro de Audacity y Spek con información adicional:

Source file: audio.webm
Size: 2.94 MB
Spek: https://i.imgur.com/5NtmwG7.png
Audacity: https://i.imgur.com/hEs8Ajo.png

 

Extracted file using FFmpeg: audio_extracted_ffmpeg.opus
Size: 2.90 MB
Spek: https://i.imgur.com/5UBV3FV.png
Audacity: https://i.imgur.com/lsZl0Bt.png

 

Extracted file using MKVExtract: audio_extracted_mkvextract.opus
Size: 2.91 MB
Spek: https://i.imgur.com/waa1TOJ.png
Audacity: https://i.imgur.com/TAqyIst.png

 

Comparison between the source WebM and the FFmpeg Opus in Audacity:
Source file: https://i.imgur.com/xYciUfH.png
Extracted via FFmpeg: https://i.imgur.com/T8T02fx.png

Este es el resultado de la extracción de FFmpeg:

ffmpeg version 4.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.1.1 (GCC) 20190807
  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-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, matroska,webm, from 'files/audio.webm':
  Metadata:
    encoder         : google/video-file
  Duration: 00:03:08.30, start: -0.007000, bitrate: 131 kb/s
    Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
Output #0, opus, to 'files/ffmpeg/audio_extracted_ffmpeg.opus':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
    Metadata:
      encoder         : Lavf58.29.100
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
size=    2975kB time=00:03:08.28 bitrate= 129.5kbits/s speed=6.57e+03x
video:0kB audio:2952kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.803061%

Y MKVToolNix:

Extracting track 0 with the CodecID 'A_OPUS' to the file 'files/mkvextract/audio_extracted_mkvextract.opus'. Container format: Ogg (Opus in Ogg)
Progress: 100%

Parámetros CLI:

ffmpeg -i "source.webm" -vn -acodec copy "output.opus"

mkvextract "source.webm" tracks 0:"output.opus"

información relacionada