如何使用MediaRecorder实现安卓屏幕+内录音频推流至VLC及网页浏览器
安卓带音频屏幕实时推流可行方案
方案1:MediaProjection + FFmpeg 软硬编码结合推流
- 核心逻辑:你已经可以通过MediaRecorder拿到音视频原始数据,直接喂给FFmpeg做封装推流即可,无需依赖第三方封装库
- 实现步骤:
- 用
MediaProjection申请录屏权限后,分别采集视频原始帧(YUV/RGB格式)、音频原始PCM数据 - 调用FFmpeg接口分别对视频做H.264编码、音频做AAC编码,优先调用安卓自带的MediaCodec硬编,性能不足的机型自动降级到FFmpeg软编,可以解决之前的卡顿问题
- 根据播放端需求选择封装格式:
- 推RTSP流的话VLC可以直接拉流播放,延迟最低
- 推HLS流的话浏览器和VLC都能直接播放,兼容性最好,延迟大概3-10秒
- 封装成WebRTC流的话浏览器可以实现超低延迟播放,VLC 3.0+版本也支持WebRTC拉流
- 用
- 优势:可控度高,音视频同步可以通过时间戳对齐自主控制,不会出现无音频的问题,编码参数可以根据机型性能动态调整,避免卡顿
方案2:Surface + 系统MediaCodec直接编码推流
- 核心逻辑:绕开FFmpeg的额外依赖,仅用安卓系统原生API实现,包体积更小、性能开销更低
- 实现步骤:
- 将
MediaProjection创建的Surface直接传入MediaCodec的初始化参数,系统会自动把录屏画面喂给编码器,省掉原始帧内存拷贝的开销,性能表现更好 - 音频端用
AudioRecord采集系统内录+麦克风混合的PCM数据,传给MediaCodec编码成AAC格式 - 编码后的H.264和AAC裸流,手动封装成FLV格式推RTMP,或者封装成RTP包推RTSP:
- 推RTMP流的话可以在本地起一个轻量HTTP服务,浏览器用flv.js就能直接播放,VLC也原生支持RTMP拉流
- 将
- 优势:依赖少,硬编效率最高,低配置机型也不容易出现卡顿
兼容性适配注意点
- 音频部分要注意安卓10及以上才支持系统内录权限申请,低于安卓10的版本只能采集麦克风音频,提前做好权限判断
- 面向浏览器播放的流不要使用H.265编码,大部分浏览器默认不支持,统一用H.264 High Profile + AAC LC的编码组合,兼容性最好
- 推流码率不要设置过高,1080P分辨率设置2-4Mbps码率、30fps帧率即可,过高码率会导致弱网环境下播放卡顿
内容的提问来源于stack exchange,提问作者Tariq Hussain
相关产品推荐
相关产品推荐

