ffmpeg:编解码器“ png”的像素格式“ yuv420p”不兼容,自动选择格式“ rgb24”

时间:2019-08-09 14:51:14

标签: bash ffmpeg

我有一堆.png文件

sc = SparkContext.getOrCreate()
spark = SparkSession.builder.appName("test_Terminal").config("spark.sql.broadcastTimeout", "36000").getOrCreate()

flag_finish = False
flag_fail=False
while (!flag_finish) :
   if flag_fail : #kill current erroneous session 
      sc.stop()
      conf = pyspark.SparkConf().setAll([('spark.executor.memory', '60g'), 
      ('spark.driver.memory','30g'),('spark.executor.cores', '16'), 
      ('spark.driver.cores', '24'),('spark.cores.max', '32')])
      sc = pyspark.SparkContext(conf=conf)
      spark = SparkSession(sc)
      df = ...#read back from checkpoint or disk

   #process with current df or df picked up
   while .. :#this is where server tend to fail my job due after some time
       try :
          ##df processing and update
          ...
          df.checkpoint()
          df.count() #activate checkpoint 

          if complete :
              flag_finished = True
       exception Exception as e:
          flag_fail=True
          continue

我正在使用继承的ffmpeg脚本将.png文件缝合到.mp4文件中。我不了解所有标志,但是过去我已经成功使用了此脚本

file_000.png
file_005.png
file_010.png

使用命令

## 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

我现在收到错误

  

编解码器'png'的像素格式'yuv420p'不兼容,自动选择   格式为“ rgb24”

一些搜索显示

./images_to_movie file_*.png files.mp4

已弃用,我应该改用

-pix_fmt yuv420p

但错误仍然存​​在。我尝试使用

-pix_fmt yuv420p -color_range 2

错误消失了,但我没有创建.mp4文件。

如何修改此脚本以创建.mp4?

1 个答案:

答案 0 :(得分:2)

出了什么问题

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.mp4file_*.png放在$1中,而files.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滚滚。