开发者社区 问答 正文

为什么DJI SDK:DJI Matrice 600 Pro + Zenmuse Z3-原始流会损坏

我正在尝试从DJI Matrice 600 Pro(+ Zenmuse Z3)接收视频流。似乎VideoFeeder从SecondaryVideoFeed正确输出了原始H264,但DJICodecManager的isDecodeOk == false,并且根本没有调用YuvDataCallback。

这是视频流初始化源代码:

DJICodecManager  mCodecManager_ = new DJICodecManager(workContext, null, 0, 0, UsbAccessoryService.VideoStreamSource.Camera);
VideoFeeder.getInstance().getPrimaryVideoFeed().addVideoDataListener((bytes, size) ->  mCodecManager_.sendDataToDecoder(bytes, size));
mCodecManager_.enabledYuvData(true);
mCodecManager_.setYuvDataCallback(yuv_handler_);

我可能做错了什么?

展开
收起
垚tutu 2019-11-28 18:40:05 620 分享 版权
阿里云 AI 助理回答

根据您提供的信息,您正尝试从DJI Matrice 600 Pro的Zenmuse Z3相机接收并解码H264视频流,但遇到了DJICodecManager解码失败(isDecodeOk == false)且YuvDataCallback未被调用的问题。结合您的代码片段和现有知识库资料,以下是一些可能的原因分析及建议:

  1. 视频源选择: 确保您正确选择了视频源。在您的代码中,使用了getPrimaryVideoFeed()来添加数据监听器。如果视频流实际来自Secondary Video Feed,请确保更改此部分为getSecondaryVideoFeed()

  2. 解码器配置: DJICodecManager的初始化参数需仔细检查。在您的例子中,构造函数的宽高设置为0,这可能不正确。应确保宽高参数与视频流的实际分辨率匹配。正确的初始化方式应为:

    DJICodecManager mCodecManager_ = new DJICodecManager(workContext, null, videoWidth, videoHeight, UsbAccessoryService.VideoStreamSource.Camera);
    

    其中videoWidthvideoHeight需要根据实际视频流的分辨率来设定。

  3. 解码器状态监控: 检查DJICodecManager是否已成功初始化并且处于可以解码的状态。在启用YUV数据回调前,确认isDecoderReady()返回true。

  4. 线程上下文: 确保workContext是有效的,并且适用于多媒体解码操作。在Android环境中,通常推荐使用主线程以外的专用线程处理视频解码任务。

  5. 错误处理与日志: 添加详细的错误日志记录,特别是DJICodecManager的错误回调或状态变更通知,以便于定位问题。例如,监控onDecoderResult()回调以获取解码失败的具体原因。

  6. 兼容性与版本: 确认使用的DJICodecManager版本与DJI SDK、设备固件版本兼容,有时软件版本不匹配也会导致解码问题。

综上所述,首先检查并修正视频源选择、解码器配置参数,以及确保解码环境的正确性。通过这些步骤,您应该能更接近解决问题。如果问题依旧,请深入查看SDK文档或联系DJI技术支持获取进一步帮助。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: