1

了解/控制 MLT 熔体幻灯片相关?,我试图了解melt 的亮度混合器是如何工作的,尤其是在短(小帧数)持续时间的情况下。

例如,如果我使用类似这个规范的东西,tmppics/pic_01.jpg length=6 -mix 2 -mixer luma我会期望 pic_01 有 2 帧褪色,然后是 2 帧完整 pic_01,然后再有 2 帧褪色 - 但是,我都经历过这样的结果,以及那些不是。

为了澄清这一点,我开发了一个 bash 脚本,它使用 ImageMagickconvert生成测试图像,然后melt制作带有淡出这些图像的“幻灯片”,ffmpeg将其转换为动画 .gif,然后是 ImageMagickconvertmontage获得胶片(精灵表)视频 .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,其输出如下(点击查看完整尺寸):

融化-all.png.01

亮度混合结果(顶部)对我来说有意义的唯一方法是,如果新剪辑的起始帧以 0% 参与混合 - 这就是为什么对于第二个图像剪辑,我们观察到 1 帧淡入淡出 + 3 帧满 + 1 帧淡出(而不是 2 帧淡出 + 2 帧满 + 2 帧淡出,这是我所期望的)。

这个对吗?

阅读https://www.mltframework.org/docs/melt/#mixes我无法真正判断这种解释是否正确。

如果我使用其他参数运行脚本,例如IMGDURATIONF=8 FADEDURATIONF=3 bash melt-test-strip.sh,则输出为:

融化-all.png.01

...在这种情况下,解释成立(如果每个新剪辑的第一帧以 0% 参与混合,这就解释了为什么我们看到 2 帧淡出 + 3 帧满 + 2 帧淡出第二个剪辑 = 总共 7 帧,而不是要求的 8) - 但现在我不确定这是否只是我的脚本的人工制品(与melts mix 的真实行为相反)。

任何人都可以确认这是否是melts 混合器的工作方式 - 如果不是,请解释如何理解它?

4

0 回答 0