Bash ffmpeg:不兼容的像素格式';yuv420p';对于编解码器';巴布亚新几内亚;,自动选择格式';rgb24';
我有一堆.png文件Bash ffmpeg:不兼容的像素格式';yuv420p';对于编解码器';巴布亚新几内亚;,自动选择格式';rgb24';,bash,ffmpeg,Bash,Ffmpeg,我有一堆.png文件 file_000.png file_005.png file_010.png 我正在使用继承的ffmpeg脚本将.png文件缝合到一个.mp4文件中。我不理解所有的标志,但我在过去成功地使用了这个脚本 ## images_to_movie.sh set -o noglob in_files=$1 out_file=$2 ffmpeg \ -framerate 10 \ -loglevel warning \ -pattern_type glob
file_000.png
file_005.png
file_010.png
我正在使用继承的ffmpeg脚本将.png文件缝合到一个.mp4文件中。我不理解所有的标志,但我在过去成功地使用了这个脚本
## images_to_movie.sh
set -o noglob
in_files=$1
out_file=$2
ffmpeg \
-framerate 10 \
-loglevel warning \
-pattern_type glob -i $in_files \
-pix_fmt yuv420p \
-vf 'crop=trunc(iw/2)*2:trunc(ih/2)*2:0:0' \
-y \
$out_file
用命令
./images_to_movie file_*.png files.mp4
我现在收到错误消息
编解码器“png”的不兼容像素格式“yuv420p”,自动选择
格式“rgb24”
一些调查显示
-pix_fmt yuv420p
已弃用,我应该改为使用
-pix_fmt yuv420p -color_range 2
但错误依然存在。我试着用
-pix_fmt rgb24
错误消失,但我不确定。mp4文件已创建
我需要如何修改此脚本以创建.mp4?出了什么问题
file.*.png
根本没有被传递到您的程序中,files.mp4
相反,当您运行/images\u to_movie file.*.png files.mp4
时,shell实际调用的是/images\u to_movie file.\u 000.png file.\u 005.png file.\u 010.png files.mp4
因此,file_000.png
被视为唯一的输入文件,而file_005.png
被视为要使用的输出文件。额外的参数(file_010.png
和files.mp4
)位于位置$3
和$4
;永远不会被阅读;因此完全被忽视
如何修复它 原始代码假定
/images\u to_movie file.*.png files.mp4
将文件.*.png
放入$1
和文件.mp4
放入$2
。除非file.*.png
没有匹配项,否则该假设是错误的
set-o noglob
阻止在脚本启动后进行全局扩展,但脚本内容中的任何内容都不能阻止调用脚本事先扩展全局。因此,您需要使用引号进行调用,类似于:
./images_to_movie 'file_*.png' files.mp4
…和脚本内容类似于:
#!/usr/bin/env bash
in_files=$1
out_file=$2
ffmpeg \
-framerate 10 \
-loglevel warning \
-pattern_type glob -i "$in_files" \
-pix_fmt rgb24 \
-vf 'crop=trunc(iw/2)*2:trunc(ih/2)*2:0:0' \
-y \
"$out_file"
注意,我们去掉了noglob
,而是引用了所有的扩展;这不仅可以防止globbing,还可以防止字符串拆分——因此,即使没有globbing,像File*.png
这样的模式也不会被拆分为一个单词File
和第二个单词*.png
。怎么了
file.*.png
根本没有被传递到您的程序中,files.mp4
相反,当您运行/images\u to_movie file.*.png files.mp4
时,shell实际调用的是/images\u to_movie file.\u 000.png file.\u 005.png file.\u 010.png files.mp4
因此,file_000.png
被视为唯一的输入文件,而file_005.png
被视为要使用的输出文件。额外的参数(file_010.png
和files.mp4
)位于位置$3
和$4
;永远不会被阅读;因此完全被忽视
如何修复它 原始代码假定
/images\u to_movie file.*.png files.mp4
将文件.*.png
放入$1
和文件.mp4
放入$2
。除非file.*.png
没有匹配项,否则该假设是错误的
set-o noglob
阻止在脚本启动后进行全局扩展,但脚本内容中的任何内容都不能阻止调用脚本事先扩展全局。因此,您需要使用引号进行调用,类似于:
./images_to_movie 'file_*.png' files.mp4
…和脚本内容类似于:
#!/usr/bin/env bash
in_files=$1
out_file=$2
ffmpeg \
-framerate 10 \
-loglevel warning \
-pattern_type glob -i "$in_files" \
-pix_fmt rgb24 \
-vf 'crop=trunc(iw/2)*2:trunc(ih/2)*2:0:0' \
-y \
"$out_file"
注意,我们去掉了
noglob
,而是引用了所有的扩展;这不仅可以防止全球化,但也可以防止字符串拆分——这样,像File*.png
这样的模式就不会被拆分为一个单词File
和第二个单词*.png
,即使在没有全局绑定的情况下。您有任何理由相信没有创建输出文件和您以前修复的错误之间存在关系吗?也就是说——为什么不忽略已经修复的错误,询问已修复错误的代码形式,只关注未创建的输出文件?这里有一个重要问题:set-o noglob
在脚本启动后阻止globs扩展。但是,当运行/images\u to_movie file.*.png files.mp4
时,在运行images\u to_movie
之前,该glob会展开,因此,$1
将成为第一个文件file.*.png
展开为,第二个是$2
,因此您的第二个.png文件可能会被一个.mp4输出替换。顺便说一句,如果您在脚本运行时使用bash-x./images\u to\u movie file.*.png files.mp4
将每一行记录到stderr,您可以在实践中看到这一点。您有任何理由相信没有创建输出文件与您以前修复的错误之间存在关系吗?也就是说——为什么不忽略已经修复的错误,询问已修复错误的代码形式,只关注未创建的输出文件?这里有一个重要问题:set-o noglob
在脚本启动后阻止globs扩展。但是,当运行/images\u to_movie file.*.png files.mp4
时,在运行images\u to_movie
之前,该glob会展开,因此,$1
将成为第一个文件file.*.png
展开为,第二个是$2
,因此您的第二个.png文件可能会被一个.mp4输出替换。顺便说一句,如果您使用bash-x./images\u to\u movie file.*.png files.mp4跟踪脚本,并在运行时将每一行记录到stderr,您可以在practice.Fixed中看到这一点。非常感谢。另外,使用正确的语法来防止globbing,我不再收到-pix_fmt yuv420p error.Fixed。非常感谢。另外,使用正确的语法来防止全局绑定,我不再收到-pix_fmt yuv420p错误。