Понимание длительности смеси плавления миксера расплава MLT?
Связанный с Пониманием / управлением слайд-шоу расплава MLT? Я пытаюсь понять, как работает Melta Luma Mixer, особенно в контексте короткой (небольшой номер кадра) продолжительности.
Например, если я использую что-то вроде этой спецификации tmppics/pic_01.jpg length=6 -mix 2 -mixer luma
Я ожидал бы 2 кадра с постепенным исчезновением pic_01, затем 2 кадра с полным изображением pic_01, затем 2 кадра с постепенным исчезновением снова - однако, у меня были и такие результаты, и те, которые нет.
Чтобы прояснить это, я разработал скрипт bash, который использует ImageMagick convert
генерировать тестовые изображения, затем melt
сделать "слайд-шоу" с исчезновением из этих изображений, ffmpeg
чтобы преобразовать это в анимированный.gif, затем ImageMagick convert
а также montage
чтобы получить кинопленку (спрайт-лист) видео.gif (Ubuntu 18.04, melt 6.6.0, ffmpeg версия 3.4.4-0ubuntu0.18.04.1, ImageMagick 6.9.7-4 Q16 x86_64 20170114).
Вот скрипт bash, melt-test-strip.sh
:
#!/usr/bin/env bash
FRAMERATE=25
echo "
description=DV PAL
frame_rate_num=$FRAMERATE
frame_rate_den=1
width=720
height=576
progressive=0
sample_aspect_num=59
sample_aspect_den=54
display_aspect_num=4
display_aspect_den=3
colorspace=601
" > my-melt.profile
mkdir tmppics
convert -background lightblue -fill blue -size 3840x2160 -pointsize 200 -gravity center label:"Test A" tmppics/pic_01.jpg
convert -background lightblue -fill blue -size 2160x3840 -pointsize 200 -gravity center label:"Test B" tmppics/pic_02.jpg
if [ -z "$IMGDURATIONF" ]; then
IMGDURATIONF=6 # picture duration, frames
fi
if [ -z "$FADEDURATIONF" ]; then
FADEDURATIONF=2 # single-end fade duration, frames
fi
melt -verbose -profile ./my-melt.profile \
tmppics/pic_01.jpg length=$IMGDURATIONF \
tmppics/pic_02.jpg length=$IMGDURATIONF -mix $FADEDURATIONF -mixer luma \
colour:black length=$IMGDURATIONF -mix $FADEDURATIONF -mixer luma \
-consumer avformat:meltout.mp4 vcodec=libx264 an=1
# auxiliary: just for creating sprite sheet/film strip:
melt -verbose -profile ./my-melt.profile tmppics/pic_01.jpg length=$IMGDURATIONF -consumer avformat:meltout-01.mp4 vcodec=libx264 an=1
melt -verbose -profile ./my-melt.profile tmppics/pic_02.jpg length=$IMGDURATIONF -consumer avformat:meltout-02.mp4 vcodec=libx264 an=1
melt -verbose -profile ./my-melt.profile colour:black length=$IMGDURATIONF -consumer avformat:meltout-b.mp4 vcodec=libx264 an=1
# convert to gif to obtain sprite sheet/film strip from:
ffmpeg \
-i meltout.mp4 \
-r 25 \
-vf scale=256:-1 \
-y meltout.gif
# auxiliary: just for creating sprite sheet/film strip:
ffmpeg -i meltout-01.mp4 -r $FRAMERATE -vf scale=256:-1 -y meltout-01.gif
ffmpeg -i meltout-02.mp4 -r $FRAMERATE -vf scale=256:-1 -y meltout-02.gif
ffmpeg -i meltout-b.mp4 -r $FRAMERATE -vf scale=256:-1 -y meltout-b.gif
convert meltout.gif -coalesce meltoutc.gif
convert meltout-01.gif -coalesce meltoutc-01.gif
convert meltout-02.gif -coalesce meltoutc-02.gif
convert meltout-b.gif -coalesce meltoutc-b.gif
FRAMETHICK=5
#~ montage temp.gif -tile x1 -geometry '1x1+0+0<' -border 5 -bordercolor "rgb(200, 200, 200)" -label 'Image' -quality 100 meltout.png
# "%p index of image in current image list" is "t=> index of current image (s) in list" in fx:
montage -label 'Frame %[fx:t+1]/%n' meltoutc.gif -tile x1 -geometry '1x1+0+0<' -frame $FRAMETHICK -bordercolor "rgb(200, 200, 200)" -quality 100 meltout.png
# here from the .gif - otherwise for replicating images: montage in.jpg +clone +clone +clone -tile x4 -geometry +0+0 out.jpg
montage -label 'Frame %[fx:t+1]/%n' meltoutc-01.gif -tile x1 -geometry '1x1+0+0<' -frame $FRAMETHICK -bordercolor "rgb(200, 200, 200)" -quality 100 meltout-01.png
montage -label 'Frame %[fx:t+1]/%n' meltoutc-02.gif -tile x1 -geometry '1x1+0+0<' -frame $FRAMETHICK -bordercolor "rgb(200, 200, 200)" -quality 100 meltout-02.png
montage -label 'Frame %[fx:t+1]/%n' meltoutc-b.gif -tile x1 -geometry '1x1+0+0<' -frame $FRAMETHICK -bordercolor "rgb(200, 200, 200)" -quality 100 meltout-b.png
# for offsetting:
# (gif) frame width/height
fw=$(convert meltoutc-01.gif[0] -format "%w" info:)
fh=$(convert meltoutc-01.gif[0] -format "%w" info:)
# strip width/height
sw=$(convert meltout.png -format "%w" info:)
sh=$(convert meltout.png -format "%h" info:)
echo fw $fw fh $fh sw $sw sh $sh
convert -size $(( (IMGDURATIONF-FADEDURATIONF)*(fw+2*FRAMETHICK) ))x$sh xc:white meltout-02.png +append meltout-02B.png
# IMGDURATIONF-FADEDURATIONF to get to the start of second clip; +IMGDURATIONF from there to get to end of second clip, and -FADEDURATIONF from there to get to start of third clip
convert -size $(( (IMGDURATIONF-FADEDURATIONF+IMGDURATIONF-FADEDURATIONF)*(fw+2*FRAMETHICK) ))x$sh xc:white meltout-b.png +append meltout-bB.png
montage -geometry '+0+0' meltout.png meltout-01.png meltout-02B.png meltout-bB.png -tile 1x meltout-all.png
eog meltout-all.png
Итак, если вы позвоните bash melt-test-strip.sh
, вы получаете значения по умолчанию, IMGDURATIONF=6 и FADEDURATIONF=2, для которых это вывод (щелкните для полного размера):
Единственный способ, которым результат со смешанным яркостью (сверху) имеет смысл для меня, это если начальный кадр нового клипа участвует в миксе с 0% - вот почему, для второго клипа изображения мы наблюдаем 1 кадровое затухание + 3 кадра + 1 кадр (вместо 2 кадров + 2 кадра + 2 кадра, что я и ожидал).
Это правильно?
Читая https://www.mltframework.org/docs/melt/ я не могу сказать, верна ли эта интерпретация.
Если я запускаю скрипт с другими параметрами, как IMGDURATIONF=8 FADEDURATIONF=3 bash melt-test-strip.sh
, тогда вывод:
... в этом случае интерпретация верна (если первый кадр каждого нового клипа участвует в миксе с 0%, это объясняет, почему мы видим, что 2 кадра исчезают + 3 кадра заполнены + 2 кадра исчезают для второго клипа = 7 кадров во всех вместо запрошенного 8) - но теперь я не уверен, является ли это просто артефактом моего сценария (в отличие от истинного поведения melt
с микс).
Может кто-нибудь подтвердить, если это как melt
Смеситель работает - и если нет, объясните, как его можно понять?