同时使用两个DjiCodecManager

时间:2019-01-24 11:51:06

标签: android dji-sdk

我的无人机矩阵210。

DJI Android SDK 4.7.1

设备CrystalSky CS785,Android 5.1.1

我应该同时显示两个摄像机的视频流,例如DJI Pilot。 我的解决方案: 我创建了两个差异DjiCodecManager,并将其用于不同的VideoFeeder调用库中。

DJICodecManager primaryDJICodecManager  = new DJICodecManager(Activity,
        pramirySurfaceTexture,
        pramirySurfaceTextureTextureWidth,
        pramirySurfaceTextureTextureHeight);

DJICodecManager secondaryDJICodecManager  = new DJICodecManager(Activity,
        secondarySurfaceTexture,
        secondarySurfaceTextureTextureWidth,
        secondarySurfaceTextureTextureHeight);

pramirySurfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() {
    @Override
    public void onFrameAvailable(SurfaceTexture surfaceTexture) {
        surfaceTexture.updateTexImage();
    }
});

secondarySurfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() {
    @Override
    public void onFrameAvailable(SurfaceTexture surfaceTexture) {
        surfaceTexture.updateTexImage();
    }
});

VideoFeeder.VideoFeed videoFeed = VideoFeeder.getInstance().getPrimaryVideoFeed();
VideoFeeder.VideoFeed secondaryVideoFeed = VideoFeeder.getInstance().getSecondaryVideoFeed();

secondaryVideoFeed.setCallback(new VideoFeeder.VideoDataCallback() {
    @Override
    public void onReceive(byte[] videoBuffer, int size) {
        if (DjiManagers.mSecondaryCodecManager != null) {
            secondaryDJICodecManager.sendDataToDecoder(videoBuffer, size);
        }
    }
});

videoFeed.setCallback(new VideoFeeder.VideoDataCallback() {
    @Override
    public void onReceive(byte[] videoBuffer, int size) {
        if (DjiManagers.mCodecManager != null) {
            primaryDJICodecManager.sendDataToDecoder(videoBuffer, size);
        }
    }
});

但是pramirySurfaceTexture回调不起作用。在第二个纹理上,交替显示来自不同相机(彩色和灰度(我使用热像仪)的图像)的图像,但最常见的是绿色。

是否可以创建和使用两个DJICodecManager? 如果没有,我如何同时显示视频流?

1 个答案:

答案 0 :(得分:0)

DJI支持人员回答了我。

使用两个DJICodecManafers。您必须使用其他构造函数:

primaryDJICodecManager = new DJICodecManager(Activity,
                    djiSdkWrapper.getSurfaceTexture(),
                    djiSdkWrapper.getSurfaceTextureWidth(),
                    djiSdkWrapper.getSurfaceTextureHeight(),
                    videoStreamSource);

其中的videoStreamSource是其中之一:

UsbAccessoryService.VideoStreamSource.Camera
UsbAccessoryService.VideoStreamSource.Fpv
UsbAccessoryService.VideoStreamSource.SecondaryCamera

当您发送数据进行解码时,您必须使用其他 sendDataToDecode 方法:

primaryDJICodecManager.sendDataToDecoder(array, size, index);

其中 intdex 是其中之一:

UsbAccessoryService.VideoStreamSource.Camera.getIndex()
UsbAccessoryService.VideoStreamSource.Fpv.getIndex()
UsbAccessoryService.VideoStreamSource.SecondaryCamera.getIndex()

与创建DJICodecManager时指定的内容相同。