FFmpeg: ¿cómo ajustar la duración del video (clip) a la duración del sonido si el sonido es más largo, posible sin volver a codificarlo con un archivo mp3?

Tengo un problema. Grabé mis videos por separado y luego les agregué sonido. A veces, el sonido tiene una duración mayor o menor en comparación con la duración del video. Por lo general, el sonido es más largo, a veces alrededor de 20 segundos. Para mí, cuando ejecuto en mi PC a través de flv o algún reproductor de Windows Media, eso no es un problema, ya que después de que termina el video, la última captura de video permanece en pantalla (como una imagen), y el sonido aún se está ejecutando, y el video termina después del sonido. se acabó. Así que todo está bien en mi PC cuando lo ejecuto como un archivo .flv o .mp4. Pero, cuando lo cargo en Google Drive o en algún otro lugar en la web (es decir, cuando lo ejecuto en mi navegador para verlo después de cargarlo), veo que mi video se corta a la duración del video (por lo que mi sonido es cortado). Entiendo que esto se debe a los diferentes tamaños de duración de sonido y video.

Ahora necesito un comando con ffmpeg que pueda hacer que mi video se extienda a la duración de mi sonido. Me gustaría no volver a codificar mis videos con sonido (en el sentido de que necesitaría poner mi archivo mp3 en el comando ffmpeg) si no lo necesito (ya que tengo muchos videos y el sonido ya está insertado en ellos), pero solo para volver a codificar el video con algún comando ffmpeg para extender la duración del video a la duración del sonido.

He visto esto (no estoy seguro en este momento si esto me ayudaría): https://superuser.com/questions/801547/ffmpeg-add-audio-but-keep-video-length-the-same-not- más corto

Pero con este enfoque, primero debe volver a codificar el video con el archivo de sonido (mp3 o similar).

¿Se puede hacer, y cuál sería el mandato, o los mandatos para ello? (Y si la única forma es volver a codificarlo con un archivo mp3, ¿cuál sería el comando para ello?)

Editar: no quiero cortar mi sonido, necesito mantener el último cuadro hasta que termine mi sonido. Actualmente, el último cuadro se mantiene solo cuando lo veo en mi PC, cuando lo cargo, el clip se corta inmediatamente cuando se detiene el video.

Puede hacer una imagen fija del último cuadro, luego concatenarla con el video y repetirla hasta llegar al final del audio.
stib, lo entiendo, pero hacer imágenes fijas y concatenar es demasiado trabajo (especialmente si hay muchos videos). Es por eso que pregunto si hay una forma de ajustarlo de manera más elegante con ffmpeg.
Puedes hacerlo todo con ffmpeg, por lo que si hay muchos videos, podrías automatizarlo.
No puedo reproducir este comportamiento en Youtube. Los medios se reproducen hasta que finaliza la transmisión de audio.
stib, ¿algún ejemplo? Realmente investigué mucho, y no encuentro nada que me ayude. Mulvya, nunca mencioné YouTube, y mi sonido se graba por separado en estos videos. El sonido se agrega copiando directamente (sin recodificar). Si carga ese tipo de video con una duración de sonido diferente en Google Drive, por ejemplo, lo cortará. Creo que YouTube hará lo mismo, simplemente no has tenido un video con mi ejemplo.

Respuestas (1)

Puede hackear esto usando mp4fpsmod (enlace directo a Win binary; fuente de C++ en https://github.com/nu774/mp4fpsmod ).

El primer paso es extraer las marcas de tiempo del video existente

mp4fpsmod -p vid_tc.txt vid.mp4

Esto producirá un archivo de texto como este

# timecode format v2
0
40
80
120
... 
4880
4920
4960

Cada línea contiene la marca de tiempo del cuadro #N en milisegundos.

En este ejemplo, cada cuadro tiene una duración de 40 milisegundos y el último cuadro se muestra a los 4960 ms y, por lo tanto, la transmisión de video tiene una duración de 5 segundos.

Ahora suponga que su audio tiene una duración de 11,34 segundos == 11340 ms. Edite el último código de tiempo a algo justo debajo 11340, como 11320.

# timecode format v2
0
40
80
120
... 
4880
4920
11320

y luego corre

mp4fpsmod -x -T keep -t vid_tc.txt -o vid_new.mp4 vid.mp4

Esto creará un nuevo archivo vid_new.mp4, que puede cargar. La duración que se muestra en los reproductores o herramientas de escritorio puede ser incorrecta, pero la reproducción debe ser la deseada, excepto que el último cuadro se muestra junto con el final del audio. Esto salta la recodificación y es rápido. Puede agregar -iy omitir -o vid_new.mp4si desea editar el código de tiempo en el lugar en el archivo existente, es decir

mp4fpsmod -x -T keep -t vid_tc.txt -i vid.mp4

pero no lo recomiendo.

Gracias, lo intentaré. ¿Es posible que esto arruine la calidad del video de mi video ya que no es ffmpeg? Todo debería permanecer como estaba para mí: resolución, calidad, etc. Y segundo, si quiero eliminar el problema con la forma en que se muestra la duración en los reproductores de escritorio que mencionaste, ¿cuál sería la forma? ¿Recodificarlo con un archivo mp3? PD: encontré esto, pero aún no lo he probado, tal vez esto sería (respuesta correcta en este enlace) lo que estoy buscando si no quiero involucrar el archivo mp3 directamente: superuser.com/questions /871084/…
No hay recodificación, por lo que no hay cambio de calidad. La respuesta en SU ​​no ayudará si el audio es más largo.
Gracias Mulvia. Voy a probarlo. Solo una pregunta más: ha mencionado que debe configurarse en 11340 en el ejemplo. Lo configuró en 11320. ¿Podría funcionar correctamente si se configura solo en 11339? ¿Y qué pasaría si se establece, por ejemplo, en 9000? ¿Supongo que poner el número bajo podría arruinar el final?
Cualquier número justo por debajo de la duración del audio está bien. Entonces 11339 está bien. La idea es aumentar la duración, por lo 9000que no funcionará para una transmisión de audio de 11,34 segundos.
Todo bien. Y me preguntaba, ¿puede mp4fpmod obtener la longitud del archivo mp3 o solo funciona con archivos de video? Si ese es el caso, tendré que leerlo manualmente (realmente no hay problema) u obtener información precisa a través de ffmpeg stackoverflow.com/questions/10437750/…
mp4fpsmod solo mira transmisiones de video.
lo he probado No funciona en absoluto. Absolutamente nada de eso. Todo es igual después de la carga.
Comparte el archivo, si puedes.
Gracias por esta respuesta. El video resultante no se reproduce correctamente en mkv. Dupliqué la duración del video, pero mkv cree que el video es 3 veces más largo. Pero después de subirlo a Youtube, ¡funciona perfectamente!