
Я использую Arch Linux 4.13.10 и хотел бы объединить несколько .MOV
файлов, снятых камерой Canon EOS.
Я попытался преобразовать файлы в транспортные потоки ( .ts
файлы) с помощью FFmpeg, как показаноздесь, но в полученном файле отсутствовал звук.
Я бы предпочел, чтобы результирующий файл был .mp4
, но это не строго обязательно.
Как мне это сделать?
решение1
Мне удалось объединить файлы с помощьюФункция демультиплексирования FFmpeg. Для .mp4
конвертации мне пришлось явно конвертировать аудиопоток, чтобы избежать этой ошибки:
Не удалось найти тег для кодека pcm_s16le в потоке №1, кодек в настоящее время не поддерживается в контейнере
Это команда, объединяющая файлы в merged.mp4
:
ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec aac -strict -2 -b:a 384k merged.mp4
Если выходной файл также может быть .MOV
файлом, команда будет следующей:
ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec copy merged.MOV
Вот содержимое текстового файла files_to_combine.txt
:
file ./first_file.MOV
file ./second_file.MOV
Если вы получили ошибку
Небезопасное имя файла «файл с пробелами.mov» files_to_combine.txt: Операция не разрешена
и доверять именам файлов, вы можете добавить, -safe 0
чтобы обойти эту ошибку. Смотрите FFmpeg'sстраница руководства:
ffmpeg -safe 0 -f concat ...
Более короткие команды
Попытавшись выполнить ту же задачу пять лет спустя, я также добился успеха.
ffmpeg -f concat -i files_to_combine.txt merged.mov
и
ffmpeg -f concat -i files_to_combine.txt -f mp4 merged.mp4
решение2
find *.MOV | sed 's:\ :\\\ :g'| sed 's/^/file /' > fl.txt; ffmpeg -f concat -i fl.txt -c copy output.mp4; rm fl.txt
решение3
Если вы ищете, как объединить .mp4
файлы, посмотрите мой другой ответ здесь:Stack Overflow: Как объединить два файла MP4 с помощью FFmpeg?
Чтобы объединить несколько .mov
файлов .MOV
в один
...вот что вам нужно сделать:
# 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
Я обычно нахожусь в ситуации, когда я могу использовать первый вариант, который занимаетсекундывместочасы, что здорово!
Дополнительные детали и пояснения
Если
ls -1
показывает, у вас есть эти файлы:REC_0009.MOV REC_0010.MOV REC_0011.MOV
Затем
find
команда создаст такойfiles.txt
файл:file './REC_0009.MOV' file './REC_0010.MOV' file './REC_0011.MOV'
Часть
-iname "*.mov"
делает дело-вsenstive* соответствует всем файлам, заканчивающимся на.mov
или.MOV
, или любую другую комбинацию заглавных букв.Если вы забыли
-safe 0
указатьffmpeg
команду, а в имени любого из ваших файлов есть слово «каталог» в форме./
even, вы получите следующую ошибку:[concat @ 0x555a24968700] Unsafe file name './REC_0009.MOV' files.txt: Operation not permitted
Эта
-safe 0
опция позволяетffmpeg
игнорировать эту ошибку и принимать «небезопасные» каталоги в путях к файлам.@Matthias Braun упоминает об этом здесь.
Из
ffmpeg
страницы руководстваТолько онлайн(нетнаman ffmpeg
странице руководства локально на моем компьютере Linux Ubuntu 20.04):https://manpages.org/ffmpeg:safe
Если установлено значение
1
, отклонять небезопасные пути к файлам. Путь к файлу считается безопасным, если он не содержит спецификацию протокола и является относительным, а все компоненты содержат только символы из переносимого набора символов (буквы, цифры, точку, подчеркивание и дефис) и не имеют точки в начале компонента.Если установлено значение
0
, принимается любое имя файла.Значение по умолчанию —
1
.-1
эквивалентно тому1
, если бы формат был автоматически проверен и0
в противном случае.Опция
-c copy
говоритffmpeg
использовать кодек "копировать", что означает, что он не будет перекодировать видео. Это то, что делает его таким быстрым.
Рекомендации
- Я изучал@Matthias Braun тоже ответил.
- Мой ответ здесь, где я использую
\x27
для создания'
персонажа:Stack Overflow: как экранировать одинарные кавычки внутри строк в одинарных кавычках - Я много общался с GitHub Copilot AI в текстовом редакторе VSCode, разбираясь в нюансах приведенных выше команд.
- Мой ответ для файлов MP4:Stack Overflow: Как объединить два файла MP4 с помощью FFmpeg?