我想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 = 1
fixed_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");