如何使用ffmpeg av_seek_frame()获取具有帧号的同时读取任何帧 [英] How to read any frame while having frame number using ffmpeg av_seek_frame()

查看:429
本文介绍了如何使用ffmpeg av_seek_frame()获取具有帧号的同时读取任何帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

int64_t timeBase;
timeBase = (int64_t(pavStrm-> time_base.num) * AV_TIME_BASE) / int64_t(pavStrm->time_base.den);
int64_t seekTarget = int64_t(iFrameNumber) * timeBase;
av_seek_frame(fmt_ctx, -1, seekTarget, AVSEEK_FLAG_FRAME);

在这里我想阅读iFrameNumebr之后的下5帧

here I want to read next 5 frame after iFrameNumebr

for(int iCnt = 0; iCnt <= 4; iCnt++)
{
    iRet = av_read_frame(fmt_ctx, &pkt);
        do 
        {
            ret = decode_packet(&got_frame, 0);
            if (ret < 0)
                break;
            pkt.data += ret;
            pkt.size -= ret;

        }while (pkt.size > 0);
    av_free_packet(&pkt);
}

static int decode_packet(int *got_frame, int cached)
{
int ret = 0;
int decoded = pkt.size;
*got_frame = 0;

if (pkt.stream_index == video_stream_idx)
{
    /* decode video frame */
    ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
}

当我使用AVSEEK_FLAG_BACKWARD时,它的返回5包和5帧的前两个是空白但正确.

when i am using AVSEEK_FLAG_BACKWARD its return 5 packet and 5 frame first two is blank but correct.

当我使用AVSEEK_FLAG_FRAME时,它的返回5包和3帧(不是前3帧)不是它从视频返回的特定帧.

when i am using AVSEEK_FLAG_FRAME its return 5 packet and 3 frame which are not first 3 frame its return specific frame from video.

对于任何iFrameNumber

for any iFrameNumber

所以请帮助我如何获取具有帧号的帧以及av_seek_frame()的seektarget第三参数的确切值是什么

so please help me how to get frame while having frame number and what is exact value of seektarget 3rd param of av_seek_frame()

在将帧转换为rgb24格式时,我也遇到问题

also I have problem while converting frame to rgb24 format

推荐答案

int64_t FrameToPts(AVStream* pavStream, int frame) const
{
return (int64_t(frame) * pavStream->r_frame_rate.den *  pavStream-
>time_base.den) / 
(int64_t(pavStream->r_frame_rate.num) * 
pavStream->time_base.num);
}

iSeekTarget = FrameToPts(m_pAVVideoStream, max(0, lFrame));
iSuccess = av_seek_frame(m_pAVFmtCtx, m_iVideo_Stream_idx, 
iSeekTarget, iSeekFlag);

AVPacket avPacket;
iRet = av_read_frame(m_pAVFmtCtx, &avPacket);

这篇关于如何使用ffmpeg av_seek_frame()获取具有帧号的同时读取任何帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