概述
在webrtc终端数量比较少时的应用场景,p2p比SFU有较大优势,metaRTC新版本支持webrtc的P2P,支持一对一和一对多,信令服务和webrtc为纯C实现,可以应用在眼镜、嵌入式、手机、PC等多种终端,支持windows/linux/android,支持客户端和浏览器。
metap2p3是个p2p demo,实现了简易的类似srs和zlm的信令服务,支持一对多,相当于webrtc版本的ipc,metaplayer3和metaplayer3_android可直接连接,浏览器用srs的player例子,将ip换成metap2p3的ip即可。
metap2p3是支持全双工的,支持一个连接实现推拉流。
?下载源码
https://github.com/metartc/metaRTChttps://github.com/metartc/metaRTCmetaRTC: metaRTC为嵌入式版本的webrtchttps://gitee.com/metartc/metaRTC
git clone https://github.com/metartc/metaRTC.git
或者
git clone https://gitee.com/metartc/metaRTC.git
metap2p3
默认信令侦听端口为1985,如作为直播推流端,不需要任何操作,默认后台侦听信令,接收到信令后自动启动推流程序。
连接metap2p3
客户端
?metaplayer3和metaplayer3_android可直接连接
浏览器
浏览器用srs的浏览器播放代码即可
remark:注意浏览器跨域options请求
<!DOCTYPE html>
<html>
<head>
<title>SRS</title>
<meta charset="utf-8">
<style>
body{
padding-top: 30px;
}
</style>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/>
<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="js/adapter-7.4.0.min.js"></script>
<script type="text/javascript" src="js/srs.sdk.p2p.js"></script>
<script type="text/javascript" src="js/winlin.utility.js"></script>
<script type="text/javascript" src="js/srs.page.js"></script>
</head>
<body>
<div class="container" width="100%" height="100%">
<div class="form-inline">
URL:
<input type="text" id="txt_url" class="input-xxlarge" value="webrtc://127.0.0.1:1985/live/livestream">
<button class="btn btn-primary" id="btn_play">播放视频</button>
</div>
<video id="rtc_media_player" width="100%" height="100%" autoplay></video>
</div>
<script type="text/javascript">
$(function(){
var sdk = null; // Global handler to do cleanup when replaying.
$('#rtc_media_player').show();
var startPlay = function() {
// Close PC when user replay.
if (sdk) {
sdk.close();
}
sdk = new SrsRtcPlayerAsync();
// https://webrtc.org/getting-started/remote-streams
$('#rtc_media_player').prop('srcObject', sdk.stream);
var url = $("#txt_url").val();
// parse_webrtc(url);
sdk.play(url).then(function(session){
}).catch(function (reason) {
sdk.close();
});
};
$("#btn_play").click(function() {
$('#rtc_media_player').prop('muted', false);
startPlay();
});
});
</script>
</body>
</html>
srs.sdk.p2p.js修改部分代码
// Internal APIs.
self.__internal = {
defaultPath: '/rtc/v1/play/',
prepareUrl: function (webrtcUrl) {
var urlObject = self.__internal.parse(webrtcUrl);
var schema="http:";
var port = urlObject.port || 1985;
if (schema === 'https:') {
port = urlObject.port || 443;
}
// @see https://github.com/rtcdn/rtcdn-draft
var api = urlObject.user_query.play || self.__internal.defaultPath;
if (api.lastIndexOf('/') !== api.length - 1) {
api += '/';
}
apiUrl = schema + '//' + urlObject.server + ':' + port + api;
for (var key in urlObject.user_query) {
if (key !== 'api' && key !== 'play') {
apiUrl += '&' + key + '=' + urlObject.user_query[key];
}
}
// Replace /rtc/v1/play/&k=v to /rtc/v1/play/?k=v
var apiUrl = apiUrl.replace(api + '&', api + '?');
var streamUrl = urlObject.url;
return {
apiUrl: apiUrl, streamUrl: streamUrl, schema: schema, urlObject: urlObject, port: port,
tid: Number(parseInt(new Date().getTime()*Math.random()*100)).toString(16).substr(0, 7)
};
},
|