package com.aros.apron.manager; import android.content.Context; import android.os.Handler; import android.os.Looper; 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; import com.aros.apron.tools.SimplePortScanner; import com.google.gson.Gson; import dji.sdk.keyvalue.key.CameraKey; import dji.sdk.keyvalue.key.DJIKey; import dji.sdk.keyvalue.key.FlightControllerKey; 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; } 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,"直播开启成功失败"); } }); } 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); Log.d(TAG, "推流状态" + status.isStreaming() + "帧率:" + status.getFps() + "--" + "码率:" + status.getVbps() + "---" + "延迟:" + status.getRtt()); } } @Override public void onError(IDJIError error) { } }); } } public void startLive(MessageDown message) { sendMsg2Server(message); } 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()) { if (message.getData().getVideo_quality() == 0 || message.getData().getVideo_quality() == 4) { liveStreamManager.setLiveStreamQuality(StreamQuality.ORIGINAL); } else { 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) { liveStreamManager.setCameraIndex(ComponentIndexType.PORT_1); // } 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, "自定义推流启动成功"); isLiveStreamAlreadyStart = true; } @Override public void onFailure(@NonNull IDJIError error) { LogUtil.log(TAG, "第" + startLiveFailTimes + "次开始推流失败:" + new Gson().toJson(error)); if (!isLiveStreamAlreadyStart) { new Handler().postDelayed(new Runnable() { @Override public void run() { if (startLiveFailTimes < 10) { startLiveFailTimes++; startLiveWithCustom(); } } }, 3000); } } }); } } } private int isliveindex = 1; //1代表port 2代表fpv public void switchptspfpv(ComponentIndexType ComponentIndex, MessageDown message){ isliveindex=2; sendMsg2Server(message); ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager(); LogUtil.log(TAG, "切换RTSP推流fpv:" + PreferenceUtils.getInstance().getRtspUserName() + "--" + PreferenceUtils.getInstance().getRtspPort() + "--" + PreferenceUtils.getInstance().getRtspPassWord()); 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(ComponentIndex); liveStreamManager.setLiveStreamQuality(StreamQuality.FULL_HD); liveStreamManager.setLiveVideoBitrateMode(LiveVideoBitrateMode.AUTO); } 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()); 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(ComponentIndex); liveStreamManager.setLiveStreamQuality(StreamQuality.FULL_HD); liveStreamManager.setLiveVideoBitrateMode(LiveVideoBitrateMode.AUTO); } public void startLiveWithRTSP() { Boolean isAircraftConnected = KeyManager.getInstance().getValue(DJIKey.create(FlightControllerKey.KeyConnection)); if (isAircraftConnected == null || !isAircraftConnected) { LogUtil.log(TAG, "飞行器未连接"); } else { if (PreferenceUtils.getInstance().getRtspUserName() != null && PreferenceUtils.getInstance().getRtspPort() != null && PreferenceUtils.getInstance().getRtspPassWord() != null ) { ILiveStreamManager liveStreamManager = MediaDataCenter.getInstance().getLiveStreamManager(); LogUtil.log(TAG, "自定义RTSP推流:" + PreferenceUtils.getInstance().getRtspUserName() + "--" + PreferenceUtils.getInstance().getRtspPort() + "--" + PreferenceUtils.getInstance().getRtspPassWord()); 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(); 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) { liveStreamManager.setCameraIndex(ComponentIndexType.PORT_1); // } else { // liveStreamManager.setCameraIndex(ComponentIndexType.FPV); // } 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); } if (!liveStreamManager.isStreaming()) { liveStreamManager.startStream(new CommonCallbacks.CompletionCallback() { @Override public void onSuccess() { LogUtil.log(TAG, "自定义RTSP推流启动成功"); isliveindex = 1; isLiveStreamAlreadyStart = true; //开始端口扫描 SimplePortScanner.getInstance().startScan(); } @Override public void onFailure(@NonNull IDJIError error) { LogUtil.log(TAG, "第" + startLiveFailTimes + "次开始RTSP推流失败:" + new Gson().toJson(error)); if (!isLiveStreamAlreadyStart) { new Handler().postDelayed(new Runnable() { @Override public void run() { if (startLiveFailTimes < 10) { startLiveFailTimes++; startLiveWithRTSP(); } } }, 3000); } } }); } else { 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推流启动成功"); isliveindex = 1; isLiveStreamAlreadyStart = true; } @Override public void onFailure(@NonNull IDJIError error) { LogUtil.log(TAG, "第" + startLiveFailTimes + "次开始RTSP推流失败:" + new Gson().toJson(error)); if (!isLiveStreamAlreadyStart) { new Handler().postDelayed(new Runnable() { @Override public void run() { if (startLiveFailTimes < 10) { startLiveFailTimes++; startLiveWithRTSP(); } } }, 3000); } } }); } }, 2000); } @Override public void onFailure(@NonNull IDJIError error) { LogUtil.log(TAG, "第" + startLiveFailTimes + "次开始RTSP推流失败:" + new Gson().toJson(error)); if (!isLiveStreamAlreadyStart) { new Handler().postDelayed(new Runnable() { @Override public void run() { if (startLiveFailTimes < 10) { startLiveFailTimes++; startLiveWithRTSP(); } } }, 3000); } } }); } } else { LogUtil.log(TAG, "RTSP配置参数有误"); } } } }