首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

如何强制ffmpeg编码时输出一个关键帧

发布网友 发布时间:2022-04-21 19:21

我来回答

2个回答

热心网友 时间:2023-08-07 08:01

如何强制ffmpeg编码时输出一个关键帧
AVCodecContext *c //编码器环境句柄AVFrame* f //需要编码的一帧视频 在编码前设置
f->pict_type=FF_I_TYPE;
f->key_frame=1;

然后编码
*outsize = avcodec_encode_video(c, temp, outbuf_size, f);

则编码之后通过如下参数判断是否为关键帧:
key_frame=c->coded_frame->key_frame;
pict_type=c->coded_frame->pict_type;

热心网友 时间:2023-08-07 08:01

int main()
{
SwsContext *pSWSCtx;
AVFormatContext *pFormatCtx;
const char *filename="sample.mpg";
int i,videoStream,y_size;
AVCodecContext *pCodecCtx;
AVFrame *pFrame;
AVFrame *pFrameRGB;
int numBytes,frameFinished;
uint8_t *buffer;
static AVPacket packet;

av_register_all();

if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0)
printf("error!\n");

if(av_find_stream_info(pFormatCtx)<0)
printf("error!\n");

mp_format(pFormatCtx, 0, filename, false);

videoStream=-1;

for(i=0; i<pFormatCtx->nb_streams; i++)
if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO)
{
videoStream=i;
break;
}
if(videoStream==-1)
printf("error!\n");// Didn't find a video stream

pCodecCtx=pFormatCtx->streams[videoStream]->codec;
AVCodec *pCodec;

pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
if(pCodec==NULL)
printf("error!\n");

if(avcodec_open(pCodecCtx, pCodec)<0)
printf("error!\n");
pFrame=avcodec_alloc_frame();

pFrameRGB = avcodec_alloc_frame();
numBytes=avpicture_get_size(PIX_FMT_BGR24, pCodecCtx->width,pCodecCtx->height);
buffer=new uint8_t[numBytes];
avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,pCodecCtx->width, pCodecCtx->height);
pSWSCtx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);

i=0;
while(av_read_frame(pFormatCtx,&packet)>=0)
{
if(packet.stream_index==videoStream)
{
avcodec_decode_video(pCodecCtx, pFrame, &frameFinished,packet.data, packet.size);
if(frameFinished)
{
if(pFrame->key_frame==1)//这里取到关键帧数据
{
sws_scale(pSWSCtx, pFrame->data, pFrame->linesize,0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
i++;
}
}
}
av_free_packet(&packet);
}

av_free(pFrameRGB);

av_free(pFrame);

sws_freeContext(pSWSCtx);

avcodec_close(pCodecCtx);

av_close_input_file(pFormatCtx);

return 0;

}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com