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/vlcy 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 laconcatfunción decvlc/vlc. También probé laconcatfunción demencoder. Todo esto funcionó parcialmente. Esto finalmente me ayudó a resolver el asunto.melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264Respuestas:
Estoy usando
mkvmergepara unir múltiples archivos MP4 en uno solo:fuente
.mkvpara 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
meltes 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=libx264fuente
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 *.MP4sin usarls. (Siempre debe evitar el usolsen 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
bashyffmpeg. 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