2024/04/12 15:13:17
发送关键帧
关键帧是自带全部解码信息的独立视频帧,解码时仅需本帧数据,无需参考其他图像。关键帧的设置会影响视频编解码效率和数据空间占用。本文介绍如何发送关键帧。
实现方法
发送端
发送端在调用 sendVideoData
方法发送视频帧时通过 VideoFrameInfo.type
参数告知 SDK 该视频帧是否为关键帧。
示例代码如下:
Java
int streamId = 0;
VideoFrameInfo videoFrameInfo = new VideoFrameInfo();
videoFrameInfo.video_data_type = VideoDataType.VIDEO_DATA_TYPE_H264;
videoFrameInfo.type = VideoFrameType.VIDEO_FRAME_KEY;
videoFrameInfo.frameRate = 15;
int ret = mRtcService.sendVideoData(mChannelName, streamId, videoBuffer, videoFrameInfo);
一帧视频数据被分成数包发送后,在弱网条件下很可能发生数据包丢失,导致接收端无法还原视频帧,从而发生丢帧。如果不加以处理则接收端将无法解码该 GOP 内的后续 P 帧,使得视频画面停滞,或解码失败出现花屏、绿屏等问题。
发送端长时间没有发送关键帧、关键帧丢失或损坏时,SDK 会通过 onKeyFrameGenReq
回调告知发送端为指定的视频流编码一个新的关键帧。
Java
@Override
public void onKeyFrameGenReq(int connId, int requestedUid, int streamType) {
// 发送端为指定的视频流编码一个新的关键帧
}
接收端
接收端解码出错时,可主动调用 requestVideoKeyFrame
方法请求关键帧。
示例代码如下:
Java
mRtcService.requestVideoKeyFrame(connId, remoteUid, streamType);
API 参考
开发过程中,你还可以参考如下文档,了解各 API 的详细信息: