Я пишу приложение для Android, которое должно получать видеопотоки от M600, но фид, который я получаю от светового моста, поврежден (отображаются только некоторые блочные пиксели в верхней части кадра).Я пробовал оба входа AV и HDMI, с разными источниками HDMI и на двух маяках.Однако камера EXT (вторичная видеокамера) работает, как и видео с Mavic.Дело в том, что канал отлично работает в 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 ...
Изображение видеопотока из примера приложения .Скриншоты YUV, декодированные с помощью ffmpeg, дают схожие результаты.
Так что, я что-то упустил?Или что-то не так с самим 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;
}
}
};