移动端SDK启用YuvData时RTMP直播功能失效问题咨询
DJICodecManager同时启用YUV回调与RTMP推流报错-3解决方案
问题根因
DJI Mobile SDK 中
DJICodecManager的视频输出通道默认是独占模式:
- RTMP 推流功能默认会直接消费编码通道输出的H.264封装流,占用完整的编码链路
enabledYuvData方法启用后会劫持编码前的YUV原始帧缓冲区,默认会中断后续的编码输出链路,导致RTMP推流模块拿不到编码后的视频数据,返回状态码-3(SDK定义为视频流资源占用冲突)
解决方案
方案1:YUV帧回灌编码(推荐,全版本兼容)
- 关闭SDK自带的RTMP推流功能,自行实现两路输出逻辑:
- 调用
enabledYuvData(true)获取原始YUV帧 - 一路YUV帧直接喂给WebRTC的传输模块
- 另一路YUV帧送入你自己集成的硬件编码器(比如Android的
MediaCodec、iOS的VideoToolbox)编码为H.264流 - 把编码后的H.264流送入自行集成的RTMP推流库完成推流
- 调用
- Android端核心代码示例:
// 启用YUV回调 djiCodecManager.enabledYuvData(true); // 绑定YUV帧回调 djiCodecManager.setYuvDataCallback((width, height, yuvData, timestamp) -> { // 送WebRTC传输链路 webRtcModule.pushYuvFrame(yuvData, width, height, timestamp); // 送自定义硬件编码器 mediaCodec.queueInputBuffer(yuvData, timestamp); }); // 编码器输出回调中执行RTMP推流 mediaCodec.setOnOutputBufferAvailableListener((h264Data, isKeyFrame, timestamp) -> { rtmpModule.pushH264Frame(h264Data, isKeyFrame, timestamp); });
方案2:SDK双输出模式(仅支持v4.16及以上版本DJI SDK)
- 如果你使用的是4.16及以上版本的DJI Mobile SDK,可以直接调用官方预留的双输出接口,无需自行实现编码逻辑:
- 初始化
DJICodecManager后先调用setDualOutputModeEnabled(true)开启双输出模式 - 再调用
enabledYuvData(true)启用YUV回调 - 最后正常初始化RTMP推流模块即可,两个功能可并行运行
- 初始化
- 注意:该模式下设备功耗会提升约15%,老旧机型可能出现帧率下降问题
注意事项
- 不要在YUV回调中执行耗时操作,否则会同时影响WebRTC传输和RTMP推流的帧率
- YUV帧默认格式为NV21,WebRTC和自定义编码器如果需要其他格式(比如I420)要提前做格式转换,转换操作建议放在子线程执行
内容的提问来源于stack exchange,提问作者Ravi Ranjan
相关产品推荐
相关产品推荐

