编辑

编辑

我正在尝试编写一个脚本,该脚本应能处理所有类型的图像(格式、大小……)并使用 avconv 创建视频。我已设法使其与一系列 jpg 配合使用(尽管所有图像大小相同),现在我正尝试使用 convert 来确保它能够通过使所有图像的大小和格式相似来创建视频。以下是我操作的方法:

(for J in $(ls "$1/"* 2> /dev/null); do
     convert "$J" -resize 640x480 -gravity center \
             -size "$FORMAT" -fill black -extent 640x480 jpg jpeg:-
done) | avconv -f image2pipe -r 1/5 -c:v mjpeg -i - \
               -vcodec libx264 -r 20 -f mpegts video.mpeg

我有一系列 avconv 返回的图像:

Input stream #0:0 frame changed from size:640x480 fmt:yuvj420p to size:160x120 fmt:yuvj422p
Input stream #0:0 frame changed from size:160x120 fmt:yuvj422p to size:320x240 fmt:yuvj422p
Input stream #0:0 frame changed from size:320x240 fmt:yuvj422p to size:88x128 fmt:yuvj420p
[mjpeg @ 0x101838800] only 8 bits/component accepted
 Error while decoding stream #0:0
 Input stream #0:0 frame changed from size:88x128 fmt:yuvj420p to size:120x160 fmt:yuvj420p

我检查了一下,当我只使用 convert 时,图像看起来没问题。我猜我在 convert 中缺少了一些东西,无法使图像完全相同,以便 avconv 正常工作。但我真的找不到它

谢谢你的帮助!

编辑

因此,经过调查,这似乎是由于输出图像的分辨率和/或采样率不相同造成的。所以我尝试了这个:

(for J in $(ls "$1/"* 2> /dev/null); do
    convert "$J" -background '#000000' -resize "640x480" 
                 -gravity center -extent "640x480" -sampling-factor '4:2:2' 
                 -resample '72x72' jpeg:-
done) | 
avconv -f image2pipe -r 1/5 -c:v mjpeg -i - 
       -vcodec libx264 -r 30 "foo.mpeg"

但还是没有成功...

Input stream #0:0 frame changed from size:640x480 fmt:yuvj422p to size:160x120 fmt:yuvj422p
Input stream #0:0 frame changed from size:160x120 fmt:yuvj422p to size:320x240 fmt:yuvj422p
Input stream #0:0 frame changed from size:320x240 fmt:yuvj422p to size:88x128 fmt:yuvj420p
[mjpeg @ 0x101838800] only 8 bits/component accepted
Error while decoding stream #0:0
Input stream #0:0 frame changed from size:88x128 fmt:yuvj420p to size:120x160 fmt:yuvj420p

管道::输入/

这是我使用的图像:

希望这可以帮助...

答案1

经过大量搜索后,我终于找到了一些可行的方法(至少对于我的几个测试文件来说):

convert "$J" -background '#000000' -resize "$FORMAT" \
        -gravity center -extent "$FORMAT" -strip \
        -sampling-factor '4:2:2' -type TrueColor jpeg:- | \
avconv -f image2pipe -r 1/"$DURATION" -c:v mjpeg -i - \
       -vcodec libx264 -r 20 -f mpegts "$RESULT_FILE"

重要的选项是:

  • -strip从输入中删除所有额外信息(例如,我有颜色配置文件或一些 EXIF 数据),这显然给 avconv 带来了问题
  • -sampling-factor '4:2:2'这将 jpeg 采样因子固定为 4:2:2(如果您认为有比 4:2:2 更明智的选择,请告诉我)
  • -type TrueColor这是未经测试的,但灰度图像将具有不同的格式,将保存在 jpeg 中,此选项强制转换为 TrueColors,以便所有图像使用相同的颜色编码。

这解决了我的问题。如果您发现其他问题,请告诉我...谢谢

相关内容