我有一个可以提供视频数据和PTS的图书馆。库头文件是这样的:
/**
* \brief Write mirror video H.264 frame to player.
* \param p_src Pointer to source buffer.
* \param size H.264 frame size. (unit: byte)
* \param ptsValue PTS value.
* \return Copied size. (unit: byte)
*/
int (*WriteMirrorVideoData)(const std::string& ip, const void *p_src, int size, double ptsValue);
如你所见,库给了我视频帧缓冲区地址和 PTS。
我使用FFMpeg正确解码视频数据。
我的问题是如何通过库提供的ptsValue来控制显示时间。
我需要将 ptsValue 设置为 AVFrame 吗?那么FFMPeg可以自己控制显示时间。 或者我需要通过自己的代码来控制显示?
我是 FFMpeg 的新手。请帮我。非常感谢!
我和你有同样的问题,你应该初始化一个 Avpackt 并设置 pts = yourpts(来自 libary),在设置值之前你可能需要使用 av_rescale_q 来处理该值。这是我的代码
for(int i =0; i < packets.size(); i++){
AVStream* st = fmtCtx->streams[vi];
AVPacket pkt;
av_init_packet(&pkt);
pkt.stream_index = st->index;
pkt.data = packet.data();
pkt.size = packet.size;
pkt.pts = av_rescale_q(Mypts[i] - Mypts[0], st->time_base,
AVRational{1, 20});
pkt.duration = 0;
pkt.pos = -1;
ret = av_interleaved_write_frame(fmtCtx, &pkt);
if (ret < 0) {
printf("cannot write frame");
}
}
我使用 dxgi 获取帧,因此我的 pts 来自 struct DXGI_OUTDUPL_FRAME_INFO::LastPresentTime。我还有一个问题,当我使用 av_rescale_q 时,我设置了最后一个参数 AVRational{1, 20},我不知道为什么,当我初始化 AVCodecContext 时,我设置了时基 AVRational{1, 30},但是如果我使用 30答案是不支持。 希望我的回答对你有帮助