ffmpeg 是否因 h.264 RTP 输出而损坏?

Is ffmpeg broken for h.264 RTP Output?

我使用 wireshark 捕获通过以下方式发送的 RTP 流:

ffmpeg -f lavfi -i "testsrc=duration=5:size=cif:rate=25" -pix_fmt yuv420p -g 25 -bf 2 -an -c:v libx264 -f rtp rtp://127.0.0.1:1234 > play.sdp

ffmpeg -版本 ffmpeg 版本 git-2020-03-15-c467328 版权所有 (c) 2000-2020 FFmpeg 开发者

如粗体所示,RTP 时间戳向前和向后。我希望它们对于帧中的每个数据包都是相同的,然后根据 H.264/RTP 规范只前进 40 毫秒(+3600 在 90khz 时钟)。

此外,根据该规范,帧中的最后一个数据包应该设置其标记位,但这里几乎所有数据包都设置了该位。

我是不是做错了什么?不明白什么?还是 ffmpeg 对编写 H.264 RTP 的支持被破坏了?

SSRC=0xA49C3DC9,序列号=3595,时间=3153114809
SSRC=0xA49C3DC9,序列号=3596,时间=3153114809
SSRC=0xA49C3DC9,序列号=3597,时间=3153114809
SSRC=0xA49C3DC9,Seq=3598,Time=3153114809,Mark
SSRC=0xA49C3DC9,Seq=3599,Time=3153125609,Mark
SSRC=0xA49C3DC9,Seq=3600,Time=3153118409,Mark
SSRC=0xA49C3DC9,Seq=3601,Time=3153122009,Mark
SSRC=0xA49C3DC9,Seq=3602,Time=3153136409,Mark
SSRC=0xA49C3DC9,Seq=3603,Time=3153129209,Mark
SSRC=0xA49C3DC9,Seq=3604,Time=3153132809,Mark
SSRC=0xA49C3DC9,Seq=3605,Time=3153147209,Mark
SSRC=0xA49C3DC9,Seq=3606,Time=3153140009,Mark
SSRC=0xA49C3DC9,Seq=3607,Time=3153143609,Mark
SSRC=0xA49C3DC9,Seq=3608,Time=3153158009,Mark
SSRC=0xA49C3DC9,Seq=3609,Time=3153150809,Mark
SSRC=0xA49C3DC9,Seq=3610,Time=3153154409,Mark
SSRC=0xA49C3DC9,Seq=3611,Time=3153168809,Mark
SSRC=0xA49C3DC9,Seq=3612,Time=3153161609,Mark
SSRC=0xA49C3DC9,Seq=3613,Time=3153165209,Mark
SSRC=0xA49C3DC9,Seq=3614,Time=3153179609,Mark
SSRC=0xA49C3DC9,Seq=3615,Time=3153172409,Mark
SSRC=0xA49C3DC9,Seq=3616,Time=3153176009,Mark
SSRC=0xA49C3DC9,Seq=3617,Time=3153190409,Mark
SSRC=0xA49C3DC9,Seq=3618,Time=3153183209,Mark

添加-re输入选项,否则它会尝试尽可能快地编码,这不利于直播:

ffmpeg -f lavfi -re -i "testsrc=duration=5:size=cif:rate=25" -pix_fmt yuv420p -g 25 -bf 2 -c:v libx264 -f rtp rtp://127.0.0.1:1234 > play.sdp

规范 RFC 6184 表示标记位,

Set for the very last packet of the access unit indicated by the RTP timestamp

编码器正在为每个 AU 编码一帧,所以这里没有损坏。

时间戳是非单调的,因为您启用了 B 帧。 B 帧显示在任何参考的 P 帧之前,但在编码期间在它之后编码并按编码顺序发出。设置 -bf 0 以禁用 B 帧并具有单调 PTS。