我正在使用FFMPEG对实时视频进行编码。如果我无法跟上实时编码,我需要删除帧。目前,我只是跳过原始帧的编码,下一帧的PTS是相同的。意思是,即使有一个跳过的帧,pts也总是1,2,3,4,5,6 ....
这会导致文件的播放及时跳过。相反,我想将空白帧添加到多路复用文件。我试着让PTS通过设置为1,2,4,5,8,....来表示跳帧,但FFMPEG h264编码器依赖于PTS是连续的。
如何将空数据传递到我的mp4 /容器,指示空白时间,以便解码器不会出现及时跳转,而只是看到延迟/冻结。
答案 0 :(得分:0)
您不需要创建空框架,在这种情况下,您应该自己管理PTS。对于视频PTS,每帧总是增加1。它是有保证的,所以你可以保证。
我还没有任何实时编码方面的经验,但是只要实时播放,如果只丢弃视频帧,与音频帧的同步可能会发生冲突。
为避免这种情况,您应该保存上一帧,然后在删除帧时进行克隆并填充它,或者也应该删除音频帧。但正如我所说,这只是因为我不知道什么对你最好。
以下是此案例中的puedo代码:
// you should drop / or drop and make the clone of previous frame.
static int64_t last_pts = 0; // just make sure initialize once.
if(frame->pts != AV_NOPTS_VALUE && is_video == true)
{
if(last_pts) frame->pts = last_pts + 1;
last_pts = frame->pts;
}