同时使用两个 DjiCodecManager

Use two DjiCodecManager at the same time

我的无人机矩阵210.

大疆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? 如果没有,如何同时显示视频流?

大疆支持回答了我

使用两个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时指定的。