Estoy tratando de eliminar algunas secciones de un video usando FFmpeg.
Por ejemplo, imagina si grabaste un programa en televisión y quisiste recortar los comerciales. Esto es simple con un editor de video GUI; solo marca el comienzo y el final de cada clip que se va a eliminar y selecciona eliminar. Estoy tratando de hacer lo mismo desde la línea de comandos con FFmpeg.
Sé cómo cortar un solo segmento a un nuevo video así:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
Esto corta un clip de cinco segundos y lo guarda como un nuevo archivo de video, pero ¿cómo puedo hacer lo contrario y guardar todo el video sin el clip especificado, y cómo puedo especificar que se eliminen varios clips?
Por ejemplo, si mi video pudiera estar representado por ABCDEFG, me gustaría crear uno nuevo que consistiría en ACDFG.
fuente
Respuestas:
Bueno, todavía puedes usar el
trim
filtro para eso. Aquí hay un ejemplo, supongamos que desea cortar segmentos 30-40 segundos (10 segundos) y 50-80 segundos (30 segundos):¿Qué hice aquí? Recorté primero 30 segundos, 40-50 segundos y 80 segundos para finalizar, y luego los combiné en la corriente
out1
con elconcat
filtro.Acerca de los ajustes: necesitamos esto porque el recorte no modifica el tiempo de visualización de la imagen, y cuando cortamos el contador del decodificador de 10 segundos no ve ningún marco para estos 10 segundos.
Si también desea tener audio, debe hacer lo mismo para las transmisiones de audio. Entonces el comando debería ser:
fuente
Nunca puedo lograr que funcione la solución de ptQa, principalmente porque nunca puedo entender qué significan los errores de los filtros o cómo solucionarlos. Mi solución parece un poco más complicada porque puede dejar un desorden, pero si la está agregando a un script, la limpieza puede automatizarse. También me gusta este enfoque porque si algo sale mal en el paso 4, terminas con los pasos 1-3 completos, por lo que la recuperación de errores es un poco más eficiente.
La estrategia básica es usar
-t
y-ss
obtener videos de cada segmento que desee, luego juntar todas las partes para su versión final.Digamos que tiene 6 segmentos ABCDEF cada 5 segundos de duración y desea A (0-5 segundos), C (10-15 segundos) y E (20-25 segundos) haría esto:
o
Eso hará que los archivos a.tvshow, c.tvshow y e.tvshow. El
-t
dice la duración de cada clip es, por lo que si c es de 30 segundos de duración que podría pasar en 30 o 0:00:30. La-ss
opción dice qué tan lejos saltar al video fuente, por lo que siempre es relativo al inicio del archivo.Luego, una vez que tienes un montón de archivos de video, hago un archivo
ace-files.txt
como este:Tenga en cuenta el "archivo" al principio y el nombre del archivo escapado después de eso.
Entonces el comando:
Eso concatena todos los archivos
abe-files.txt
juntos, copiando sus códecs de audio y video y crea un archivoace.tvshow
que debería ser solo las secciones a, c y e. A continuación, sólo recuerde que debe eliminarace-files.txt
,a.tvshow
,c.tvshow
ye.tvshow
.Descargo de responsabilidad : no tengo idea de cuán (in) eficiente es esto en comparación con los otros enfoques en términos de
ffmpeg
pero para mis propósitos funciona mejor. Espero que ayude a alguien.fuente
ace-files.txt
en su ejemplo) con:ffmpeg -f concat -i <(printf "file '%s'\n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
-safe 0
al comando ffmpeg si usa rutas de archivo absolutas, para que esto funcione. Alternativamente, puede eliminar la$(pwd)/
parte del subcomando bash.Hice un guión para acelerar la edición de TV grabada. El script le pide los tiempos de inicio y finalización de los segmentos que desea conservar y los divide en archivos. Te da opciones, puedes:
Video de ella en acción: aquí
Déjame saber lo que piensas.
fuente
safe=0
, es decir,ffmpeg -f concat -safe 0 -i ...
ver ffmpeg.org/ffmpeg-all.html#Options-36Aunque la respuesta proporcionada por ptQa parece funcionar, he desarrollado otra solución que ha demostrado funcionar bien.
Esencialmente, lo que hago es cortar un video para cada parte del video original que quiero incluir en mi resultado. Más tarde, los concateno con el Concat Demuxer explicado aquí .
La solución es la misma que probé primero y presenté problemas de sincronización. Lo que he agregado es el comando -avoid_negative_ts 1 al generar los diferentes videos. Con esta solución, los problemas de sincronización desaparecen.
fuente
Para aquellos que tienen problemas para seguir el enfoque de ptQa, hay una forma un poco más simplificada de hacerlo. En lugar de concat cada paso del camino, solo hazlos todos al final.
Para cada entrada, defina un par de A / V:
Defina tantos pares como necesite, luego conéctelos todos en una sola pasada, donde n = recuento total de entradas.
Esto se puede construir fácilmente en un bucle.
Un comando completo que usa 2 entradas podría verse así:
fuente