makcar/app/src/main/java/com/aros/apron/manager/StreamManager.java

375 lines
18 KiB
Java
Raw Normal View History

2026-01-30 11:47:32 +08:00
package com.aros.apron.manager;
2026-03-12 14:57:34 +08:00
import android.content.Context;
2026-01-30 11:47:32 +08:00
import android.os.Handler;
2026-03-12 14:57:34 +08:00
import android.os.Looper;
2026-01-30 11:47:32 +08:00
import android.util.Log;
import androidx.annotation.NonNull;
import com.aros.apron.base.BaseManager;
import com.aros.apron.entity.MessageDown;
import com.aros.apron.entity.Movement;
import com.aros.apron.tools.LogUtil;
import com.aros.apron.tools.PreferenceUtils;
2026-03-12 14:57:34 +08:00
import com.aros.apron.tools.SimplePortScanner;
2026-01-30 11:47:32 +08:00
import com.google.gson.Gson;
import dji.sdk.keyvalue.key.CameraKey;
import dji.sdk.keyvalue.key.DJIKey;
2026-03-12 14:57:34 +08:00
import dji.sdk.keyvalue.key.FlightControllerKey;
2026-01-30 11:47:32 +08:00
import dji.sdk.keyvalue.key.KeyTools;
import dji.sdk.keyvalue.key.ProductKey;
import dji.sdk.keyvalue.value.camera.CameraType;
import dji.sdk.keyvalue.value.common.ComponentIndexType;
import dji.v5.common.callback.CommonCallbacks;
import dji.v5.common.error.IDJIError;
import dji.v5.manager.KeyManager;
import dji.v5.manager.datacenter.MediaDataCenter;
import dji.v5.manager.datacenter.livestream.LiveStreamSettings;
import dji.v5.manager.datacenter.livestream.LiveStreamStatus;
import dji.v5.manager.datacenter.livestream.LiveStreamStatusListener;
import dji.v5.manager.datacenter.livestream.LiveStreamType;
import dji.v5.manager.datacenter.livestream.LiveVideoBitrateMode;
import dji.v5.manager.datacenter.livestream.StreamQuality;
import dji.v5.manager.datacenter.livestream.settings.RtmpSettings;
import dji.v5.manager.datacenter.livestream.settings.RtspSettings;
import dji.v5.manager.interfaces.ILiveStreamManager;
public class StreamManager extends BaseManager {
private StreamManager() {
}
private static class StreamHolder {
private static final StreamManager INSTANCE = new StreamManager();
}
public static StreamManager getInstance() {
return StreamHolder.INSTANCE;
}
2026-03-12 14:57:34 +08:00
public void stopstream(){
ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager();
liveStreamManager.stopStream(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
LogUtil.log(TAG,"直播关闭成功");
}
@Override
public void onFailure(@NonNull IDJIError idjiError) {
LogUtil.log(TAG,"直播关闭失败");
}
});
}
public void startstream(){
ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager();
liveStreamManager.startStream(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
LogUtil.log(TAG,"直播开启成功");
}
@Override
public void onFailure(@NonNull IDJIError idjiError) {
LogUtil.log(TAG,"直播开启成功失败");
}
});
}
2026-01-30 11:47:32 +08:00
public void initStreamManager() {
ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager();
if (liveStreamManager != null) {
liveStreamManager.addLiveStreamStatusListener(new LiveStreamStatusListener() {
@Override
public void onLiveStreamStatusUpdate(LiveStreamStatus status) {
if (status != null) {
Movement.getInstance().setLiveStatus(status.isStreaming() ? 1 : 0);
2026-03-04 11:20:07 +08:00
Log.d(TAG, "推流状态" + status.isStreaming() + "帧率:" + status.getFps() + "--" + "码率:" + status.getVbps() + "---" + "延迟:" + status.getRtt());
2026-03-12 14:57:34 +08:00
2026-01-30 11:47:32 +08:00
}
}
@Override
public void onError(IDJIError error) {
}
});
}
}
public void startLive(MessageDown message) {
2026-03-04 11:20:07 +08:00
sendMsg2Server(message);
2026-01-30 11:47:32 +08:00
}
public void setLiveStreamQuality(MessageDown message) {
Boolean isAircraftConnected = KeyManager.getInstance().getValue(DJIKey.create(ProductKey.KeyConnection));
if (isAircraftConnected == null || !isAircraftConnected) {
LogUtil.log(TAG, "飞行器未连接");
sendFailMsg2Server(message, "飞行器未连接");
} else {
ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager();
if (liveStreamManager.isStreaming()) {
2026-03-04 11:20:07 +08:00
if (message.getData().getVideo_quality() == 0 || message.getData().getVideo_quality() == 4) {
2026-01-30 11:47:32 +08:00
liveStreamManager.setLiveStreamQuality(StreamQuality.ORIGINAL);
2026-03-04 11:20:07 +08:00
} else {
2026-01-30 11:47:32 +08:00
liveStreamManager.setLiveStreamQuality(StreamQuality.find(message.getData().getVideo_quality()));
}
sendMsg2Server(message);
} else {
sendFailMsg2Server(message, "推流未开启");
}
}
}
private int startLiveFailTimes;
private boolean isLiveStreamAlreadyStart;
//知眸测试
public void startLiveWithCustom() {
Boolean isAircraftConnected = KeyManager.getInstance().getValue(DJIKey.create(ProductKey.KeyConnection));
if (isAircraftConnected == null || !isAircraftConnected) {
LogUtil.log(TAG, "飞行器未连接");
} else {
ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager();
LogUtil.log(TAG, "自定义推流地址:" + PreferenceUtils.getInstance().getCustomStreamUrl());
LiveStreamSettings.Builder streamSettingBuilder = new LiveStreamSettings.Builder();
LiveStreamSettings streamSettings = streamSettingBuilder.setLiveStreamType(LiveStreamType.RTMP)
.setRtmpSettings(new RtmpSettings.Builder().setUrl(PreferenceUtils.getInstance().getCustomStreamUrl()
).build()).build();
liveStreamManager.setLiveStreamSettings(streamSettings);
CameraType value = KeyManager.getInstance().getValue(KeyTools.createKey(CameraKey.KeyCameraType, ComponentIndexType.PORT_1));
// if (value != null && (value == CameraType.ZENMUSE_H20T ||
// value == CameraType.ZENMUSE_H20N || value == CameraType.ZENMUSE_H20)
// || value == CameraType.ZENMUSE_H30 || value == CameraType.ZENMUSE_H30T) {
2026-03-04 11:20:07 +08:00
liveStreamManager.setCameraIndex(ComponentIndexType.PORT_1);
2026-01-30 11:47:32 +08:00
// } else {
// liveStreamManager.setCameraIndex(ComponentIndexType.FPV);
// }
liveStreamManager.setLiveStreamQuality(StreamQuality.FULL_HD);
liveStreamManager.setLiveVideoBitrateMode(LiveVideoBitrateMode.AUTO);
if (!liveStreamManager.isStreaming()) {
liveStreamManager.startStream(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
LogUtil.log(TAG, "自定义推流启动成功");
2026-03-04 11:20:07 +08:00
isLiveStreamAlreadyStart = true;
2026-01-30 11:47:32 +08:00
}
@Override
public void onFailure(@NonNull IDJIError error) {
2026-03-04 11:20:07 +08:00
LogUtil.log(TAG, "" + startLiveFailTimes + "次开始推流失败:" + new Gson().toJson(error));
if (!isLiveStreamAlreadyStart) {
2026-01-30 11:47:32 +08:00
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (startLiveFailTimes < 10) {
startLiveFailTimes++;
startLiveWithCustom();
}
}
}, 3000);
}
}
});
}
}
}
2026-03-04 11:20:07 +08:00
private int isliveindex = 1; //1代表port 2代表fpv
2026-03-12 14:57:34 +08:00
public void switchptspfpv(ComponentIndexType ComponentIndex, MessageDown message){
isliveindex=2;
2026-03-04 11:20:07 +08:00
sendMsg2Server(message);
2026-03-12 14:57:34 +08:00
ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager();
LogUtil.log(TAG, "切换RTSP推流fpv:" + PreferenceUtils.getInstance().getRtspUserName()
+ "--" + PreferenceUtils.getInstance().getRtspPort() + "--" + PreferenceUtils.getInstance().getRtspPassWord());
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
LiveStreamSettings.Builder streamSettingBuilder = new LiveStreamSettings.Builder();
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
LiveStreamSettings streamSettings = streamSettingBuilder.setLiveStreamType(LiveStreamType.RTSP)
.setRtspSettings(new RtspSettings.Builder().setPassWord(PreferenceUtils.getInstance().getRtspPassWord()).
setPort(Integer.parseInt(PreferenceUtils.getInstance().getRtspPort())).
setUserName(PreferenceUtils.getInstance().getRtspUserName()).build()).build();
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
liveStreamManager.setLiveStreamSettings(streamSettings);
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
liveStreamManager.setCameraIndex(ComponentIndex);
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
liveStreamManager.setLiveStreamQuality(StreamQuality.FULL_HD);
liveStreamManager.setLiveVideoBitrateMode(LiveVideoBitrateMode.AUTO);
}
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
public void switchptspport(ComponentIndexType ComponentIndex, MessageDown message){
isliveindex=1;
sendMsg2Server(message);
ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager();
LogUtil.log(TAG, "切换RTSP推流port:" + PreferenceUtils.getInstance().getRtspUserName()
+ "--" + PreferenceUtils.getInstance().getRtspPort() + "--" + PreferenceUtils.getInstance().getRtspPassWord());
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
LiveStreamSettings.Builder streamSettingBuilder = new LiveStreamSettings.Builder();
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
LiveStreamSettings streamSettings = streamSettingBuilder.setLiveStreamType(LiveStreamType.RTSP)
.setRtspSettings(new RtspSettings.Builder().setPassWord(PreferenceUtils.getInstance().getRtspPassWord()).
setPort(Integer.parseInt(PreferenceUtils.getInstance().getRtspPort())).
setUserName(PreferenceUtils.getInstance().getRtspUserName()).build()).build();
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
liveStreamManager.setLiveStreamSettings(streamSettings);
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
liveStreamManager.setCameraIndex(ComponentIndex);
2026-03-04 11:20:07 +08:00
2026-03-12 14:57:34 +08:00
liveStreamManager.setLiveStreamQuality(StreamQuality.FULL_HD);
liveStreamManager.setLiveVideoBitrateMode(LiveVideoBitrateMode.AUTO);
2026-03-04 11:20:07 +08:00
}
2026-01-30 11:47:32 +08:00
public void startLiveWithRTSP() {
2026-03-12 14:57:34 +08:00
Boolean isAircraftConnected = KeyManager.getInstance().getValue(DJIKey.create(FlightControllerKey.KeyConnection));
2026-01-30 11:47:32 +08:00
if (isAircraftConnected == null || !isAircraftConnected) {
LogUtil.log(TAG, "飞行器未连接");
} else {
2026-03-04 11:20:07 +08:00
if (PreferenceUtils.getInstance().getRtspUserName() != null &&
PreferenceUtils.getInstance().getRtspPort() != null &&
PreferenceUtils.getInstance().getRtspPassWord() != null
) {
2026-03-12 14:57:34 +08:00
2026-01-30 11:47:32 +08:00
ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager();
LogUtil.log(TAG, "自定义RTSP推流:" + PreferenceUtils.getInstance().getRtspUserName()
2026-03-04 11:20:07 +08:00
+ "--" + PreferenceUtils.getInstance().getRtspPort() + "--" + PreferenceUtils.getInstance().getRtspPassWord());
2026-03-12 14:57:34 +08:00
if(isliveindex==1){
LiveStreamSettings.Builder streamSettingBuilder = new LiveStreamSettings.Builder();
LiveStreamSettings streamSettings = streamSettingBuilder.setLiveStreamType(LiveStreamType.RTSP)
.setRtspSettings(new RtspSettings.Builder().setPassWord(PreferenceUtils.getInstance().getRtspPassWord()).
setPort(Integer.parseInt(PreferenceUtils.getInstance().getRtspPort())).
setUserName(PreferenceUtils.getInstance().getRtspUserName()).build()).build();
2026-03-12 14:57:34 +08:00
liveStreamManager.setLiveStreamSettings(streamSettings);
2026-01-30 11:47:32 +08:00
2026-03-12 14:57:34 +08:00
CameraType value = KeyManager.getInstance().getValue(KeyTools.createKey(CameraKey.KeyCameraType, ComponentIndexType.PORT_1));
2026-03-04 11:20:07 +08:00
2026-01-30 11:47:32 +08:00
// if (value != null && (value == CameraType.ZENMUSE_H20T ||
// value == CameraType.ZENMUSE_H20N || value == CameraType.ZENMUSE_H20)
// || value == CameraType.ZENMUSE_H30 || value == CameraType.ZENMUSE_H30T) {
2026-03-12 14:57:34 +08:00
liveStreamManager.setCameraIndex(ComponentIndexType.PORT_1);
2026-01-30 11:47:32 +08:00
// } else {
// liveStreamManager.setCameraIndex(ComponentIndexType.FPV);
// }
2026-03-12 14:57:34 +08:00
liveStreamManager.setLiveStreamQuality(StreamQuality.FULL_HD);
liveStreamManager.setLiveVideoBitrateMode(LiveVideoBitrateMode.AUTO);
}else{
LiveStreamSettings.Builder streamSettingBuilder = new LiveStreamSettings.Builder();
LiveStreamSettings streamSettings = streamSettingBuilder.setLiveStreamType(LiveStreamType.RTSP)
.setRtspSettings(new RtspSettings.Builder().setPassWord(PreferenceUtils.getInstance().getRtspPassWord()).
setPort(Integer.parseInt(PreferenceUtils.getInstance().getRtspPort())).
setUserName(PreferenceUtils.getInstance().getRtspUserName()).build()).build();
liveStreamManager.setLiveStreamSettings(streamSettings);
liveStreamManager.setCameraIndex(ComponentIndexType.FPV);
liveStreamManager.setLiveStreamQuality(StreamQuality.FULL_HD);
liveStreamManager.setLiveVideoBitrateMode(LiveVideoBitrateMode.AUTO);
}
2026-03-04 11:20:07 +08:00
2026-01-30 11:47:32 +08:00
if (!liveStreamManager.isStreaming()) {
liveStreamManager.startStream(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
LogUtil.log(TAG, "自定义RTSP推流启动成功");
2026-03-04 11:20:07 +08:00
isliveindex = 1;
isLiveStreamAlreadyStart = true;
2026-03-12 14:57:34 +08:00
//开始端口扫描
SimplePortScanner.getInstance().startScan();
2026-01-30 11:47:32 +08:00
}
@Override
public void onFailure(@NonNull IDJIError error) {
2026-03-04 11:20:07 +08:00
LogUtil.log(TAG, "" + startLiveFailTimes + "次开始RTSP推流失败:" + new Gson().toJson(error));
if (!isLiveStreamAlreadyStart) {
2026-01-30 11:47:32 +08:00
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (startLiveFailTimes < 10) {
startLiveFailTimes++;
startLiveWithRTSP();
}
}
}, 3000);
}
}
});
2026-03-04 11:20:07 +08:00
} else {
2026-01-30 11:47:32 +08:00
liveStreamManager.stopStream(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
liveStreamManager.startStream(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
LogUtil.log(TAG, "自定义RTSP推流启动成功");
2026-03-04 11:20:07 +08:00
isliveindex = 1;
isLiveStreamAlreadyStart = true;
2026-01-30 11:47:32 +08:00
}
@Override
public void onFailure(@NonNull IDJIError error) {
2026-03-04 11:20:07 +08:00
LogUtil.log(TAG, "" + startLiveFailTimes + "次开始RTSP推流失败:" + new Gson().toJson(error));
if (!isLiveStreamAlreadyStart) {
2026-01-30 11:47:32 +08:00
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (startLiveFailTimes < 10) {
startLiveFailTimes++;
startLiveWithRTSP();
}
}
}, 3000);
}
}
});
}
2026-03-04 11:20:07 +08:00
}, 2000);
2026-01-30 11:47:32 +08:00
}
@Override
public void onFailure(@NonNull IDJIError error) {
2026-03-04 11:20:07 +08:00
LogUtil.log(TAG, "" + startLiveFailTimes + "次开始RTSP推流失败:" + new Gson().toJson(error));
if (!isLiveStreamAlreadyStart) {
2026-01-30 11:47:32 +08:00
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (startLiveFailTimes < 10) {
startLiveFailTimes++;
startLiveWithRTSP();
}
}
}, 3000);
}
}
});
}
2026-03-04 11:20:07 +08:00
} else {
LogUtil.log(TAG, "RTSP配置参数有误");
2026-01-30 11:47:32 +08:00
}
}
}
2026-03-12 14:57:34 +08:00
2026-01-30 11:47:32 +08:00
}