Как объединить два файла MP4 с помощью FFmpeg? - PullRequest
288 голосов
/ 07 сентября 2011

Я пытаюсь объединить два файла mp4 с помощью ffmpeg. Мне нужно, чтобы это был автоматический процесс, поэтому я выбрал ffmpeg. Я конвертирую эти два файла в файлы .ts, затем объединяю их, а затем пытаюсь кодировать этот объединенный файл .ts. Файлы имеют кодировку h264 и aac, и я надеюсь сохранить качество на том же уровне или максимально приблизиться к оригиналу.

ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4

К сожалению, я получаю следующее сообщение об ошибке, возвращаемое ffmpeg во время кодирования:

[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s    
av_interleaved_write_frame(): Error while opening file

Это происходит примерно в середине кодирования, что заставляет меня думать, что вы не можете объединить два файла .ts вместе и заставить его работать.

Ответы [ 16 ]

3 голосов
/ 11 февраля 2012

Вот скрипт, который я сделал, чтобы объединить несколько GoPro mp4 в 720p mp4. Надеюсь, что это поможет.

#!/bin/sh
cmd="( "
for i; do
    cmd="${cmd}ffmpeg -i $i -ab 256000 -vb 10000000 -mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -f mpeg -; "
done
cmd="${cmd} ) | ffmpeg -i - -vb 10000000 -ab 256000 -s 1280x720 -y out-`date +%F-%H%M.%S`.mp4"
echo "${cmd}"
eval ${cmd}
2 голосов
/ 24 мая 2018

у меня это сработало (на windows)

ffmpeg -i "concat:input1|input2" -codec copy output

, в частности

ffmpeg -i "concat:01.mp4|02.mp4" -codec copy output.mp4

Python

Использование некоторого кода Python для выполнения с таким количеством mp4, которое есть в папке импорт глобус импорт ОС

stringa = ""
for f in glob.glob("*.mp4"):
    stringa += f + "|"

os.system("ffmpeg -i \"concat:" + stringa + "\" -codec copy output.mp4")
1 голос
/ 01 ноября 2018

Для .mp4 файлов я обнаружил, что он работает лучше и быстрее, используя инструмент командной строки с открытым исходным кодом: mp4box.Тогда Вы можете использовать это следующим образом:

mp4box.exe -add video1.mp4 -cat video2.mp4 destvideo.mp4

Загрузите его здесь для большинства платформ: https://gpac.wp.imt.fr/mp4box/

1 голос
/ 27 февраля 2018

Слияние всех файлов mp4 из текущего каталога

Мне лично не нравится создавать внешний файл, который я должен впоследствии удалить, поэтому мое решение было следующим: список нумерации файлов (например, file_1_name, file_2_name, file_10_name, file_20_name, file_100_name, ...)

#!/bin/bash
filesList=""
for file in $(ls -1v *.mp4);do #lists even numbered file
    filesList="${filesList}${file}|"
done
filesList=${filesList%?} # removes trailing pipe
ffmpeg -i "concat:$filesList" -c copy $(date +%Y%m%d_%H%M%S)_merged.mp4
1 голос
/ 28 августа 2017
ffmpeg \
  -i input_1.mp4 \
  -i input_2.mp4 \
  -filter_complex '[0:v]pad=iw*2:ih[int];[int][1:v]overlay=W/2:0[vid]' \
  -map [vid] \
  -c:v libx264 \
  -crf 23 \
  -preset veryfast \
  output.mp4
0 голосов
/ 15 марта 2019

После различных попыток ниже скрипт работал на Windows 10 PowerShell.

    $files=Get-ChildItem -path e:\ -Filter *.mp4


    $files| ForEach-Object  {"file '$($_.FullName)'"}| Out-File -FilePath e:\temp.txt -Encoding ASCII


    if (-not (test-path "e:\ffmpeg\bin\ffmpeg.exe")) {throw "e:\ffmpeg\bin\ffmpeg.exe needed"}

    E:\ffmpeg\bin\ffmpeg.exe -safe 0 -f concat -i "e:\temp.txt" -c copy -bsf:v hevc_mp4toannexb -an e:\joined.mp4

    # Conversion Cleanup
    Remove-Item e:\temp.txt

Здесь первые две строки создают текстовый файл temp.txt со следующим содержанием

file 'e:\first.mp4'
file 'e:\second.mp4'

3-я, 4-я строки проверяют, доступен ли ffmpeg в path, и создают "join.mp4"

Основные отличия от других ответов приведены ниже

usage  of -bsf:v hevc_mp4toannexb -an

для моего файла mp4, указанного выше, вам может потребоваться использовать другие альтернативы, как показано ниже, в зависимости от вашей кодировки видео.

h264_mp4toannexb

Все такие возможные фильтры битового потока можно найти по адресу https://ffmpeg.org/ffmpeg-bitstream-filters.html

...