Я пытаюсь реализовать приложение, которое отправляет живое видео с дрона на мой собственный сервер rtmp. Когда я использую LiveStreamManager из DJI Mobile SDK, он выдает мне код ошибки -3, и поток не запускается. Как я могу использовать этот API?
Мое приложение успешно регистрируется, я могу настраивать миссии и получать телеметрию от дрона. Но когда я пытаюсь использовать LiveStreamManeger, это не сработает, несмотря ни на что. Даже если реализовать именно так, как это реализовано в Образец кода, это не сработает. В документации в справочнике DJI API, похоже, также отсутствуют несколько методов.
Вот моя реализация
private void setupLiveStream() {
DJISDKManager.getInstance().getLiveStreamManager().registerListener(listener);
initListener();
DJISDKManager.getInstance().getLiveStreamManager().setAudioStreamingEnabled(false);
DJISDKManager.getInstance().getLiveStreamManager().setVideoSource(LiveStreamManager.LiveStreamVideoSource.Primary);
liveURL = "rtmp://mycustomrtmp.com/drone/live_testDJI";
}
private void initListener() {
listener = new LiveStreamManager.OnLiveChangeListener() {
@Override
public void onStatusChanged(int i) {
setResultToToast("status changed : " + i);
}
};
}
private void StartStreaming(){
if (!isLiveStreamManagerOn()) {
return;
}
if (DJISDKManager.getInstance().getLiveStreamManager().isStreaming()) {
setResultToToast("already started the Stream!");
return;
}
new Thread() {
@Override
public void run() {
DJISDKManager.getInstance().getLiveStreamManager().setLiveUrl(liveURL);// + vehicleID);
int result = DJISDKManager.getInstance().getLiveStreamManager().startStream();
DJISDKManager.getInstance().getLiveStreamManager().setStartTime();
setResultToToast("LiveStream Start: " + result +
"\n isVideoStreamSpeedConfigurable:" + DJISDKManager.getInstance().getLiveStreamManager().isVideoStreamSpeedConfigurable() +
"\n isLiveAudioEnabled:" + DJISDKManager.getInstance().getLiveStreamManager().isLiveAudioEnabled());
}
}.start();
}
Я всегда получаю код возврата -3. Когда я использую пример кода, я могу заставить его работать. Единственная разница в том, что я вызываю функцию isVideoStreamSpeedConfigurable(), она возвращает true в моем коде и false в примере кода. Но я не видел, где я могу установить эту вещь в false. Как мне реализовать LiveStreamingManager?
Отвечая на мой собственный вопрос...
Мне удалось решить проблему. По-видимому, чтобы иметь возможность использовать LiveStreamManager, вы должны сначала вызвать функцию VideoFeeder.getPrimaryVideoFeed() где-нибудь в своем коде, иначе она выдаст код ошибки -3.
Используя пример кода, в internal.utils.VideoFeedView есть класс, который можно использовать для этой цели.
Сначала я объявил частную собственность VideoFeedView.
Затем в моем конструкторе класса я вызываю функцию initUI.
private VideoFeedView primaryVideoFeed;
private void initUI() {
primaryVideoFeed.registerLiveVideo(VideoFeeder.getInstance().getPrimaryVideoFeed(),true);
startStreaming();
}
У меня такая же проблема, но ваше решение мне не подходит. Откуда вы это узнали, может там есть еще решения для меня.
На самом деле я нашел методом проб и ошибок. DJI MSDK практически нигде не поддерживается, и сама DJI, похоже, тоже не заинтересована. Нам, разработчикам, приходится копаться в этих обходных путях.
Я не знаю, повезло ли мне, но для меня следующий код решил мою проблему. Мне не нужно было ничего больше, например VideoFeedView. В чем причина использования этого? Я использую Mavic 2 Pro и транслирую 30 кадров в секунду 720p на YouTube.
private LiveStreamManager l;
public int live_streaming_start(String live_url){
Log.d("MavicMax", "LiveStream:live_streaming_start:" + live_url);
l = DJISDKManager.getInstance().getLiveStreamManager();
l.registerListener((x)->{Log.d("MavicMax", "LiveStream callback:" + x);});
l.setVideoSource(LiveStreamManager.LiveStreamVideoSource.Primary);
l.setVideoEncodingEnabled(true);
l.setLiveUrl(live_url);
int r = 0;
r = l.startStream();
return r;
}
Вы показываете живое видео пользователю? как использовать uxsdk и fpvwidget?
Да, я знаю, uxsdk, ты имеешь в виду, что без этого не работает?
Пока я использую пример кода и преобразовываю его в свое приложение. Процесс идет медленно, так как я удаляю классы один за другим и проверяю, как это повлияет на приложение.