WebRTC做大疆无人机直播
大疆带屏遥控器有直播功能,用的是rtmp,但是延时有点大,所以在遥控器里安装自己的软件,用webrtc来做一个无人机视频实时传输。需要自定义一个VideoCapturer来获取无人机视频封装成便于webrtc使用的流。
1、自定义一个CapturerAircraft类来实现VideoCapturer接口
public class CapturerDefault implements VideoCapturer {
@Override
public void initialize(SurfaceTextureHelper surfaceTextureHelper, Context context, CapturerObserver capturerObserver) {
}
@Override
public void startCapture(int i, int i1, int i2) {
}
@Override
public void stopCapture() throws InterruptedException {
}
@Override
public void changeCaptureFormat(int i, int i1, int i2) {
}
@Override
public void dispose() {
}
@Override
public boolean isScreencast() {
return false;
}
}
2、构造函数传入DJICodecManager参数
public CapturerAircraft(DJICodecManager manager) {
dji_code_manager_ = manager;
dji_code_manager_.resetKeyFrame();
if (isM300Product()) {
OcuSyncLink ocuSyncLink = DJILogIn.getProductInstance().getAirLink().getOcuSyncLink();
// If your MutltipleLensCamera is set at right or top, you need to change the PhysicalSource to RIGHT_CAM or TOP_CAM.
ocuSyncLink.assignSourceToPrimaryChannel(PhysicalSource.LEFT_CAM, PhysicalSource.FPV_CAM, new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError error) {
if (error == null) {
// showToast("assignSourceToPrimaryChannel success.");
} else {
// showToast("assignSourceToPrimaryChannel fail, reason: "+ error.getDescription());
}
}
});
}
}
public static boolean isM300Product() {
if (DJISDKManager.getInstance().getProduct() == null) {
return false;
}
Model model = DJISDKManager.getInstance().getProduct().getModel();
return model == Model.MATRICE_300_RTK;
}
3、initialize函数里面创建一个DJIYuvDataCallback实例
DJIYuvDataCallback的onYuvDataReceived函数用来接收每一帧的yuv数据,再实例化一个CapturerObserver对象&#