You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动端SDK启用YuvData时RTMP直播功能失效问题咨询

DJICodecManager同时启用YUV回调与RTMP推流报错-3解决方案

问题根因

DJI Mobile SDK 中 DJICodecManager 的视频输出通道默认是独占模式:

  1. RTMP 推流功能默认会直接消费编码通道输出的H.264封装流,占用完整的编码链路
  2. enabledYuvData 方法启用后会劫持编码前的YUV原始帧缓冲区,默认会中断后续的编码输出链路,导致RTMP推流模块拿不到编码后的视频数据,返回状态码-3(SDK定义为视频流资源占用冲突)

解决方案

方案1:YUV帧回灌编码(推荐,全版本兼容)

  • 关闭SDK自带的RTMP推流功能,自行实现两路输出逻辑:
    1. 调用enabledYuvData(true)获取原始YUV帧
    2. 一路YUV帧直接喂给WebRTC的传输模块
    3. 另一路YUV帧送入你自己集成的硬件编码器(比如Android的MediaCodec、iOS的VideoToolbox)编码为H.264流
    4. 把编码后的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,可以直接调用官方预留的双输出接口,无需自行实现编码逻辑:
    1. 初始化DJICodecManager后先调用setDualOutputModeEnabled(true)开启双输出模式
    2. 再调用enabledYuvData(true)启用YUV回调
    3. 最后正常初始化RTMP推流模块即可,两个功能可并行运行
  • 注意:该模式下设备功耗会提升约15%,老旧机型可能出现帧率下降问题

注意事项

  • 不要在YUV回调中执行耗时操作,否则会同时影响WebRTC传输和RTMP推流的帧率
  • YUV帧默认格式为NV21,WebRTC和自定义编码器如果需要其他格式(比如I420)要提前做格式转换,转换操作建议放在子线程执行

内容的提问来源于stack exchange,提问作者Ravi Ranjan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:24:04