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".
Respuestas:
Demuxer Concat
Esto le permite repetir una entrada sin necesidad de volver a codificar.
Haz un archivo de texto. Contenido de un archivo de texto de ejemplo para repetir 4 veces.
Luego corre
ffmpeg
:Para usuarios de Linux
Este ejemplo es el mismo que el anterior, pero no tiene que realizarlo manualmente
list.txt
:Con los shells modernos más utilizados, incluso puede evitar la creación del
list.txt
archivo por completo. Por ejemplo, con bash: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:
loop=3:75:25
loop=3
bucle 4 veces.-1
.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ónVea 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_loop
en el siguiente comando.-loop
opciónLa
-loop
opció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 30
limitará la duración de la salida a 30 segundos:O para repetir una salida GIF:
fuente
> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
-stream_loop
sección apunta al mismo boleto que el primero ...Al menos en FFmpeg 2.8.x (pero oldie también debería funcionar) puede usarlo
lavfi
como formato de entrada y gráfico de filtro complejo usandomovie
ysetpts
filtros como argumento para la-i
opción.Siguiente comando que hace este trabajo por ti:
Cero
loop=
argumentos significa bucle infinito. Valores mayores cero establece recuentos repetidos.setpts
filtros 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: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:
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:
Y use el siguiente comando para componer el archivo infinito:
(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.
fuente
-c copy
. Respuesta arreglada.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:
Este comando no terminará solo, y el archivo de salida crecerá infinitamente.
fuente
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.
fuente