Я пытаюсь объединить два файла 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 и заставить его работать.
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(mkv принимает больше кодеков, чем mp4, но вы также можете попробовать это с mp4). Это-safe 0
для последних версий ffmpeg, жалующихся на небезопасное имя файла , и-type f
только для перечисления файлов. Я добавил| sort
сортировать файлы по алфавиту; потому чтоfind
читает их по порядку как сохраненные в файловой системе. Работает также для файлов с пробелами.ffmpeg -i "concat:input1|input2" -codec copy output
. Не нужно убегать от персонажа трубы.ДЛЯ MP4 ФАЙЛОВ
Для файлов .mp4 (которые я получил от DailyMotion.com: 50-минутный телевизионный эпизод, загружаемый только из трех частей, как три видеофайла .mp4), следующее было эффективным решением для Windows 7 и НЕ предполагает перекодирования файлы.
Я переименовал файлы (как file1.mp4 , file2.mp4 , file3.mp4 ) так, чтобы части были в правильном порядке для просмотра полного телевизионного эпизода.
Затем я создал простой командный файл (concat.bat) со следующим содержимым:
Пакетный файл , и ffmpeg.exe , оба должны быть помещены в той же папке, что файлы .mp4 быть объединены. Затем запустите пакетный файл. Обычно это займет не более десяти секунд.
,
Приложение (2018/10/21) -
Если вы искали метод указания всех файлов mp4 в текущей папке без повторного ввода, попробуйте это вместо этого в командном файле Windows ( НЕОБХОДИМО включить опцию -safe 0 ):
Это работает на Windows 7, в пакетном файле. Не пытайтесь использовать его в командной строке, потому что он работает только в командном файле!
источник
C:\blah>type mylist.txt<ENTER>
(чтобы они увидели содержимое этого файла). Тогдаffmpeg -f concat -i mylist.txt -c copy output.mp4<ENTER>
также вы должны включить ссылку trac.ffmpeg.org/wiki/Concatenate (эта ссылка даже использует то же имя файла, mylist.txt)-i
параметра. На Linux я сделал это:ls -1 P1041*.mp4 | sed s/"P"/" file P"/g > mylist.txt
что даже круче, чем кодирование пакетного скрипта. Во всяком случае,-c copy
выполняет очень быстро (о чем я не знал), и это настоящая магия этого ответа.Вот быстрый (занимает менее 1 минуты) и способ без потерь, не требующий промежуточных файлов:
«Ls» содержит файлы для присоединения. «Perl» создает файл конкатенации на лету в канал. Часть «-i -» указывает ffmpeg читать из канала
(обратите внимание - в моих файлах не было пробелов или странных вещей - вам нужно соответствующее экранирование оболочки, если вы хотите реализовать эту идею с «жесткими» файлами).
источник
ls Movie_Part_1.mp4 Movie_Part_2.mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
ls * | perl -ne 'print "file $_"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
если ваши файлы с хорошим именем и в порядке. Отлично работал для меня на OS X, именно то, что я хотел.ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(mkv принимает больше кодеков, чем mp4, но вы также можете попробовать это с mp4). Это-safe 0
для последних версий ffmpeg, жалующихся на небезопасное имя файла , и-type f
только для перечисления файлов. Я добавил| sort
сортировать файлы по алфавиту; потому чтоfind
читает их по порядку как сохраненные в файловой системе. Работает также для файлов с пробелами.ffmpeg
он работал:-protocol_whitelist file,tcp,http,pipe
для файлов MP4:
Если они не совсем одинаковые (100% одинаковый кодек, то же разрешение, тот же тип) MP4-файлы, то сначала вам нужно транскодировать их в промежуточные потоки:
НОТА! : Вывод будет похож на первый файл (а не второй)
источник
Я пытался объединить три
.mp3
аудиофайла в один.m4a
файл, и эта команда ffmpeg работает.Входная команда:
Значения: -filter_complex "concat = n = 3: v = 0: a = 1" :
Для получения дополнительной информации: используйте параметр
ffmpeg -h full
print all (включая все параметры формата и кодека, очень долго)источник
-f concat -safe 0 -i "file.txt" -c copy -y "OutPut.mp4"
оно будет согласовано, но когда некоторые видео со звуком, а некоторые без звука, это не работает, как я могу разобраться в этом. Спасибо -В итоге я использовал mpg в качестве промежуточного формата, и это сработало (ПРИМЕЧАНИЕ: это опасный пример, -qscale 0 перекодирует видео ...)
источник
-sameq
был удален. Используйте-qscale 0
вместо этого.-sameq
не означает «то же качество» и был удален из ffmpeg, как упомянуто @XavierHo.concat
команду в ffmpeg, как это делает @rogerdpack выше.Подробную документацию по различным способам объединения в ffmpeg можно найти здесь .
Вы можете использовать «Конкат фильтр» для быстрой конкатенации.
Он выполняет перекодирование. Эта опция лучше всего подходит, когда входы имеют разные видео / аудио форматы.
Для объединения 2 файлов:
Для объединения 3 файлов:
Это работает как для нескольких типов входных файлов.
источник
ouput.mp4
битрейт видео значительно ниже, чем битрейт входного видеоЯ обнаружил, что оператор pipe не работает для меня при использовании варианта 3 для объединения нескольких MP4 на Mac в принятом ответе.
Следующий однострочный текст работает на Mac (High Sierra) для объединения mp4s без создания промежуточного файла.
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
источник
Здесь 2 чистых решения Bash, используя только
ffmpeg
и не используяОднострочное решение с использованием
ls
Функция, которая принимает 0 или 2+ аргумента
Примечание: пробовал некоторые решения в этой теме, и никто не удовлетворил меня
источник
основываясь на ответах rogerdpack и Ed999, я создал свою версию .sh
он объединяет все
*.mp4
файлы в текущей папке вjoined-out.mp4
проверено на Mac.
полученный размер файла является точной суммой моих 60 проверенных файлов. Не должно быть никаких потерь. Как раз то, что мне было нужно
источник
это работало для меня (на окнах)
пример...
питон
Используя некоторый код Python, чтобы сделать это с таким количеством mp4, которое есть в папке (установите python с python.org, скопируйте и вставьте и сохраните этот код в файл с именем mp4.py и запустите его из cmd, открытого в папке с python mp4.py и все mp4 в папке будут объединены)
Версия 2 с Python
Взято из моего поста в моем блоге , вот как я делаю это в python:
источник
Для
.mp4
файлов, я нашел , что это работает лучше и быстрее использовать инструмент командной строки с открытым исходным кодом:mp4box
. Тогда Вы можете использовать это так:Загрузите его здесь для большинства платформ: https://gpac.wp.imt.fr/mp4box/
источник
Вот скрипт, который я сделал, чтобы объединить несколько MP4 в GoPro в MP4 в формате 720p. Надеюсь, это поможет.
источник
Из документации здесь: https://trac.ffmpeg.org/wiki/Concatenate
Этот подход работает на всех платформах.
Мне нужна была возможность инкапсулировать это в кроссплатформенный скрипт, поэтому я использовал
fluent-ffmpeg
и придумал следующее решение:источник
источник
Слияние всех файлов mp4 из текущего каталога
Мне лично не нравится создавать внешний файл, который я должен затем удалить, поэтому мое решение было следующим: список нумерации файлов (например
file_1_name, file_2_name, file_10_name, file_20_name, file_100_name
, ...)источник
После различных попыток ниже скрипт работал на Windows 10 PowerShell.
Здесь первые две строки создают текстовый файл temp.txt, который имеет следующий контент
3-я, 4-я строки проверяют, доступен ли ffmpeg в path, и создают «join.mp4»
Основные отличия от других ответов приведены ниже
для моего файла mp4 выше, возможно, вам придется использовать другие альтернативы, как показано ниже, в зависимости от вашей кодировки видео.
Все такие возможные фильтры битового потока можно найти по адресу https://ffmpeg.org/ffmpeg-bitstream-filters.html.
источник
Вот мой метод соединения каталога, заполненного файлами MP4, с использованием подстановки команд и фильтра видео concat (это перекодирует) - я подумал, что кому-то еще пригодится эта строка, особенно если у вас много файлов (я просто присоединился 17 файлов одним махом)
Обратите внимание, что эта команда объединяет ваши файлы в том порядке, в котором они названы (то есть в том же порядке, в котором они представлены, если вы запускаете
ls *.mp4
) - в моем случае у каждого из них был номер дорожки, поэтому она отлично работала.источник
Протокол Concat описан здесь; https://trac.ffmpeg.org/wiki/Concatenate#protocol
При реализации с использованием именованных каналов, чтобы избежать промежуточных файлов
Очень быстрый (читай: мгновенный), без пропущенных кадров и работает хорошо.
Не забудьте удалить файлы именованных каналов и не забудьте проверить, является ли видео H264 и AAC, что вы можете сделать просто
ffmpeg -i filename.mp4
(проверьте h264 и упоминания aac)источник
Принятый ответ в виде многоразового скрипта PowerShell
источник