Comandos más cortos

Comandos más cortos

Estoy en Arch Linux 4.13.10 y me gustaría combinar varios .MOVarchivos tomados con una cámara Canon EOS.

Intenté convertir los archivos en transmisiones de transporte ( .tsarchivos) usando FFmpeg, como se muestraaquí, pero faltaba sonido en el archivo resultante.

Preferiría que el archivo resultante fuera .mp4, pero esto no es estrictamente necesario.

¿Cómo hago esto?

Respuesta1

Logré fusionar los archivos usandoFunción de demultiplexación de FFmpeg. Para .mp4la conversión, tuve que convertir explícitamente la transmisión de audio para evitar este error:

No se pudo encontrar la etiqueta para el códec pcm_s16le en la secuencia n.º 1; el códec no es compatible actualmente con el contenedor

Este es el comando que combina los archivos para merged.mp4:

ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec aac -strict -2 -b:a 384k merged.mp4

Si el archivo de salida también puede ser un .MOVarchivo, el comando es:

ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec copy merged.MOV

Aquí está el contenido del archivo de texto files_to_combine.txt:

file ./first_file.MOV
file ./second_file.MOV

Si recibe el error

Nombre de archivo inseguro 'archivo con espacios.mov' files_to_combine.txt: operación no permitida

y confíe en los nombres de los archivos, puede agregarlos -safe 0para solucionar este error. Ver FFmpegpágina de manual:

ffmpeg -safe 0 -f concat ...

Comandos más cortos

Al intentar la misma tarea cinco años después, también tuve éxito con

ffmpeg -f concat -i files_to_combine.txt merged.mov

y

ffmpeg -f concat -i files_to_combine.txt -f mp4 merged.mp4

Respuesta2

find *.MOV | sed 's:\ :\\\ :g'| sed 's/^/file /' > fl.txt; ffmpeg -f concat -i fl.txt -c copy output.mp4; rm fl.txt

Respuesta3

Si está buscando cómo concatenar .mp4archivos, consulte mi otra respuesta aquí:Desbordamiento de pila: ¿Cómo concatenar dos archivos MP4 usando FFmpeg?

Para combinar muchos archivos .movo .MOVen uno

...esto es lo que debes hacer:

# 0. Copy all .mov files that (you'd like to combine) into a single directory. 
# Then `cd` into that directory. 

# 1. Create a "files.txt" file containing a list of files to combine
find . -type f -iname "*.mov" | sort -V \
    | awk '{print "file \x27" $0 "\x27"}' > files.txt

# [WHAT I USUALLY USE: FAST]
# 2. **If all of your .mov files have the same encoding** (ex: they were 
# all recorded on the same video camera and with the same settings), you can
# specify to use the "copy" codec via `-c copy`, which means it will NOT 
# have to re-encode the video. This just concatenates all the files together. 
# THIS TAKES **SECONDS**. 
time ffmpeg -f concat -safe 0 -i files.txt -c copy merged.mov 

# [SLOW; SOMETIMES NECESSARY]
# OR 2. **If each of your .mov files has a different encoding,** you'll need to 
# re-encode them all into a single stream. 
# - This uses the "files.txt" file created above, and outputs the merged 
#   file into "merged.mov". 
# THIS COULD TAKE **HOURS**. 
time ffmpeg -f concat -safe 0 -i files.txt merged.mov

Generalmente estoy en una situación en la que puedo usar la primera opción, que requieresegundosen lugar dehoras, ¡Lo cual es genial!

Detalles adicionales y explicación.

  • Si ls -1muestra que tiene estos archivos:

    REC_0009.MOV
    REC_0010.MOV
    REC_0011.MOV
    

    Entonces el findcomando producirá este files.txtarchivo:

    file './REC_0009.MOV'
    file './REC_0010.MOV'
    file './REC_0011.MOV'
    
  • La -iname "*.mov"parte hace un caso-encoincidencia sensible* para todos los archivos que terminan en .movo .MOV, o cualquier otra combinación de letras mayúsculas.

  • Si olvida -safe 0el ffmpegcomando y alguno de sus nombres de archivo tiene un "directorio" en forma de ./par, obtendrá un error como este:

    [concat @ 0x555a24968700] Unsafe file name './REC_0009.MOV'
    files.txt: Operation not permitted
    

    La -safe 0opción indica ffmpegque se ignore este error y se acepten directorios "inseguros" en las rutas de archivos.

    @Matthias Braun menciona eso aquí.

    Desde la ffmpegpágina de manualsolo online(noen la man ffmpegpágina de manual localmente en mi computadora Linux Ubuntu 20.04):https://manpages.org/ffmpeg:

    safe

    Si se establece en 1, rechaza las rutas de archivos no seguras. Una ruta de archivo se considera segura si no contiene una especificación de protocolo y es relativa y todos los componentes solo contienen caracteres del juego de caracteres portátil (letras, dígitos, punto, guión bajo y guión) y no tienen punto al comienzo de un componente.

    Si se establece en 0, se acepta cualquier nombre de archivo.

    El valor predeterminado es 1.

    -1es equivalente a 1si el formato fue sondeado automáticamente y 0en caso contrario.

  • La -c copyopción indica ffmpegque se utilice el códec "copiar", lo que significa que no volverá a codificar el vídeo. Esto es lo que lo hace tan rápido.

Referencias

  1. estudiéLa respuesta de @Matthias Braun también.
  2. Mi respuesta aquí donde uso \x27para producir el 'personaje:Desbordamiento de pila: cómo escapar de comillas simples dentro de cadenas entre comillas simples
  3. Tuve muchas conversaciones con GitHub Copilot AI en mi editor de texto VSCode mientras descubría los matices de los comandos anteriores.
  4. Mi respuesta para archivos MP4:Desbordamiento de pila: ¿Cómo concatenar dos archivos MP4 usando FFmpeg?

información relacionada