如何在 ffmpeg 中设置 H.264 元数据(fixed_frame_rate_flag)

如何在 ffmpeg 中设置 H.264 元数据(fixed_frame_rate_flag)

我想fixed_frame_rate_flag在 H.264 元数据中设置MediaInfo 将报告恒定的帧速率扫描文件时。

据说我可以使用比特流过滤器设置该标志。我尝试将其添加-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.

在 ffmpeg 中设置此标志的正确方法是什么?

以下是完整命令:

ffmpeg -loglevel info -y \
  -loop 1 \
  -framerate 25 \
  -i backgroundImage.png \
  -r 25 \
  -c:v libx264 -b:v 0.45M -threads 2 -x264opts keyint=5:min-keyint=5 -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 \
  -bsf:v h264_metadata=fixed_frame_rate_flag=1 \
  -f mpegts -metadata service_name='Service01' -metadata service_name='DVStor' \
  -muxrate 0.65M \
  -t 15 \
  outputFile.ts  

編輯

有关更多信息,请参见命令的输出是否输出恒定帧速率;我们创建了一个 30 分钟的文件,提取了显示时间戳并在 excel 中进行分析。每帧的间隔正好为 40ms。

编辑二

我对 MediaInfo 代码不太熟悉,但从表面上看,如果流中存在AND,File_Avc.cpp:711则声明 VFR 。timing_info_present_flag = 1fixed_frame_rate_flag = 0

//From vui_parameters
float64 PixelAspectRatio=1;
if ((*seq_parameter_set_Item)->vui_parameters)
{
  ....
    if ((*seq_parameter_set_Item)->vui_parameters->timing_info_present_flag)
    {
        if (!(*seq_parameter_set_Item)->vui_parameters->fixed_frame_rate_flag)
            Fill(Stream_Video, StreamPos_Last, Video_FrameRate_Mode, "VFR");

相关内容