Recortar a milisegundos en FFmpeg provoca una desaceleración masiva en la velocidad de procesamiento

Recortar a milisegundos en FFmpeg provoca una desaceleración masiva en la velocidad de procesamiento

Soy nuevo aquí, es la primera vez que me uno a un foro como este, ¡así que mis más sinceras disculpas si soy un asco! Gracias de antemano por su paciencia. Estoy ejecutando Windows CMD en mi computadora portátil.

Estoy intentando recortar (eliminar) los primeros 7,3 segundos de un vídeo de baile que tiene audio sincronizado con esos movimientos. Aquí está la línea de código con la que comencé:

ffmpeg -ss 7.3 -i myVideo.mp4 -c copy trimmed.mp4

Si bien esta edición se realiza instantáneamente (excelente), el milisegundo se ignora y el archivo de salida resultante se recorta a partir de 7 segundos en lugar de 7,3. Entonces intenté revisar lo siguiente (cambiando el orden de las entradas):

ffmpeg -i myVideo.mp4 -ss 7.3 -c copy trimmed.mp4

Aquí, la edición fue nuevamente instantánea (excelente) Y se cortó con el nivel correcto de detalle de milisegundos, sin embargo, se introdujo un retraso en mi audio (inutilizando el video editado). Actualmente estoy usando el software genérico 'Películas y TV' para reproducir el video, pero eventualmente subiré estos videos a Vimeo, desde donde se transmitirán a través de múltiples dispositivos.

Miré por todos lados y solo encontré una solución:

ffmpeg -ss 7.3 -i myVideo.mp4 -c:v libx264 -c:a aac trimmed.mp4

Si bien esto funciona con precisión, lamentablemente el procesamiento de un archivo de 450 MB tarda aproximadamente 45 minutos. Tengo alrededor de 800 videos similares para editar (todos los cuales tienen exactamente la misma introducción que debe recortarse) y me preguntaba si hay alguna manera de obtener el nivel de precisión de milisegundos sin crear una desaceleración masiva del procesamiento. ¿O tal vez podría resolver este problema a través de una computadora más rápida? Estoy abierto a todas y cada una de las ideas, ¡muchas gracias por tu ayuda!

Aquí está la salida de la línea de comando sin cortes de misegundodominio:

ffmpeg -i myVideo.mp4 -ss 7.3 -c copy trimmed.mp4
ffmpeg version N-94576-g1965161ef6 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. 33.100 / 56. 33.100
  libavcodec     58. 55.100 / 58. 55.100
  libavformat    58. 31.101 / 58. 31.101
  libavdevice    58.  9.100 / 58.  9.100
  libavfilter     7. 58.100 /  7. 58.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'myVideo.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    creation_time   : 2019-07-18T19:40:35.000000Z
  Duration: 00:03:37.25, start: 0.000000, bitrate: 20007 kb/s
    Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Audio
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 19864 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 60k tbc (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Video
Output #0, mp4, to 'trimmed.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    encoder         : Lavf58.31.101
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 19864 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 30k tbc (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Video
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 2019-07-18T19:40:35.000000Z
      handler_name    : Core Media Audio
Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 6271 fps=2425 q=-1.0 Lsize=  523124kB time=00:03:29.93 bitrate=20412.9kbits/s speed=81.2x
video:519589kB audio:3357kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.034075%

Respuesta1

Cuando cortas un vídeo con copia de flujo de bits ( -c copy), no puedes cortar en marcas de tiempo arbitrarias. Un vídeo sólo se puede cortar en fotogramas clave (intra fotogramas o fotogramas I), ya que estos fotogramas no requieren que otros fotogramas estén presentes en el flujo de bits para poder ser decodificados.

Lo que hará ffmpeg es seguir incluyendo todos los fotogramas necesarios para que el fotograma en el punto especificado (7,2 s) sea decodificable. Esto significa que tu video cortadopodríacontener tantos fotogramas como el original. Sin embargo, ffmpeg asignará a estos fotogramas una marca de tiempo negativa para que no se muestren; aunque no todos los jugadores respetan eso. Esto puede provocar problemas de sincronización A/V.

De cualquier manera, el único método para lograr una precisión total aquí es volver a codificar el video, como mostró en su segundo comando. La única forma de acelerar esto es usar una CPU más rápida, usar un codificador de GPU más rápido (por ejemplo, NVENC si tiene una GPU NVIDIA compatible) o permitir que el codificador deshabilite algunas funciones, lo que hará que el archivo de salida sea un poco más grande ( la codificación será menos eficiente). Ver elguía de codificación H.264para más información. Ejemplo:

ffmpeg -ss 7.3 -i myVideo.mp4 -c:v libx264 -preset faster -c:a aac trimmed.mp4

El -presetvalor se puede establecer en otros ajustes preestablecidos según la paciencia que tenga para codificar.

información relacionada