Я хочу объединить два файла mp4, чтобы создать один. Видеопотоки кодируются в h264, а аудио - в aac. Я не могу перекодировать видео в другой формат по вычислительным причинам. Кроме того, я не могу использовать какие-либо программы с графическим интерфейсом, вся обработка должна выполняться с помощью утилит командной строки Linux. FFmpeg не может сделать это для файлов mpeg4, поэтому вместо этого я использовал MP4Box:
MP4Box -add video1.mp4 -cat video2.mp4 newvideo.mp4
К сожалению, звук все перепутал. Я думал, что проблема была в том, что звук был в aac, поэтому я перекодировал его в mp3 и снова использовал MP4Box. В этом случае звук подходит для первой половины newvideo.mp4
(соответствует video1.mp4
), но затем звук отсутствует, и я не могу перемещаться по видео также.
Моей следующей мыслью было, что аудио и видео потоки имеют небольшие несоответствия в их длине, которые я должен исправить. Поэтому для каждого входного видео я разделял видео и аудио потоки, а затем соединял их с опцией -shortest в FFmpeg.
Таким образом, для первого видео я запустил:
avconv -y -i video1.mp4 -c copy -map 0:0 videostream1.mp4
avconv -y -i video1.mp4 -c copy -map 0:1 audiostream1.m4a
avconv -y -i videostream1.mp4 -i audiostream1.m4a -c copy -shortest video1_aligned.mp4
Аналогично для второго видео затем использовали MP4Box, как и ранее. К сожалению, это тоже не сработало. Единственный успех, который у меня был, - это когда я отдельно соединял видеопотоки (т.е. videostream1.mp4 и videostream2.mp4) и аудиопотоки (то есть audiostream1.m4a и audiostream2.m4a), а затем соединял видео и аудио в конечном файле. Однако синхронизация теряется для второй половины видео. Конкретно, есть задержка аудио и видео на 1 секунду. Любые предложения действительно приветствуются.
источник
Ответы:
Лучший способ сделать это в настоящее время - использовать демоверсию concat . Сначала создайте файл с именем
inputs.txt
отформатированный так:Затем просто запустите эту команду ffmpeg:
Смотрите также объединение в
ffmpeg
FAQ .Я оставляю здесь следующее для пользы тех, кто использует более старые версии ffmpeg.
Последние версии ffmpeg могут сделать это: сначала вам нужно будет повторно смешать файлы в транспортные потоки mpeg (достаточно легко для процессора, так как он только меняет формат контейнера):
Если это выдает ошибку о h264, вам может потребоваться использовать:
Вам придется делать это отдельно с каждым входным файлом. Чтобы объединить файлы вместе, используйте:
Если это выдает ошибку о AAC, возможно, вам придется использовать
Если ваша система поддерживает именованные каналы, вы можете сделать это без создания промежуточных файлов.
Вам нужно будет сделать следующее в трех отдельных виртуальных терминалах:
Если output.mp4 уже существует, третий ffmpeg спросит вас, хотите ли вы перезаписать его, но он сделает это после того , как получит доступ к FIFO , и это приведет к первому закрытию ffmpegs. Поэтому убедитесь, что вы выбрали неиспользуемое имя для выходного файла.
Это может не сработать, если ваши входные файлы отличаются - я считаю, что различия в скорости передачи в порядке, но размер кадра, частота кадров и т. Д. Должны совпадать
источник
*** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
это сообщение, которое я вижу сейчас на бегуffmpeg
avconv
Для mp4 единственное рабочее решение, которое я нашел, было с MP4Box из пакета gpac
или команда
с mencoder и avconv я не могу заставить его работать :-(
источник
Спасибо за сценарий dvo. Это была отличная отправная точка для меня. У меня не было проблем с использованием именованных каналов, поэтому я адаптировал скрипт для их использования. Плюс я исправил это, чтобы работать с именами файлов с пробелами в них. Вывод в именованные каналы не «идет» до тех пор, пока вы не начнете читать из них, следовательно, необходимо задавать фоновые задачи первоначального remux с помощью & перед последним вызовом avconv. Кроме того, не забывайте использовать -c copy, иначе вы перекодируете всю партию.
источник
На Mac (macOS 10.13 High Sierra) я успешно использовал следующее:
При необходимости измените порядок так же, как указано выше (обратите внимание, что ./ был удален - путь заставлял ffmpeg выдавать ошибку небезопасного имени файла).
Затем мне пришлось удалить кодек и битрейт, указанные для fPmpeg MacPorts по умолчанию, чтобы он мне понравился:
источник
Вот одна строка, которая делает все это намного проще. Он делает все необходимое, чтобы наконец предоставить вам один полученный видеофайл. Ура!
источник
Спасибо зла Вот небольшой скрипт для автоматизации процесса, использующий более свежие
avconv
.Кстати, именованные каналы у меня не сработали (вывод на них застрял).
источник
Пользовались большим успехом с
вам может понадобиться немного изменить порядок mylist.txt
ffmpeg версия 2.2.3
источник