Добавление оверлея с использованием FFMPEG с минимальным перекодированием
FFMPEG действительно полезен для вырезания части видео без перекодирования видео.
Я знаю, что также возможно использовать FFMPEG для добавления оверлейного изображения к видео, в определенной части видео (например, от 10 секунд до 20 секунд).
Мой вопрос: если я сделаю это наложение изображения, будет ли перекодировано все видео из-за этого? Или просто соответствующая длительность будет закодирована?
Также есть ли варианты, которые я могу использовать, чтобы сделать минимальное перекодирование?
Цель если конечно сохранить качество видео как оригинальное..
(Я бы попросил вообще не перекодировать, но не понимаю, как это возможно...)
Спасибо
1 ответ
Все видео будет перекодировано, если вы наложите изображение на его часть. Один из способов избежать перекодирования всего объекта состоит в том, чтобы вырезать часть, которую вы хотите наложить, и перекодировать только этот фрагмент (см. -t duration
переключатель и -ss position
переключиться в документации
Вы хотите сохранить текущие параметры кодирования на протяжении всего процесса. Это легко сделать при разделении, так как вы можете использовать параметр копирования для переключателей кодека, таких как -c:a copy -c:v copy
Чтобы осмыслить (обратите внимание, что это не полные команды):
Часть 1: Начало фильма (первые 10 секунд, которые вы не хотите накладывать) (получается с ffmpeg -i SourceFileName -t 10 -c:a copy -c:v copy SourceFileNameP1.mkv
где SourceFileName - ваше видео для обработки. Часть 2: часть фильма от 10 до 20 секунд, которую вы хотите наложить (получается с помощью ffmpeg -i SourceFileName -ss 10 -t 10 -c:a copy -c:v copy SourceFileNameP2
) Часть 3: Конец фильма (получается с помощью `ffmpeg -ss 20 -c: копия -c:v копия)
Дополнительный совет: вы можете получить более медленную, но более точную резку, переместив параметр `-ss до выходного файла. Это приведет к удалению кадров из выходных данных, а не к попытке поиска правильной позиции на входе до создания выходных данных.
Если вы не знаете подробностей кодирования исходного файла, вы можете получить их с помощью ffprobe SourceFileName
или мой любимый mediainfo SourceFileName
Я рекомендую использовать контейнер Matroska как минимум для промежуточного вывода из-за его гибкости и низких накладных расходов.
Вот скрипт, который вы можете использовать (в системах на основе Debian), чтобы получить необходимые параметры для соответствия.
#!/bin/bash
#mknfo.sh
#Written by Elder Geek for the Stack Exchange network
# 1/1/2018
####################################################################################################
#bash script to create an nfo file which includes information to help joining video clips #
####################################################################################################
# This function will create an nfo file including the tech specs for a specified media file #
####################################################################################################
function shortinfo {
echo $@
mediainfo --Inform="General;Duration=%Duration/String2%\nFile size=%FileSize/String1%\nBit Rate=%OverallBitRate/String% " "$@"
echo -n "Video: "
mediainfo --Inform="Video;FrameRate=%FrameRate/String% BitRate=%BitRate/String% Resolution=%Width%x%Height% Codec=%CodecID%" "$@";
echo -n "Audio: "
mediainfo --Inform="Audio;Mode=%BitRate_Mode/String% BitRate=%BitRate/String% Format=%Format%" "$@";
echo "-----------------------------------------------------------------------------"
}
####################################################################################################
# This function will check for the existence of mediainfo and attempt installation if not found #
####################################################################################################
function getmi {
echo "mediainfo is required and not found. Attempt install Y/N"
read -n 1 solve
if [ $solve=={Yy} ]
then sudo apt-get -y install mediainfo
else echo "Cannot continue"
exit 1
fi
}
####################################################################################################
# Main program #
####################################################################################################
if [ $# -ne 1 ]
then
echo Error
echo "$0" requires a single filename argument. Example: "$0" Videofile
exit 2
fi
exist=$(which mediainfo)
if [ "$exist" == "" ];
then getmi
fi
target=$(pwd)"/"$1".nfo"
if [ -e $target ]
then
echo Error: "$1.nfo" already exists
exit 3
fi
echo "Creating $target"
shortinfo "$1" > "$target"
exit 0
Now you'll want to re-encode the overlay section (Part2) of the video to exactly match the parameters (same audio and video codecs and same bitrate and sample rate as the original of Part1 and Part3 to allow for joining.
Как только это будет завершено, вы можете объединить все части вместе.
mkvmerge -o joined.mkv Part1 + Part2Reencoded + Part3
Обратите внимание, что перекодирование всегда приводит к некоторой потере качества, поэтому соединения между фрагментами могут показывать видимые дефекты. Это может или не может быть заметно при отвлечении, вызванном наложением, появляющимся и исчезающим одновременно кодами.
Это может значительно сократить время перекодирования в зависимости от длины материала и дает дополнительное преимущество только перекодирования того, что необходимо перекодировать.
О том, как наложить ваш перекодированный сегмент, рассказывается здесь, и вы можете настроить принятый ответ в соответствии с вашим материалом.
Еще один способ сделать это с игроком:
ffplay -f lavfi "movie=main.mkv[bg];movie=logo.png[fg];[bg][fg]overlay=W-w-10:H-h-10:enable=between'(t,10,20)'[out0];amovie=main.mkv[out1]"
Кодировка не требуется. Без потери качества. Мгновенное удовлетворение.