【问题标题】:ffmpeg: Incompatible pixel format 'yuv420p' for codec 'png', auto-selecting format 'rgb24'ffmpeg:编解码器“png”的像素格式“yuv420p”不兼容,自动选择格式“rgb24”
【发布时间】:2019-12-17 08:13:38
【问题描述】:

我有一堆 .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 文件?

【问题讨论】:

  • 您是否有理由相信未创建输出文件与您之前修复的错误之间存在关系?也就是说——为什么不忽略已经修复的错误,询问修复了该错误的代码形式,并关注没有创建输出文件?
  • 这里有一个重要问题:set -o noglob 在脚本启动后停止扩展 glob。但是,当您运行 ./images_to_movie file_*.png files.mp4 时,该 glob before 将完全扩展 images_to_movie 运行,因此您最终将 $1 作为第一个文件 file_*.png 扩展为,$2成为第二个。
  • ...所以您的第二个 .png 文件可能被替换为 .mp4 输出。顺便说一句,如果您使用 bash -x ./images_to_movie file_*.png files.mp4 跟踪脚本,在运行时将每一行记录到 stderr,您可以在实践中看到这一点。

标签: bash ffmpeg


【解决方案1】:

出了什么问题

file_*.png 根本没有被传递给你的程序——files.mp4 也没有。

相反,当您运行 ./images_to_movie file_*.png files.mp4 时,您的 shell 实际调用的是 ./images_to_movie file_000.png file_005.png file_010.png files.mp4

因此,file_000.png 被视为唯一的输入文件,file_005.png 被视为要使用的输出文件。额外的参数(file_010.pngfiles.mp4)在位置 $3$4;从未读过;并因此被完全忽略。


如何解决

原始代码假定./images_to_movie file_*.png files.mp4 将把file_*.png 放入$1files.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

【讨论】:

  • 已修复。谢谢你。此外,使用正确的语法来防止出现通配符,我不再收到 -pix_fmt yuv420p 错误。
猜你喜欢
  • 2018-01-27
  • 1970-01-01
  • 2016-11-24
  • 2016-05-17
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多