ffmpeg:编码“时间码”视频时强制恒定帧速率

ffmpeg:编码“时间码”视频时强制恒定帧速率

我想生成“时间码”视频,并需要输出恒定帧速率 (CFR)。我尝试了多种方法,包括过滤fpsvsync等,但媒体信息总是报告输出文件是 VFR。

如何强制恒定帧速率输出?

命令:

ffmpeg -loglevel info -y \
  -loop 1 \
  -i backgroundImage.png \
  -r 25 \
  -vsync cfr \
  -t 15 \
  -c:v libx264 -b:v 0.45M -threads 2 \
  -x264opts fps=25:keyint=25:min-keyint=25 -tune stillimage \
  -filter_complex \
  fps=fps=25,format=yuv420p,drawtext=fontfile='/fonts/NotoSans-Bold.ttf':x=30:y=400:fontcolor=white::fontsize=100:text='%{pts\\:localtime\\:1689994200}' \
  -sws_flags bilinear \
  -f mpegts -metadata service_name='Service01' -metadata service_name='MyService' \
  -muxrate 0.5M \
  outputTimecodeFile.ts  

MediaInfo 表示:

Width                                    : 1280
Height                                   : 720
Pixel aspect ratio                       : 1.000
Display aspect ratio                     : 16:9
Frame rate mode                          : VFR
Frame rate mode                          : Variable
Color space                              : YUV

編輯

根据1NN相关链接我尝试在输入-framerate前放置-i(见下文)。

然而结果是一样的:MediaInfo 报告“可变帧速率”...

ffmpeg -loglevel info -y \
  -loop 1 \
  -framerate 25 \
  -i backgroundImage.png \
  -r 25 \
  -t 15 \
  -c:v libx264 -b:v 0.45M -threads 2 -x264opts keyint=25:min-keyint=25 -tune stillimage \
  -filter_complex \
  format=yuv420p,drawtext=fontfile='fonts/NotoSans-Bold.ttf':x=30:y=400:fontcolor=white::fontsize=100:text='%{pts\\:localtime\\:1689994200}' \
  -sws_flags bilinear \
  -f mpegts -metadata service_name='Service01' -metadata service_name='myService' \
  -muxrate 0.5M \
  timecodeFile.ts  

编辑二

根据此 MediaInfo 错误报告,MediaInfo 使用fixed_frame_rate_flagH264 流中的来决定流是可变的还是固定的。

然而,ffmpeg 正在创建设置为零的流fixed_frame_rate_flag(使用ffmpeg -i inputFile.ts -c:v copy -bsf:v trace_headers -f null - 2>&1 | grep fixed_frame_rate

据说我可以使用比特流过滤器设置该标志。我尝试将其添加-bsf:v h264_metadata=fixed_frame_rate_flag=1到命令中,但出现了很多错误:

Error applying bitstream filters to an output packet for stream #0:0.
[h264_metadata @ 0x1887380] PPS id 0 not available.
[h264_metadata @ 0x1887380] Failed to write unit 0 (type 1).
[h264_metadata @ 0x1887380] Failed to write access unit into packet.

参考:

相关内容