我正在尝试使用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大于或等于所需时间戳的数据包为止(不幸的是,我不再有代码了)。此条件会导致关键帧外观不佳。
感谢您的关注