Deseo dividir un video avi grande en dos videos consecutivos más pequeños. Estoy usando ffmpeg.
Una forma es ejecutar ffmpeg dos veces:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Pero de acuerdo con la página de manual de ffmpeg, puedo hacer más de un archivo de salida a partir de un archivo de entrada usando solo una línea:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi \
-vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Mi pregunta es, ¿el enfoque posterior ahorra tiempo de cálculo y memoria?
htop
) y nos dice cuál es la respuesta?-ss
como opción de entrada en la segunda división podría no ser exacto, por lo que es posible que no obtenga una división limpia. En mi opinión, el ejemplo de OP es más correcto.Respuestas:
El wiki de ffmpeg enlaza con esta página en referencia a "Cómo dividir videos de manera eficiente". No estoy convencido de que esta página responda a esa pregunta, así que hice lo que sugirió @AlcubierreDrive ...
Qué salidas ...
Probé un archivo SD y HD, después de algunas ejecuciones y un poco de matemáticas.
Archivo SD = flujo de transporte DVB de 1,35 GB
Archivo HD = flujo de transporte DVB de 3,14 GB
Conclusión
El comando único es mejor si está manejando HD, está de acuerdo con los comentarios del manual sobre el uso de -ss después del archivo de entrada para hacer una 'búsqueda lenta'. Los archivos SD tienen una diferencia insignificante.
La versión de dos comandos debería ser más rápida agregando otro -ss antes del archivo de entrada para una 'búsqueda rápida' seguida de una búsqueda lenta más precisa.
fuente
-q:v 0
.Aquí hay un guión útil que le ayuda a dividir automáticamente: Un guión para dividir videos usando ffmpeg
fuente
En mi experiencia, no use ffmpeg para dividir / unir. MP4Box, es más rápido y ligero que ffmpeg. Por favor pruebalo. Por ejemplo, si desea dividir un archivo MP4 de 1400 MB en dos partes, un archivo de 700 MB, puede usar el siguiente cmdl:
MP4Box -splits 716800 input.mp4
por ejemplo, para concatenar dos archivos, puede usar:O si necesita dividir por tiempo, use
-splitx StartTime:EndTime
:MP4Box -add input.mp4 -splitx 0:15 -new split.mp4
fuente
EndTime
que-t
.http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg también puede serle útil. Además, ffmpeg tiene un muxer de segmento que podría funcionar.
De todos modos, mi conjetura es que combinarlos en un comando ahorraría tiempo.
fuente
No hay una gran diferencia entre los dos ejemplos que proporcionó. El primer ejemplo corta el video de forma secuencial, en 2 pasos, mientras que el segundo ejemplo lo hace al mismo tiempo (usando hilos). No se notará ninguna aceleración en particular. Puede leer más sobre la creación de múltiples salidas con FFmpeg
Además, lo que puede usar (en FFmpeg reciente) es el muxer segmentador de flujo que puede:
fuente
Aquí hay un simple archivo bat de Windows para dividir el archivo entrante en 50 partes. Cada parte tiene una duración de 1 minuto. Perdón por un guión tan tonto. Espero que sea mejor tener un script de Windows tonto en lugar de no tenerlo en absoluto. Quizás ayude a alguien. (Basado en "archivo bat para bucle" de este sitio).
fuente
ffmpeg
comandos consecutivos ) reescrito como un bucle. Esto no responde a la pregunta de si ese enfoque o un solo comando "ahorrará tiempo de cálculo y memoria".No lo probé, pero esto parece prometedor:
Segmentador de flujo básico
Obviamente, está dividiendo AVI en segmentos del mismo tamaño, lo que implica que estos fragmentos no pierden calidad ni aumentan la memoria o deben recalcularse.
También usa la copia del códec, ¿eso significa que puede manejar flujos muy grandes? Debido a que este es mi problema, quiero descomponer mi avi para poder usar un filtro para deshacerme de la distorsión. Pero todo un avi funciona durante horas.
fuente
Esta es una forma perfecta de dividir el video. Lo he hecho anteriormente y me está funcionando bien.
ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4
(Para cmd).shell_exec('ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4')
(para php).Siga esto y estoy seguro de que funcionará perfectamente.
fuente
-i
seguido de-ss
y-t
. Sin embargo, la pregunta es cómo extraer de manera eficiente varios segmentos del mismo archivo de entrada, mientras que solo extrae un solo segmento. No veo cómo esto responde a la pregunta.una forma sencilla es utilizar la opción de recorte con la API basada en URL de publitio .
una vez que haya subido su video, simplemente configure el desplazamiento de inicio y el desplazamiento final en la url (so_2, eo_2) así:
esto creará instantáneamente nuevos videos a partir del segundo segundo y 2 segundos de duración. puedes dividir videos de esta manera como quieras.
fuente
ffmpeg
. A menos que tenga una conexión a Internet realmente rápida, creo que tener que cargar el video completo en un servicio en la nube y luego descargar los resultados aumentará significativamente el tiempo de procesamiento. Aún así, esto todavía no responde a la cuestión de qué enfoque con elffmpeg
que es más eficiente.