我正在尝试编写一个脚本,该脚本应能处理所有类型的图像(格式、大小……)并使用 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
管道::输入/
这是我使用的图像:
- http://test_avconv.s3.amazonaws.com/1.png
- http://test_avconv.s3.amazonaws.com/2.jpg
- http://test_avconv.s3.amazonaws.com/3.jpg
- http://test_avconv.s3.amazonaws.com/4.jpg
希望这可以帮助...
答案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,以便所有图像使用相同的颜色编码。
这解决了我的问题。如果您发现其他问题,请告诉我...谢谢