如何使用ffmpeg中的pts

问题描述 投票:0回答:1

我有一个可以提供视频数据和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 的新手。请帮我。非常感谢!

ffmpeg decode display pts
1个回答
0
投票

我和你有同样的问题,你应该初始化一个 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答案是不支持。 希望我的回答对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.