我正在尝试从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_);
我可能做错了什么?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的信息,您正尝试从DJI Matrice 600 Pro的Zenmuse Z3相机接收并解码H264视频流,但遇到了DJICodecManager解码失败(isDecodeOk == false)且YuvDataCallback未被调用的问题。结合您的代码片段和现有知识库资料,以下是一些可能的原因分析及建议:
视频源选择: 确保您正确选择了视频源。在您的代码中,使用了getPrimaryVideoFeed()
来添加数据监听器。如果视频流实际来自Secondary Video Feed,请确保更改此部分为getSecondaryVideoFeed()
。
解码器配置: DJICodecManager的初始化参数需仔细检查。在您的例子中,构造函数的宽高设置为0,这可能不正确。应确保宽高参数与视频流的实际分辨率匹配。正确的初始化方式应为:
DJICodecManager mCodecManager_ = new DJICodecManager(workContext, null, videoWidth, videoHeight, UsbAccessoryService.VideoStreamSource.Camera);
其中videoWidth
和videoHeight
需要根据实际视频流的分辨率来设定。
解码器状态监控: 检查DJICodecManager是否已成功初始化并且处于可以解码的状态。在启用YUV数据回调前,确认isDecoderReady()
返回true。
线程上下文: 确保workContext
是有效的,并且适用于多媒体解码操作。在Android环境中,通常推荐使用主线程以外的专用线程处理视频解码任务。
错误处理与日志: 添加详细的错误日志记录,特别是DJICodecManager的错误回调或状态变更通知,以便于定位问题。例如,监控onDecoderResult()
回调以获取解码失败的具体原因。
兼容性与版本: 确认使用的DJICodecManager版本与DJI SDK、设备固件版本兼容,有时软件版本不匹配也会导致解码问题。
综上所述,首先检查并修正视频源选择、解码器配置参数,以及确保解码环境的正确性。通过这些步骤,您应该能更接近解决问题。如果问题依旧,请深入查看SDK文档或联系DJI技术支持获取进一步帮助。