ffmpeg :: avcodec_encode_video设置PTS h264

时间:2011-07-06 22:49:13

标签: c++ h.264 video-encoding avcodec

我正在尝试使用libavcodec

将视频编码为H264

ffmpeg::avcodec_encode_video(codec,output,size,avframe);

返回错误,我没有正确设置avframe-> pts值 我尝试将其设置为0,1,AV_NOPTS_VALUE和90khz * framenumber但仍然出现错误non-strictly-monotonic PTS

ffmpeg.c示例使用ffmpeg :: av_rescale_q()设置packet.pts,但只有在对帧进行编码后才会调用它!

当与MP4V编解码器一起使用时,avcodec_encode_video()会自行正确设置pts值。

4 个答案:

答案 0 :(得分:7)

我有同样的问题,通过在调用avcodec_encode_video之前计算pts来解决它,如下所示:

//Calculate PTS: (1 / FPS) * sample rate * frame number
//sample rate 90KHz is for h.264 at 30 fps
picture->pts = (1.0 / 30) * 90 * frame_count;
out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture);

this helpful blog post

中窃取的解决方案

(注意:将采样率更改为khz,以hz表示,帧之间的距离太长,可能需要使用此值 - 这里不是视频编码专家,只是想要一些有用的功能,这样做了)

答案 1 :(得分:2)

我也有这个问题。我用这种方式解决了问题:

在你调用之前

ffmpeg::avcodec_encode_video(codec,output,size,avframe);

您将avframe的pts值设置为一个整数值,该值具有初始值0并且每次递增1,如下所示:

avframe->pts = nextPTS();

nextPTS()的实现是:

int nextPTS()
{
    static int static_pts = 0;
    return static_pts ++;
}

给avframe的pts值后,然后对其进行编码。如果编码成功。添加以下代码:

    if (packet.pts != AV_NOPTS_VALUE)
        packet.pts = av_rescale_q(packet.pts, mOutputCodecCtxPtr->time_base, mOutputStreamPtr->time_base);
    if (packet.dts != AV_NOPTS_VALUE)
         packet.dts = av_rescale_q(packet.dts, mOutputCodecCtxPtr->time_base, mOutputStreamPtr->time_base);

它将为编码的AVFrame添加正确的dts值。在代码中,包括AVPacket类型,类型为AVCodecContext *的mOutputCodeCtxPtr和类型为AVStream的mOutputStreamPtr。

avcodec_encode_video返回0表示当前帧已缓冲,您必须在所有帧都已编码后刷新所有缓冲的帧。代码刷新所有缓冲的帧有点像:

int ret;
while((ret = ffmpeg::avcodec_encode_video(codec,output,size,NULL)) >0)
    ;// place your code here.

答案 2 :(得分:0)

我也有这个问题。据我记忆,错误与dts

有关

设置

out_video_packet.dts = AV_NOPTS_VALUE;

帮助我

答案 3 :(得分:0)

严格增加单调函数是f(x)