Я хочу объединить видео в пакетном размере двадцать (20) каждый. Я выполняю машину Linux. Видео находятся в mp4 формате и модерируют качество. У некоторых даже есть пропавшие без вести аудиопотока. До сих пор я попробовал ffmpeg
, mencoder
, cvlc/vlc
и MP4Box
. Я хочу записать сценарий командной строки для достижения этого, так как я делаю пакетную обработку.
Основной вопрос - то, что некоторые решения, я попробовал работу хорошо за два видео, некоторая работа хорошо для видео с аудиопотоком и все же другими, работают хорошо на некоторое другое подмножество моей видеосистемы. Однако я не смог найти комплексное решение для этой задачи.
Это решило вопрос: 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
Мой сценарий, просто в 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}"
В дополнение к ответу Maythux, от :
Несколько мультимедийных контейнеров (MPEG-1, MPEG 2 пз, DV) позволяют связывать видео путем простой конкатенации файлов, содержащих их.
Т.е. видео, которые будут связаны, используют один из вышеупомянутых видео контейнеров (к которому я добавлю часть 14 MPEG-4 для личного опыта), Вы могли просто:
cat video1.ext video2.ext video3.ext > video4.ext
Я создал сценарий Python, который, с помощью moviepy, может связать также подсегменты (полезный, если Вы хотите, например, удаляют некоторые части из видео).
Использование это с:
vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>
Создайте файл 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
Я записал немного сценария оболочки в concat MP4s, не транскодируя использующий 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.
LossLessCut очень хорошо работает для этого. Быстро и безболезненно.
Я написал обертку вокруг ffmpeg
под названием vidmerger , что позволяет очень легко объединить несколько видео внутри папки, например, объединить все файлы mp4 в текущем каталоге, просто run:
vidmerger .