Comandos mais curtos

Comandos mais curtos

Estou no Arch Linux 4.13.10 e gostaria de combinar vários .MOVarquivos capturados com uma câmera Canon EOS.

Tentei converter os arquivos em streams de transporte ( .tsarquivos) usando FFmpeg, conforme mostradoaqui, mas faltava som no arquivo resultante.

Eu preferiria que o arquivo resultante fosse .mp4, mas isso não é estritamente necessário.

Como eu faço isso?

Responder1

Consegui mesclar os arquivos usandoRecurso de desmultiplexação do FFmpeg. Para .mp4conversão, tive que converter explicitamente o fluxo de áudio para evitar este erro:

Não foi possível encontrar a tag do codec pcm_s16le no stream nº 1, o codec não é compatível no momento no contêiner

Este é o comando que combina os arquivos para merged.mp4:

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

Se o arquivo de saída também puder ser um .MOVarquivo, o comando será:

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

Aqui está o conteúdo do arquivo de texto files_to_combine.txt:

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

Se você receber o erro

Nome de arquivo inseguro 'arquivo com espaços.mov' files_to_combine.txt: Operação não permitida

e confiar nos nomes dos arquivos, você pode adicionar -safe 0para contornar esse erro. Veja o FFmpegpágina de manual:

ffmpeg -safe 0 -f concat ...

Comandos mais curtos

Tentando a mesma tarefa cinco anos depois, também tive sucesso com

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

e

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

Responder2

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

Responder3

Se você estiver procurando como concatenar .mp4arquivos, veja minha outra resposta aqui:Stack Overflow: Como concatenar dois arquivos MP4 usando FFmpeg?

Para combinar muitos .movou .MOVarquivos em um

... aqui está o que você precisa fazer:

# 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

Geralmente estou numa situação em que posso usar a primeira opção, que levasegundosem vez dehoras, o que é ótimo!

Detalhes extras e explicação

  • Se ls -1mostrar que você tem estes arquivos:

    REC_0009.MOV
    REC_0010.MOV
    REC_0011.MOV
    

    Então o findcomando produzirá este files.txtarquivo:

    file './REC_0009.MOV'
    file './REC_0010.MOV'
    file './REC_0011.MOV'
    
  • A -iname "*.mov"parte faz um caso-emcorrespondência sensiva* para todos os arquivos que terminam em .movou .MOVou qualquer outra combinação de letras maiúsculas.

  • Se você esquecer -safe 0o ffmpegcomando e qualquer um dos seus nomes de arquivo tiver um "diretório" na forma de ./par, você receberá um erro como este:

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

    A -safe 0opção diz ffmpegpara ignorar este erro e aceitar diretórios "inseguros" nos caminhos de arquivos.

    @Matthias Braun menciona isso aqui.

    Da ffmpegpágina de manualOnline somente(nãona man ffmpegpágina de manual localmente no meu computador Linux Ubuntu 20.04):https://manpages.org/ffmpeg:

    safe

    Se definido como 1, rejeita caminhos de arquivos não seguros. Um caminho de arquivo é considerado seguro se não contém uma especificação de protocolo e é relativo e todos os componentes contêm apenas caracteres do conjunto de caracteres portáteis (letras, dígitos, ponto, sublinhado e hífen) e não possuem ponto final no início de um componente.

    Se definido como 0, qualquer nome de arquivo será aceito.

    O padrão é 1.

    -1é equivalente a 1se o formato foi testado automaticamente e 0caso contrário.

  • A -c copyopção diz ffmpegpara usar o codec “copiar”, o que significa que não irá recodificar o vídeo. Isto é o que torna tudo tão rápido.

Referências

  1. estudeiA resposta de @Matthias Braun também.
  2. Minha resposta aqui onde uso \x27para produzir o 'personagem:Stack Overflow: Como escapar de aspas simples em strings entre aspas simples
  3. Conversei bastante com o GitHub Copilot AI em meu editor de texto VSCode enquanto descobria as nuances dos comandos acima.
  4. Minha resposta para arquivos MP4:Stack Overflow: Como concatenar dois arquivos MP4 usando FFmpeg?

informação relacionada