Более короткие команды

Более короткие команды

Я использую 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использовать кодек "копировать", что означает, что он не будет перекодировать видео. Это то, что делает его таким быстрым.

Рекомендации

  1. Я изучал@Matthias Braun тоже ответил.
  2. Мой ответ здесь, где я использую \x27для создания 'персонажа:Stack Overflow: как экранировать одинарные кавычки внутри строк в одинарных кавычках
  3. Я много общался с GitHub Copilot AI в текстовом редакторе VSCode, разбираясь в нюансах приведенных выше команд.
  4. Мой ответ для файлов MP4:Stack Overflow: Как объединить два файла MP4 с помощью FFmpeg?

Связанный контент