我正在尝试使用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值。
答案 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);
中窃取的解决方案
(注意:将采样率更改为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)