Repetir / loop de entrada de video con ffmpeg?

52

Solo quiero reproducir un video mp4 con ffmpeg y mantener la configuración y el códec actuales.

Por ejemplo, si input.mp4 tiene una longitud de 0:10 y me gustaría repetirlo 4 veces, entonces output.mp4 tiene una longitud de 0:40, ¿cómo podría cambiar la siguiente línea de comando para hacerlo?

ffmpeg -i input.mp4 -c copy output.mp4

Lo intenté...

ffmpeg -loop 4 -i input.mp4 -c copy output.mp4

... pero aparece el error "Opción de bucle no encontrado".

Thomas King
fuente
Use quicktime 7 pro y mov container. Por lo tanto, no obtendrá un tamaño de archivo más grande que con OpenSource.
Дмитрий Мышков

Respuestas:

70

Demuxer Concat

Esto le permite repetir una entrada sin necesidad de volver a codificar.

  1. Haz un archivo de texto. Contenido de un archivo de texto de ejemplo para repetir 4 veces.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. Luego corre ffmpeg:

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Para usuarios de Linux

Este ejemplo es el mismo que el anterior, pero no tiene que realizarlo manualmente list.txt:

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

Con los shells modernos más utilizados, incluso puede evitar la creación del list.txtarchivo por completo. Por ejemplo, con bash:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

Ver también:


filtro de bucle

Ejemplo que usa el filtro de bucle para recorrer 4 veces, cada bucle tiene 75 fotogramas, cada bucle omite los primeros 25 fotogramas de la entrada:

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • O usa la taquigrafía: loop=3:75:25
  • El filtrado requiere una nueva codificación.
  • Este filtro coloca todos los cuadros en la memoria .
  • Usando loop=3bucle 4 veces.
  • Para bucle infinitamente uso -1.
  • Debe enumerar el número de fotogramas para realizar un bucle (se muestra como 75 en el ejemplo anterior). El valor máximo es 32767.
  • También vea ffmpeg -h filter=loop.

filtro de pelicula

El filtro de película tiene una opción de bucle. Vea la respuesta a continuación por Monah Tuk. El filtrado requiere una nueva codificación. Para audio use el filtro amovie.


-stream_loop opción

Vea la respuesta a continuación de Thingy y la respuesta de Gyan.

