安卓 APP 视频流推送卡顿问题解析与解决方案
在安卓 APP 开发中,实现将视频流推送至 OBS 播放是一个常见需求。今天,就来聊聊在这个过程里遇到的卡顿问题及解决方案。
应用实现基础
最初实现的 APP,能够通过camera进行视频采集,采集到的内容会发送给MediaCodec做编解码处理,之后经过加工编码输出的内容,会直接借助 RTP 库进行 RTP 推送。在 OBS 端,通过添加 VLC 视频即可播放手机端推送过来的视频流。当以camera采集视频内容,并以 30 帧的方式进行编解码和推送时,视频播放流畅,毫无卡顿问题。
录屏功能引发的卡顿
然而,当需求变更,需要实现安卓手机录屏功能,将视频采集源从camera切换到MediaProjection后,尽管后续的编解码和 RTP 推送部分代码未作改变,但播放端却出现了卡顿现象。
录屏功能引发的卡顿
然而,当需求变更,需要实现安卓手机录屏功能,将视频采集源从camera切换到MediaProjection后,尽管后续的编解码和 RTP 推送部分代码未作改变,但播放端却出现了卡顿现象。
卡顿原因剖析
经过深入调查发现,卡顿问题的根源在于视频帧生成的频率与预期设置的频率不一致。原本在MediaCodec中设置了 30 帧的频率,RTP 同样配置为 30 帧频率,以为这样就能掌控视频生成端的频率。但实际情况是,当使用MediaProjection进行录屏视频采集时,由于设备差异,MediaProjection的视频生成频率可能是 60 帧,甚至 120 帧。这就使得视频生产端与预设频率不匹配,进而与 RTP 发送频率也不同,最终导致卡顿问题的出现。
解决方案探究
为解决这一问题,在使用Surface结合SurfaceTexture设置视频源时,必须充分考虑视频源的视频帧生成频率。关键在于采用在SurfaceTexture的OnFrameAvailableListener回调中进行视频帧的跳帧处理方式。具体而言,依据实际需求的频率进行设置,若频率过快,便执行跳帧操作,丢弃多余的帧。因为从视频源角度,无法设置和避免其以更快频率发送视频,所以只能通过跳帧处理来解决卡顿问题。
总之,在安卓 APP 开发涉及视频流推送场景时,对视频帧频率的把控至关重要,希望本次分享能给大家在处理类似问题时带来启发。
夜雨聆风