使用x264 avcodec_decode_video2()解码后,avi录像丢了4帧。分析原因得知,在解码的过程中,分析该帧图像如果不是关键帧,那么解压就会丢弃该帧,本来想在压缩的时候就直接设置参数属性没有B帧数据的那种属性,可是没有找到,后来只能在解压的时候想办法了。
while (av_read_frame(fmt_ctx, &pkt) >= 0)
{
if(pkt.stream_index == video_stream_idx)
{
ret = avcodec_decode_video2(video_dec_ctx, frame, &frame_finished, &pkt);
if (frame_finished)
{
ret = sws_scale(sws_ctx, (const uint8_t * const*)frame->data,frame->linesize, 0,
video_dec_ctx->height, frame_rgb->data,frame_rgb->linesize);
PRINTF("ret = %d\n",ret);
if (frame_total == 0)
{
//save the data
memcpy(buf, frame_rgb->data[0], picture_size);
av_free_packet(&pkt);
break;
}
else
{
ptrFunc(frame_rgb->data[0], video_dec_ctx->width, video_dec_ctx->height);
}
}
else
{
skipped_frame++;
}
}
av_free_packet(&pkt);
}
///用skipped_frame记录丢失了哪些帧,此处开始重新解压丢失的那些帧
PRINTF("skipper_frame: %d\n", skipped_frame);
for(int i = 0; i < skipped_frame; i++)
{
ret = avcodec_decode_video2(video_dec_ctx, frame, &frame_finished, &pkt);
if (frame_finished)
{
ret = sws_scale(sws_ctx, (const uint8_t * const*)frame->data,frame->linesize, 0,
video_dec_ctx->height, frame_rgb->data,frame_rgb->linesize);
if (frame_total == 0)
{
//save the data
memcpy(buf, frame_rgb->data[0], picture_size);
av_free_packet(&pkt);
break;
}
else
{
ptrFunc(frame_rgb->data[0], video_dec_ctx->width, video_dec_ctx->height);
}
}
}