最近开发无人机需要通过大疆的上云api对接到无人机,但是发现无人机对接时,使用rtmp流进行播放实时画面时无法转成webrtc与大疆前端进行交互sdp,查看之后发现大疆在点击play后,会请求一个
http://ip:port/rtc/v1/play/
这个ip是目标流媒体服务器的ip,也就是说我们需要搭建流媒体服务器,很出名的就是ZLM了,但是它是基于c++的,对于我这个javalearner,操作起来还是有很大困难的👿。然后发现了ZLM4J,这个大佬讲zlm进行封装以api的方式进行调用,这个就很对我的胃口了😄,然后发现里面也是一些封装...看不懂。后面又发现了JMediaServer,这个就更好了,完全springboot项目,只需要调用接口就可以,启动起来就是流媒体服务器。不需要像原来一样要搭建ZLMediaKit和ffmpeg了,也不要什么乱七八糟的配置,直接启动项目!!!!

启动后发现

直接初始化启动了RTSP、RTMP、WEBRTC
然后就是重点了!!!!
==============================================================
==============================================================
一、分析大疆上云api的后台逻辑
manage/api/v1/live/streams/start
代码里最终 会将rtmp的url中的rtmp替换为webrtc,也就是返回的url格式就是
webrtc://ip:7935/live/test

二、大疆得到rtmp的流后会调用一个接口
http://ip:port/rtc/v1/play/ ,也就是说这个才是流媒体交互的sdp。这时候只需要改一下前端,别让它继续访问7935的端口了,让它访问我们流媒体启动端口例如8898,然后在流媒体服务器重新写一个接口
/**
* 对应大疆无人机视频推拉流
* @param pcSdp
* @return
* @throws IOException
*/
@ApiOperation(value = "【webrtc】sdp协议交换")
@PostMapping("/rtc/v1/play/")
public DeferredResult<ResponseEntity<String>> webrtc2(@RequestBody webrtcParam pcSdp) throws IOException {
String app = "live";
String stream = "test2";
String type = "play";
String sdp = pcSdp.getSdp();
DeferredResult<ResponseEntity<String>> out = new DeferredResult<>();
//webrtc使用的是udp,默认监听8000,不需要设置端口号
String rtcUrl = StrUtil.format("rtc://{}:{}/{}/{}", config.getRtc_host(), config.getRtc_port(), app, stream);
IMKWebRtcGetAnwerSdpCallBack imkWebRtcGetAnwerSdpCallBack = createWebrtcAnswerSdpCallback(out);
ZLM_API.mk_webrtc_get_answer_sdp(null, imkWebRtcGetAnwerSdpCallBack, type, sdp, rtcUrl);
return out;
}
先写死测试。。。。。。。
三、开始拉流
掉一下流媒体服务器上的接口

发现这个rtmp就是我们上面大疆返回的url地址,不需要管是webrtc还是rtmp,因为后台逻辑是已经转好了的
四、最后点击一在上云api的 play!!!!
就可以看到直播画面了。
如果没有无人机或者摄像头,就更简单了,直接下载一个ffmpeg,然后就直接将一个本地视频文件推到rtmp服务器就行了。
ffmpeg -re -i "F:\tbd\drone\\test.mp4" -c copy -f flv -flvflags no_duration_filesize "rtmp://127.0.0.1:7935/live/test2"