Bash ffmpeg:不兼容的像素格式';yuv420p';对于编解码器';巴布亚新几内亚;,自动选择格式';rgb24';

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

我有一堆.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 -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错误。