
Estou no Arch Linux 4.13.10 e gostaria de combinar vários .MOV
arquivos capturados com uma câmera Canon EOS.
Tentei converter os arquivos em streams de transporte ( .ts
arquivos) 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 .mp4
conversã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 .MOV
arquivo, 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 0
para 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 .mp4
arquivos, veja minha outra resposta aqui:Stack Overflow: Como concatenar dois arquivos MP4 usando FFmpeg?
Para combinar muitos .mov
ou .MOV
arquivos 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 -1
mostrar que você tem estes arquivos:REC_0009.MOV REC_0010.MOV REC_0011.MOV
Então o
find
comando produzirá estefiles.txt
arquivo: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.mov
ou.MOV
ou qualquer outra combinação de letras maiúsculas.Se você esquecer
-safe 0
offmpeg
comando 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 0
opção dizffmpeg
para ignorar este erro e aceitar diretórios "inseguros" nos caminhos de arquivos.@Matthias Braun menciona isso aqui.
Da
ffmpeg
página de manualOnline somente(nãonaman ffmpeg
pá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 a1
se o formato foi testado automaticamente e0
caso contrário.A
-c copy
opção dizffmpeg
para 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
- estudeiA resposta de @Matthias Braun também.
- Minha resposta aqui onde uso
\x27
para produzir o'
personagem:Stack Overflow: Como escapar de aspas simples em strings entre aspas simples - Conversei bastante com o GitHub Copilot AI em meu editor de texto VSCode enquanto descobria as nuances dos comandos acima.
- Minha resposta para arquivos MP4:Stack Overflow: Como concatenar dois arquivos MP4 usando FFmpeg?