我想生成“时间码”视频,并需要输出恒定帧速率 (CFR)。我尝试了多种方法,包括过滤fps
器vsync
等,但媒体信息总是报告输出文件是 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_flag
H264 流中的来决定流是可变的还是固定的。
然而,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.
参考: