Quiero fusionar videos en lotes de veinte (20) cada uno. Estoy ejecutando una máquina Linux. Los videos están en formato mp4 y calidad moderada. Algunos incluso tienen la secuencia de audio que falta. Hasta ahora he intentado ffmpeg
, mencoder
, cvlc/vlc
y MP4Box
. Quiero escribir un script de línea de comando para lograr esto, ya que estoy haciendo un procesamiento por lotes.
El problema principal es que algunas de las soluciones que probé funcionan bien para dos videos, algunas funcionan bien para videos con transmisión de audio y otras funcionan bien para algún otro subconjunto de mi conjunto de videos. Sin embargo, no he podido encontrar una solución integral para esta tarea.
ffmpeg
, incluidos filtros y protocolos de archivo. También intenté usar laconcat
función decvlc/vlc
. También probé laconcat
función demencoder
. Todo esto funcionó parcialmente. Esto finalmente me ayudó a resolver el asunto.melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Respuestas:
Estoy usando
mkvmerge
para unir múltiples archivos MP4 en uno solo:fuente
.mkv
para el archivo de salida, ya que es un contenedor Matroska independientemente de la extensión que le dé.mkvmerge
: tipsonubuntu.comPuedes hacerlo usando
ffmpeg
:referencia y más información
fuente
Esto resolvió el problema: https://stackoverflow.com/a/22324018/5014767
melt
es una gran utilidad de línea de comando para esto. Aqui esta la paginaEditar de comentarios: el comando que resolvió mi problema fue este
melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
fuente
Escribí un pequeño script de shell para concatenar MP4s sin transcodificar usando ffmpeg.
Esto crea archivos intermedios en un contenedor MPEG y luego los concatena en un MP4.
fuente
for f in *.MP4
sin usarls
. (Siempre debe evitar el usols
en scripts por un par de razones importantes; hay mejores opciones). Además, use comillas para las variables a menos que esté seguro de que no hay espacios u otros caracteres especiales, por lo que"${f}"
(o simplemente"$f"
) en lugar de sin comillas$f
.CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
no funciona bien con nombres de archivo que son 1, 2, 3 ... 10 ... 20. Termina analizándolos como 1, 10 ... 2, 20 ... etc. Sugiero queCONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")
esto garantizará el orden .Cree un archivo files.txt con todos los archivos que desea concatenar en la siguiente forma (se ignoran las líneas que comienzan con un #):
Tenga en cuenta que estos pueden ser caminos relativos o absolutos. Luego puede transmitir, copiar o volver a codificar sus archivos:
fuente
Mi guión, puramente en
bash
yffmpeg
. Vuelve a codificar los archivos dados en una línea de comando en uno.Requiere que los archivos tengan la misma resolución. Acepta diferentes rotaciones de metadatos, que
ffmpeg concat:
no lo hacen.fuente
Creé un script de Python que, usando moviepy , puede concatenar también subsegmentos (útil si desea, por ejemplo, eliminar algunas partes de un video).
Úselo con:
fuente
Además de la respuesta de Maythux, de :
Es decir, los videos que se van a concatenar usan uno de los contenedores de video mencionados anteriormente (al que agregaré MPEG-4 Parte 14 para una experiencia personal), simplemente podría:
fuente