在libav中寻找框架

时间:2018-07-19 16:09:12

标签: c ffmpeg libav

我正在尝试使用libav解码帧(伪随机数)。但是我无法使用information gathered from the following post使它正常工作。

现在,我的代码在所需帧(实际上是时间戳)之前寻找第一个关键帧,并解码从该关键帧开始直至所需帧的所有帧。这导致性能很差(即使使用所有CPU内核)。就我而言,这是不可接受的,因为我需要实时解码视频。这是代码:

    int64_t seekTarget=av_rescale_q(us, AV_TIME_BASE_Q, videoFile->formatCtx->streams[videoFile->videoStream]->time_base);

    if(av_seek_frame(videoFile->formatCtx, -1, seekTarget, AVSEEK_FLAG_BACKWARD)<0)
        return NULL;
    avcodec_flush_buffers(videoFile->codecCtx);

    int64_t framePTS=0;
    do{
        int complete=0;
        AVPacket packet;

        do{
            av_init_packet(&packet);
            if(av_read_frame(videoFile->formatCtx, &packet)>=0){
                if(packet.stream_index==videoFile->videoStream){
                    int err;

                    err=avcodec_send_packet(videoFile->codecCtx, &packet);
                    if(err==0){} //All ok
                    else{
                        av_packet_unref(&packet);
                        return NULL;
                    }

                    err=avcodec_receive_frame(videoFile->codecCtx, videoFile->unfmtFrame);
                    if(err==0){
                        complete=1;
                        framePTS=packet.pts;
                    }else if(err==AVERROR(EAGAIN)){} //Frame isn't ready yet, repeat
                    else if(err<0){
                        av_packet_unref(&packet);
                        return NULL;
                    }
                }
                av_packet_unref(&packet);
            }else return NULL;
        }while(!complete);
    }while(framePTS<seekTarget);

但是,上面提到的帖子说:

  

然后检查前几个数据包的点数和持续时间,看看是否需要   放下他们

但我不知道丢弃数据包应遵循的标准。我尝试解码关键帧,然后丢弃所有数据包,直到到达PTS大于或等于所需时间戳的数据包为止(不幸的是,我不再有代码了)。此条件会导致关键帧外观不佳。

感谢您的关注

0 个答案:

没有答案