如何解决FFMPEG 编码器:应用程序向流中的多路复用器提供了无效的、非单调递增的 dts
我正在使用 h264 编解码器和 mp4 容器编码视频。源是我从内存中加载的一系列图像。编码似乎运行良好。我能够验证编码的帧的确切数量,但是我在会话结束时从终端中的复用器收到以下警告/错误是什么错误:
应用程序提供了无效的、非单调递增的 dts 流 0 中的多路复用器:
我尝试了不同的技术来计算 pts/dts,结果是一样的。不过我确实注意到,avcodec_receive_packet()
有时会无序返回数据包,所以这可能是警告的原因吗?下面是我对图像数据进行编码的函数。
bool LibAVEncoder::EncodeFrame(uint8_t* data)
{
int err;
if (!mVideoFrame)//init frame once
{
mVideoFrame = av_frame_alloc();
mVideoFrame->format = mVideoStream->codecpar->format;
mVideoFrame->width = mCodecContext->width;
mVideoFrame->height = mCodecContext->height;
if ((err = av_frame_get_buffer(mVideoFrame,0)) < 0)
{
printf("Failed to allocate picture: %i\n",err);
return false;
}
}
err = av_frame_make_writable(mVideoFrame);
if (!mSwsCtx)
{
mSwsCtx = sws_getContext(mCodecContext->width,mCodecContext->height,AV_PIX_FMT_RGBA,mCodecContext->width,AV_PIX_FMT_YUV420P,SWS_BICUBIC,0);
}
const int inLinesize[1] = { 4 * mCodecContext->width };
// RGBA to YUV
sws_scale(mSwsCtx,(const uint8_t* const*)&data,inLinesize,mVideoFrame->data,mVideoFrame->linesize);
mVideoFrame->pts = mFrameCount++;
//Encoding
err = avcodec_send_frame(mCodecContext,mVideoFrame);
if (err < 0)
{
printf("Failed to send frame: %i\n",err);
return false;
}
while (err >= 0)
{
err = avcodec_receive_packet(mCodecContext,mPacket);
if (err == AVERROR(EAGAIN))
{
return true;
}
else if (err == AVERROR_EOF)
{
return true;
}
else if (err < 0)
{
fprintf(stderr,"Error during encoding,shutting down\n");
exit(1);
}
// 1. way of calc pts/dts
mPacket->pts = av_rescale_q_rnd(mPacket->pts,mCodecContext->time_base,mVideoStream->time_base,AVRounding(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
mPacket->dts = av_rescale_q_rnd(mPacket->dts,AVRounding(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
mPacket->duration = av_rescale_q(mPacket->duration,mVideoStream->time_base);
/*
//2. another way of calc pts/dts
const int64_t duration = av_rescale_q(1,mVideoStream->time_base);
mPacket->duration = duration;
mPacket->pts = totalDuration;
mPacket->dts = totalDuration;
totalDuration += duration;
*/
mPacket->stream_index = mVideoStream->index;
av_interleaved_write_frame(mOFormatContext,mPacket);
av_packet_unref(mPacket);
}
return true;
}
如果您能指出我在这里做错了什么,我将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。