Tenga en cuenta que esta opción tenía errores (consulte los informes de errores # 5719 , # 6121 y # 7043 ), por lo que es posible que no funcione para compilaciones antiguas (algo anterior a 2018 06-27, incluida la rama de lanzamiento FFmpeg 4.0.x). Para los usuarios de compilaciones antiguas, como mencionó mulvya en el ticket # 6121, una solución es primero volver a mux a MKV o TS y luego usar -stream_loopen el siguiente comando.


-loop opción

La -loopopción es específica para el demuxer del archivo de imagen y el muxer gif , por lo que no se puede usar para archivos de video típicos, pero se puede usar para hacer un bucle infinito de una serie de imágenes de entrada. Este ejemplo se repetirá una y otra vez, pero -t 30limitará la duración de la salida a 30 segundos:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

O para repetir una salida GIF:

ffmpeg -i input -loop 3 output.gif
lema
fuente
¿Funciona bien con archivos mp4?
Thomas King
3
Me sale este error> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11
1
@jamesfzhang: creo que es porque necesitas una ruta absoluta al archivo (como se explica aquí: trac.ffmpeg.org/wiki/Concatenate ). Para cumplir eso, podría escribir: ffmpeg -safe 0 -f concat -i <(para i en {1..4}; do printf "archivo '$ PWD' / '% s' \ n" input.mp4; hecho ) -c copy output.mp4
Plenus Franckly
1
En cuanto a mí, esto funciona para repetir el video a tiempo completo sin saltarse las famas por 4 vecesffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
Vlad
Este problema tiene 4 años y nadie notó que el enlace al segundo tema en la -stream_loopsección apunta al mismo boleto que el primero ...
Leonid Usov
15

Al menos en FFmpeg 2.8.x (pero oldie también debería funcionar) puede usarlo lavficomo formato de entrada y gráfico de filtro complejo usando moviey setptsfiltros como argumento para la -iopción.

Siguiente comando que hace este trabajo por ti:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

Cero loop=argumentos significa bucle infinito. Valores mayores cero establece recuentos repetidos. setptsfiltros necesarios para el ajuste de PTS para la segunda y posteriores repeticiones, de lo contrario, la mayoría de los silenciadores de salida fallará con el aumento de PTS no monótono: el bucle no recupera PTS.

Tenga en cuenta que es imposible usar filtros suponiendo que omitir cuadros sin decodificación / codificación es imposible: por diseño, los filtros solo se ocupan de cuadros decodificados.

En el FFmpeg 2.8.2 nueva opción de entrada introducida -stream_loop. Primero veo que funciona más simple y permite copiar contenido sin transcodificar:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

Pero no recalcula PTS y el archivo de salida es incorrecto. Si agrega un filtro para corregir PTS (consulte setpts), también debe eliminarlo -c copy. Solo los filtros de flujo de bits pueden tratar con paquetes codificados, pero no hay filtros de flujo de bits para reparar PTS (consulte: https://ffmpeg.org/ffmpeg-bitstream-filters.html )

En cualquier caso, ffmpeg en la segunda pasada falla con error:

input.mp4: Resource temporarily unavailable

Solución conocida para mí : use el contenedor para el archivo de entrada sin límites de PTS (contenedor de transmisión). Uno de ellos, conocido, es MPEG-TS. Por lo tanto, puede convertir su archivo MP4 a MPEG-TS:

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

Y use el siguiente comando para componer el archivo infinito:

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(los filtros de flujo de bits deben usarse solo si es necesario, en mis muestras es obligatorio)

FFmpeg> = 2.8.2 se requiere en este caso.

Monah Tuk
fuente
1
Ejecutar ese comando me da un error: "[mp4 @ 00000000053fa1a0] No se pudo encontrar la etiqueta para el códec rawvideo en la secuencia # 0, el códec no se admite actualmente en el contenedor". Si agrego -vcodec h264 antes de la entrada, ese error desaparece, pero el codificador no sale. Proporcionar un recuento de bucle distinto de cero produce muchos errores, pero se cierra. El archivo no es una salida válida.
Gyan
1
La documentación de stream_loop dice "El bucle 0 significa sin bucle, el bucle -1 significa bucle infinito".
Gyan
Parece archivos de entrada incorrectos. ¿Podrías compartirlo? "El bucle 0 significa que no hay bucle, el bucle -1 significa bucle infinito". - Parece que veo documentos antiguos :-)
Monah Tuk
1
Olvidé: filtros asumiendo la transcodificación (decodificación / codificación). Por diseño. Entonces debes eliminar -c copy. Respuesta arreglada.
Monah Tuk
1
Es bueno saberlo, pero esa es una limitación importante si tiene un gran bucle para generar.
Gyan
14

Con ffmpeg 2.8.4, el siguiente comando crea output.mp4 que es una copia repetida de input.mp4 hasta que se detiene el proceso de ffmpeg:

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

Este comando no terminará solo, y el archivo de salida crecerá infinitamente.

Cosita
fuente
2
Parece ser el método más rápido
josef
2
El método más rápido es un eufemismo, este método aumenta hasta videos de varias horas en cuestión de segundos.
SleighBoy
Este es un gran método conveniente, porque no hay necesidad de crear un archivo con líneas repetidas.
Markus Zeller
-1

P: "... ¿cómo podría cambiar la siguiente línea de comando para hacer eso? Ffmpeg -i input.mp4 -c copy output.mp4"?

R: El método simple que evita problemas de qué comandos funcionan con qué versión es la 'solución trivial':

ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c copy output.mp4

Ver también: https://trac.ffmpeg.org/wiki/Concatenate para muchos ejemplos.

Robar
fuente
2
Esto no hace ninguna concatenación. Se debe usar al menos uno de los métodos concat: protocolo, filtro o demuxer. En este comando, la asignación automática de ffmpeg seleccionará un video, un audio y una secuencia de subtítulos entre las entradas. Como son idénticos, es equivalente al primer comando del OP.
Gyan
Gracias por probar que Mulvya, ya que difiere del comportamiento descrito en los Documentos: ffmpeg.org/ffmpeg.html#Description - Si hay similitud en los nombres de Archivo usando "-i -i /tmp/test%d.mp4" ( et. al) también es posible.
Rob