Как объединить несколько (более двух) видео в Ubuntu?
Я хочу объединить видео в партии размером двадцать (20) каждый. Я работаю на машине с Linux. Видео в формате mp4 и умеренного качества. У некоторых даже отсутствует аудиопоток. Пока я пробовал ffmpeg
, mencoder
, cvlc/vlc
а также MP4Box
, Я хочу написать сценарий командной строки для достижения этой цели, так как я делаю пакетную обработку.
Основная проблема заключается в том, что некоторые из решений, которые я попробовал, хорошо работают для двух видео, некоторые - для видео с аудиопотоком, а другие - для некоторого другого подмножества моего набора видео. Однако я не смог найти комплексного решения этой задачи.
11 ответов
Это решило вопрос: https://stackoverflow.com/a/22324018/5014767
melt
это отличная утилита командной строки для этого. Вот эта страница
Редактировать из комментариев: команда, которая решила мою проблему, была эта melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Я использую mkvmerge
объединить несколько файлов MP4 в один:
mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4
Вы можете сделать это с помощью ffmpeg
:
ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4
Создайте файл files.txt со всеми файлами, которые вы хотите объединить, в следующей форме (строки, начинающиеся с #, игнорируются):
# this is a comment
file 'file1.mp4'
file '/path/to/file2.mp4'
file 'file3.mp4'
Обратите внимание, что это могут быть относительные или абсолютные пути. Затем вы можете потоковое копирование или перекодировать ваши файлы:
ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
Я написал небольшой сценарий оболочки для объединения MP4 без транскодирования с использованием ffmpeg.
for f in $(ls *.MP4); do
ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done
CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4
rm *.ts
Это создает промежуточные файлы в контейнере MPEG и затем объединяет их в MP4.
Я написал обертку вокруг
ffmpeg
называется vidmerger, который позволяет очень легко объединить несколько видео внутри папки, например, чтобы объединить все файлы mp4 внутри текущего каталога, просто запустите:
vidmerger .
LossLessCut очень хорошо подходит для этого. Быстро и безболезненно.
Я создал скрипт Python, который с помощью moviepy может объединять также подсегменты (полезно, например, если вы хотите удалить некоторые части из видео).
Используйте это с:
vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>
Мой сценарий, чисто в bash
а также ffmpeg
, Перекодирует файлы, заданные в командной строке, в одну.
Требует, чтобы файлы имели одинаковое разрешение. Принимает разные метаданные ротации, которые ffmpeg concat:
не делает.
rm ffmpeg-concat-output.mkv
FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
echo "Processing ${FNAME}"
INPUTS="${INPUTS} -i $FNAME"
if [ -z "${FILTER}" ]; then
FILTER="[$INDEX:v:0] [$INDEX:a:0]"
else
FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
fi
let INDEX+=1
done
COMMAND="ffmpeg ${INPUTS} \
-filter_complex '${FILTER} \
concat=n=${INDEX}:v=1:a=1 [v] [a]' \
-map '[v]' -map '[a]' \
ffmpeg-concat-output.mkv"
# -af 'volume=15dB' # won't work with -filter_complex
bash -c "${COMMAND}"
Я хотел бы добавить свой "videomerge" - доступный для ubuntu через ppa:
Это приложение с графическим интерфейсом QT5, использующее перетаскивание. Установить:
sudo add-apt-repository ppa:jentiger-moratai/mediatools
sudo apt update
sudo apt install videomerge
Как и во всех моих приложениях, я стараюсь сделать пользовательский интерфейс очень простым:
В дополнение к ответу Maythux, из:
Несколько мультимедийных контейнеров (MPEG-1, MPEG-2 PS, DV) позволяют объединять видео, просто объединяя файлы, содержащие их.
Т.е. для объединения видео используйте один из вышеупомянутых контейнеров видео (к которому я добавлю MPEG-4 Part 14 для личного опыта), вы можете просто:
cat video1.ext video2.ext video3.ext > video4.ext