使用ffmpeg、x264库强制编出关键帧(I帧)

您所在的位置:网站首页 强制ffmpeg不丢帧 使用ffmpeg、x264库强制编出关键帧(I帧)

使用ffmpeg、x264库强制编出关键帧(I帧)

2024-02-28 04:12| 来源: 网络整理| 查看: 265

使用ffmpeg、x264库强制编出关键帧(I帧) 背景

当h264数据在使用udp传输时,丢包是一件很常见的事情,当接收端丢包发生后,应该通知发送端,让发送端立刻重新发送一个关键帧。此时就需要编码器无视关键帧间隔立刻编出一个关键帧。

那么怎么让编码器立刻编出关键帧呢?接下来就列举常用的两种编码器ffmpeg、x264重编出关键帧的方法。

编码库的使用方法在网上有很多文章。本文假设读者已经了解编码库的使用,不再赘述编码库的使用。仅描述关键部分。

编码 x264 _pic->i_type = X264_TYPE_KEYFRAME; x264_encoder_encode(_encoder, &nal, &i_nal,_pic, &pic_out);

在使用x264编码器的x264_encoder_encode函数时,第四个参数存储要编码的YUV数据。其中有个成员i_type表示要求编码器编出的帧类型。通常我们默认会将这个i_type成员设为X264_TYPE_AUTO,表示由编码器自动选择类型。当我们想要强制编码出关键帧时,只要将这个i_type成员设为X264_TYPE_KEYFRAME即可,之后恢复为X264_TYPE_AUTO。

ffmpeg pFrame->pict_type = AV_PICTURE_TYPE_I; avcodec_encode_video2(pCodecCtx, &pkt,pFrame, &got_picture);

在使用ffmpeg编码器的avcodec_encode_video2函数时,第三个参数存储要编码的YUV数据。其中有个成员pict_type表示要求编码器编出的帧类型。通常我们默认不会设置这个pict_type,由编码器自动选择类型。当我们想要强制编码出关键帧时,只要将这个pict_type成员设为AV_PICTURE_TYPE_I即可,之后恢复为AV_PICTURE_TYPE_NONE。

总结

使用h264编码器强制编出关键帧,是实时视频传输中的一个关键的技术点,但是网上的博客只有ffmpeg的旧版本的方法,对于新版ffmpeg和x264库根本没有提及。所以我在此篇文章中将此技术点记录下来。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3