我正在编写一个需要从M600接收视频供稿的android应用,但是我从光桥接收的供稿已损坏(仅在帧顶部显示了一些块状像素)。我已经尝试了AV和HDMI输入,具有不同的HDMI源和两个桥。 EXT摄像机(辅助视频输入)可以正常工作,而Mavic的视频也可以工作。问题是Feed在DJI Go中可以正常工作,因此无论如何这都是软件问题。这是我在代码中使用的简单回调:
mReceivedFirstVideoDataCallBack = new VideoFeeder.VideoDataCallback() {
@Override
public void onReceive(byte[] videoBuffer, int size) {
if (mCodecManager != null && !isSecondFeedSelected) {
mCodecManager.sendDataToDecoder(videoBuffer, size);
}
}
};
然后:VideoFeeder.getInstance().getPrimaryVideoFeed().setCallback(mReceivedFirstVideoDataCallBack);
我也尝试过使用provideTranscodedVideoFeed()
,没有区别。
运行DJI's own sample code ...
时遇到相同的问题Picture of the video feed from the example app。用ffmpeg解码的YUV屏幕截图产生了相似的结果。
那么我想念什么吗?还是SDK本身有问题(尝试将其更新到4.7.1,仍然没有运气),如果可以的话,可以解决该问题吗?
编辑:这是我设置给SurfaceView持有者的回调:
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
int videoViewWidth = mVideoSurfaceSmall.getWidth();
int videoViewHeight = mVideoSurfaceSmall.getHeight();
if (mCodecManager == null) {
mCodecManager = new DJICodecManager(activity, holder, videoViewWidth, videoViewHeight);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (mCodecManager != null) {
mCodecManager.cleanSurface();
mCodecManager.destroyCodec();
}
mCodecManager = new DJICodecManager(activity, holder, width, height);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCodecManager != null) {
mCodecManager.cleanSurface();
mCodecManager.destroyCodec();
mCodecManager = null;
}
}
};
答案 0 :(得分:0)
@Nic,请尝试使用setEXTVideoInputPortEnabled()
和setBandwidthAllocationForHDMIVideoInputPort()
触发正确的视频源。
在此之前,请确保已调用setChannelSelectionMode()
方法将选择模式设置为AUTO