Я хочу объединить видео в партии размером двадцать (20) каждый. Я работаю на машине с Linux. Видео в формате mp4 и среднего качества. У некоторых даже отсутствует аудиопоток. До сих пор я пытался ffmpeg
, mencoder
, cvlc/vlc
и MP4Box
. Я хочу написать сценарий командной строки для достижения этой цели, так как я делаю пакетную обработку.
Основная проблема заключается в том, что некоторые из решений, которые я попробовал, хорошо работают для двух видео, некоторые - для видео с аудиопотоком, а другие - для некоторого другого подмножества моего набора видео. Однако я не смог найти комплексного решения этой задачи.
ffmpeg
том числе фильтры и файловые протоколы. Я также пытался использоватьconcat
функциюcvlc/vlc
. Я также попробовалconcat
функциюmencoder
. Все это работало частично. Это наконец помогло мне решить проблему.melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Ответы:
Я использую,
mkvmerge
чтобы объединить несколько файлов MP4 в один:источник
.mkv
для выходного файла, так как это контейнер Matroska, независимо от того, какое расширение вы даете.mkvmerge
: tipsonubuntu.comВы можете сделать это используя
ffmpeg
:справка и дополнительная информация
источник
Это решило вопрос: https://stackoverflow.com/a/22324018/5014767
melt
это отличная утилита командной строки для этого. Вот эта страницаРедактировать из комментариев: команда, которая решила мою проблему, была эта
melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
источник
Я написал небольшой сценарий оболочки для объединения MP4 без транскодирования с использованием ffmpeg.
Это создает промежуточные файлы в контейнере MPEG и затем объединяет их в MP4.
источник
for f in *.MP4
без использованияls
. (Вы всегда должны избегать использованияls
в сценариях по нескольким важным причинам; есть лучшие варианты.) Кроме того, используйте кавычки для переменных, если вы не уверены, что нет пробелов или других специальных символов, поэтому"${f}"
(или просто"$f"
) вместо кавычек$f
.CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
не очень хорошо работает с именами файлов 1, 2, 3 ... 10 ... 20. В итоге они разбираются как 1, 10 ... 2, 20 ... и т. д. Я полагаю,CONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")
это обеспечит порядок ,Создайте файл files.txt со всеми файлами, которые вы хотите объединить, в следующей форме (строки, начинающиеся с #, игнорируются):
Обратите внимание, что это могут быть относительные или абсолютные пути. Затем вы можете потоковое копирование или перекодировать ваши файлы:
источник
Мой сценарий, чисто в
bash
иffmpeg
. Перекодирует файлы, заданные в командной строке, в одну.Требует, чтобы файлы имели одинаковое разрешение. Принимает разные метаданные ротации, что
ffmpeg concat:
не так.источник
Я создал скрипт Python, который с помощью moviepy может объединять также подсегменты (полезно, например, если вы хотите удалить некоторые части из видео).
Используйте это с:
источник
В дополнение к ответу Maythux, из :
Т.е. для объединения видео используйте один из вышеупомянутых контейнеров видео (к которому я добавлю MPEG-4 Part 14 для личного опыта), вы можете просто:
источник