tamaño - unir videos ffmpeg
FFmpeg: ¿Cómo dividir video de manera eficiente? (9)
¿El enfoque posterior ahorra tiempo de cálculo y memoria?
No existe una gran diferencia entre esos dos ejemplos que proporcionó. El primer ejemplo corta el video secuencialmente, en 2 pasos, mientras que el segundo ejemplo lo hace al mismo tiempo (usando hilos). No se notará una aceleración particular. Puede leer más sobre cómo crear múltiples salidas con FFmpeg
Además, lo que puedes usar (en FFmpeg reciente) es el ffmpeg.org/… que puede:
salidas de flujo a una cantidad de archivos separados de duración casi fija. El patrón del nombre de archivo de salida se puede configurar de manera similar a image2 .
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 desde 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?
Aquí hay un archivo simple de Windows bat para dividir el archivo entrante en 50 partes. Cada parte tiene una duración de 1 minuto. Perdón por ese guion tonto. Espero que sea mejor tener un script de Windows tonto en lugar de no tenerlo en absoluto. Tal vez ayude a alguien. (Basado en "bat file for loop" desde este sitio).
set var=0
@echo off
:start
set lz=
if %var% EQU 50 goto end
if %var% LEQ 9 set lz=0
echo part %lz%%var%
ffmpeg -ss 00:%lz%%var%:00 -t 00:01:00 -i %1 -acodec copy -vcodec copy %2_%lz%%var%.mp4
set /a var+=1
goto start
:end
echo var has reached %var%.
exit
Aquí hay un script útil, te ayuda a dividir automáticamente: Un script para dividir videos usando ffmpeg
#!/bin/bash
# Written by Alexis Bezverkhyy <[email protected]> in 2011
# This is free and unencumbered software released into the public domain.
# For more information, please refer to <http://unlicense.org/>
function usage {
echo "Usage : ffsplit.sh input.file chunk-duration [output-filename-format]"
echo -e "/t - input file may be any kind of file reconginzed by ffmpeg"
echo -e "/t - chunk duration must be in seconds"
echo -e "/t - output filename format must be printf-like, for example myvideo-part-%04d.avi"
echo -e "/t - if no output filename format is given, it will be computed/
automatically from input filename"
}
IN_FILE="$1"
OUT_FILE_FORMAT="$3"
typeset -i CHUNK_LEN
CHUNK_LEN="$2"
DURATION_HMS=$(ffmpeg -i "$IN_FILE" 2>&1 | grep Duration | cut -f 4 -d '' '')
DURATION_H=$(echo "$DURATION_HMS" | cut -d '':'' -f 1)
DURATION_M=$(echo "$DURATION_HMS" | cut -d '':'' -f 2)
DURATION_S=$(echo "$DURATION_HMS" | cut -d '':'' -f 3 | cut -d ''.'' -f 1)
let "DURATION = ( DURATION_H * 60 + DURATION_M ) * 60 + DURATION_S"
if [ "$DURATION" = ''0'' ] ; then
echo "Invalid input video"
usage
exit 1
fi
if [ "$CHUNK_LEN" = "0" ] ; then
echo "Invalid chunk size"
usage
exit 2
fi
if [ -z "$OUT_FILE_FORMAT" ] ; then
FILE_EXT=$(echo "$IN_FILE" | sed ''s/^.*/./([a-zA-Z0-9]/+/)$//1/'')
FILE_NAME=$(echo "$IN_FILE" | sed ''s/^/(.*/)/.[a-zA-Z0-9]/+$//1/'')
OUT_FILE_FORMAT="${FILE_NAME}-%03d.${FILE_EXT}"
echo "Using default output file format : $OUT_FILE_FORMAT"
fi
N=''1''
OFFSET=''0''
let ''N_FILES = DURATION / CHUNK_LEN + 1''
while [ "$OFFSET" -lt "$DURATION" ] ; do
OUT_FILE=$(printf "$OUT_FILE_FORMAT" "$N")
echo "writing $OUT_FILE ($N/$N_FILES)..."
ffmpeg -i "$IN_FILE" -vcodec copy -acodec copy -ss "$OFFSET" -t "$CHUNK_LEN" "$OUT_FILE"
let "N = N + 1"
let "OFFSET = OFFSET + CHUNK_LEN"
done
El wiki de ffmpeg enlaza a esta página en referencia a "Cómo dividir video de manera eficiente". No estoy seguro de que esta página responda esa pregunta, así que hice lo que @AlcubierreDrive sugirió ...
echo "Two commands"
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 -sn test1.mkv
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:30:00 -t 01:00:00 -sn test2.mkv
echo "One command"
time ffmpeg -v quiet -y -i input.ts -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 /
-sn test3.mkv -vcodec copy -acodec copy -ss 00:30:00 -t 01:00:00 -sn test4.mkv
Qué salidas ...
Two commands
real 0m16.201s
user 0m1.830s
sys 0m1.301s
real 0m43.621s
user 0m4.943s
sys 0m2.908s
One command
real 0m59.410s
user 0m5.577s
sys 0m3.939s
Probé un archivo SD y HD, después de algunas ejecuciones y un poco de matemáticas.
Two commands SD 0m53.94 #2 wins
One command SD 0m49.63
Two commands SD 0m55.00
One command SD 0m52.26 #1 wins
Two commands SD 0m58.60 #2 wins
One command SD 0m58.61
Two commands SD 0m54.60
One command SD 0m50.51 #1 wins
Two commands SD 0m53.94
One command SD 0m49.63 #1 wins
Two commands SD 0m55.00
One command SD 0m52.26 #1 wins
Two commands SD 0m58.71
One command SD 0m58.61 #1 wins
Two commands SD 0m54.63
One command SD 0m50.51 #1 wins
Two commands SD 1m6.67s #2 wins
One command SD 1m20.18
Two commands SD 1m7.67
One command SD 1m6.72 #1 wins
Two commands SD 1m4.92
One command SD 1m2.24 #1 wins
Two commands SD 1m1.73
One command SD 0m59.72 #1 wins
Two commands HD 4m23.20
One command HD 3m40.02 #1 wins
Two commands SD 1m1.30
One command SD 0m59.59 #1 wins
Two commands HD 3m47.89
One command HD 3m29.59 #1 wins
Two commands SD 0m59.82
One command SD 0m59.41 #1 wins
Two commands HD 3m51.18
One command HD 3m30.79 #1 wins
Archivo SD = secuencia de transporte DVB de 1.35GB
Archivo HD = 3.14GB secuencia de transporte DVB
Conclusión
El único comando es mejor si está manejando HD, está de acuerdo con los comentarios de los manuales 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 al agregar otro -ss antes del archivo de entrada para la ''búsqueda rápida'' seguida de la búsqueda lenta más precisa.
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 1400mb en dos partes de 700mb, puede usar el siguiente cmdl: MP4Box -splits 716800 input.mp4
por ejemplo, para concatenar dos archivos que puede usar:
MP4Box -cat file1.mp4 -cat file2.mp4 output.mp4
No lo probé, pero parece prometedor:
Obviamente, está dividiendo AVI en segmentos del mismo tamaño, lo que implica que estos fragmentos no pierden calidad o aumentan la memoria o deben volverse a calcular.
También utiliza 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 eliminar la distorsión. Pero un avi completo funciona durante horas.
Resulta que el tamaño del archivo en el caso posterior sería proporcionalmente equivalente al segmento de tiempo.
Una forma simple es usar la opción de ajuste con la API pública basada en publ .
una vez que haya subido su video, simplemente configure el desplazamiento inicial y el desplazamiento final en la url (so_2, eo_2) de la siguiente manera:
https://media.publit.io/file/so_2,eo_2/tummy.mp4
esto creará instantáneamente nuevos videos comenzando desde el segundo segundo y 2 segundos de duración. puedes dividir videos de esta manera de todos modos.
http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg también puede ser útil para usted. También ffmpeg tiene un muxer de segmento que podría funcionar.
De todos modos, creo que combinarlos en un comando ahorraría tiempo.