我想将从 RTSP 源接收到的 h264 视频流保存到 MP4 容器。与其他关于 SO 的问题不同,我面临的挑战是:
该流包含 B 帧。
该流只有 RTP/RTCP 给出的 PTS。
这是我做的代码
// ffmpeg
pkt->data = ..;
pkt->size = ..;
pkt->flags = bKeyFrame? AV_PKT_FLAG_KEY : 0;
pkt->dts = AV_NOPTS_VALUE;
pkt->pts = PTS;
// PTS is based on epoch microseconds so I ignored re-scaling.
//av_packet_rescale_ts(pkt, { 1, AV_TIME_BASE }, muxTimebase);
auto ret = av_interleaved_write_frame(m_pAVFormatCtx, pkt);
我收到了很多这样的错误消息:“应用程序向 muxer 提供了无效的、非单调增加的 dts ...”。
结果:mp4 文件可以通过 VLC 播放,但 FPS 仅为原始 FPS 的一半,并且视频持续时间不正确(VLC 显示一个奇怪的数字)。
那么在发送到容器之前如何设置正确的 DTS 和 PTS 呢?
更新: 我尝试了一些更改,虽然还没有成功,但我发现帧率下降的原因是由于复用器丢弃了具有不正确 DTS 的帧。此外,如果我将 PTS 和 DTS 值设置得太大,一些播放器(如 VLC)必须延迟一段时间才能显示视频。