SRS ストリーミング メディア サービス (3) SRS サービス http(s) API 操作 SRS サービス

SRS ストリーミング メディア サーバーは、開発者が独自のビジネス シナリオに従って独自のストリーミング メディア サービスをカスタマイズできる強力な API を提供します。

ローカル環境:

仮想マシン VMPRO15 は Linux システム: CentOS7 をインストールします

SRS サービス バージョン: SRSv4-b2-4.0.215 (SRSv4 は 2021 年 12 月に安定版を正式にリリースしました)

Linux はポートとサービスを開きます。

 Linuxネットワーク環境:192.168.5.104 

物理マシンのローカルネットワーク環境: 192.168.5.101

1. SRS サービスによって提供される http API をテストするには、まず SRS 構成ファイルで対応するサービスを有効にする必要があります。

2. API にアクセスします。

2.1. SRS は、メモリなしでルート ディレクトリから移動できる API ブレッドクラムを提供します。共通フィールドは次のとおりです。

  • code はエラー コードを示します。Linux の規則に従って、0 は成功を示します。
  • urls はブレッドクラム ナビゲーション、この API の下にあるサブ API (リンク) を意味します。
  • data は、最後のレベルでサービスを提供する API と返されたデータを示します。

2.2. Postman を使用して、SRS が提供するトップレベル API (http://192.168.5.104:1985) をリクエストします。

2.3. 次のレベルの API (http://192.168.5.104:1985/api) に再度アクセスします。

 2.4. 続きを読む (http://192.168.5.104:1985/api/v1):

2.5. SRS サーバー (http://192.168.5.104:1985/api/v1/clients) の接続クライアント情報を取得してみます。 

 

 

2.6、SRS HTTP API はクロスドメインをサポートし、js は SRS の http API を直接呼び出すことができます。

SRS は 2 つのクロスドメイン方式をサポートしています。

  • OPTIONS: jquery はドメイン間で API を直接リクエストでき、ブラウザは OPTIONS クロスドメイン リクエストを送信します。SRS がクロスドメインを許可した後、ブラウザは API リクエストを再度開始します。
  • JSONP: jquery/angularjs は JSONP クロスドメイン リクエストを開始でき、サーバーは js ファイルとして応答します。その内容は関数を呼び出すことであり、関数名は QueryString のコールバックによって指定されます。
  • JSONP-DELETE: JSONP は GET しかできないため、DELETE メソッドは QueryString のメソッドで指定されます。

2.7. SRS には https_api のサポートが組み込まれており、設定で https を有効にするだけで済みます (証明書を独自の証明書に置き換えます)。

http_api {
    enabled         on;
    listen          1985;
    https {
        #是否开启https
        enabled on;
        #监听端口号
        listen 1990;
        #SSL私钥文件
        #       openssl genrsa -out server.key 2048
        # default: ./conf/server.key
        key ./conf/server.key;
        # SSL公共证书
        #       openssl req -new -x509 -key server.key -out server.crt -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=Me/OU=Me/CN=ossrs.net"
        # default: ./conf/server.crt
        cert ./conf/server.crt;
    }
}

2.8. SRS によって提供されるすべての API と説明 (継続的なバージョン更新により不正確になる可能性があります):

3. インターフェイス テストにより、SRS サーバーに接続されたクライアントが開始されます。

 SRS が提供する API を介して SRS に接続されたクライアントをキックオフするテスト。まず、すべてのクライアント情報を取得するために GET リクエスト (http://192.168.5.104:1985/api/v1/clients) が必要です。クライアント ID を取得します。 DELETE リクエスト (http://192.168.5.104:1985/api/v1/clients/clientID) がクライアントをキックオフします。ストリーミング クライアントのみをキックする場合は、API (http ://192.168.5.104:1985 /api/v1/streams)、streams.publish.cid はストリーミング クライアント ID 番号です。

3.1. HBuilderX を使用して uniapp プロジェクトを作成し、インデックスとライブ 2 ページを作成し、uniapp 公式 UI コンポーネント uni-table と uni-poppop を使用し、HBuilderX プラグイン モールを通じて直接インストールし、uniapp 公式ストリーミング プラグを使用します。 live-pusher でビデオキャプチャとストリーミングを実現

UI コンポーネントは次のとおりです。

 

インデックス.ビュー

<template>
    <view>
        <live-pusher class="livePusher-top" id="livePusher" @statechange="statechange"  :beauty="beauty" :whiteness="whiteness"  :url="url" :enable-camera="enableCamera" mode="FHD"></live-pusher>
        <button v-if="flag" @click="startLive">开始直播</button>
        <button v-if="!flag" @click="stopLive">结束直播</button>
		<button  @click="pauseLive">暂停直播</button>
		<button  @click="resumeLive">恢复直播</button>
		<view class="uni-title">美颜</view>
		<slider min="0" max="9" value="0" @change="sliderChangeBeauty" activeColor="#FFCC33" backgroundColor="#000000" block-color="#8A6DE9" block-size="20" show-value />
		<view class="uni-title">美白</view>
		<slider min="0" max="9" value="0" @change="sliderChangeWhiteness" activeColor="#FFCC33" backgroundColor="#000000" block-color="#8A6DE9" block-size="20" show-value />
		
		<uni-popup ref="popup" :mask-click="false" type="message">
			<uni-popup-message  type="warn" :message="message" :duration="0"></uni-popup-message>
		</uni-popup>
	</view>
</template>

<script>
	export default {
        data() {
            return {
                url: 'rtmp://192.168.5.104/live/1',//推流地址
                enableCamera: true,//开启摄像头
                context: null,
				beauty : 0,//美颜值
				whiteness : 0 ,//美白值
				flag : true,
				message : null,//提示消息
				date : null,//定义时间
				dateStr : null
            };
        },
        onReady() {
            this.context = uni.createLivePusherContext('livePusher', this);
            // this.context.switchCamera() // 摄像头切换(切换为后置)
			setTimeout(()=>{
				this.context.startPreview() // 摄像头预览 (不加会黑屏)
			},1000);
            
        },
        methods: {
			//开始推流
            startLive() {
                this.context.start({
                    success: (res) => {
						this.flag=!this.flag;
                        console.log('livePusher.start:' + JSON.stringify(res));
                    },
					fail: (err)=>{
						console.log("livePusher失败:"+JSON.stringify(err));
					},
					complete:(res)=>{
						console.log("livePusher执行完成:"+JSON.stringify(res));
					}
                });
            },
			//停止推流
            stopLive() {
                this.context.stop({
                    success: (res) => {
						this.flag=!this.flag;
                        console.log('livePusher.stop:'+JSON.stringify(res));
						this.context.stopPreview(); // 关闭摄像头预览
                    }
                });
            },
			//暂停推流
			pauseLive(){
				this.context.pause({
					success: (res)=>{
						console.log('livePusher.pause:'+JSON.stringify(res));
					}
				});
				
			},
			//恢复推流
			resumeLive(){
				this.context.resume({
					success: (res)=>{
						console.log('livePusher.resume:'+JSON.stringify(res));
					}
				});
			},
			//设置美颜
			sliderChangeBeauty(e){
				this.beauty = e.detail.value;
				console.log("美颜值改变"+e.detail.value);
			},
			//设置美白
			sliderChangeWhiteness(e){
				this.whiteness = e.detail.value;
				console.log("美白值改变"+e.detail.value);
			},
			//状态改变数据,部分状态码如下:
			//1001:连接RTMP服务器成功
			//1002:RTMP开始推流
			//1003:打开摄像头成功
			//1007:首帧画面采集完成
			//1008:启动硬编
			//1101:上行带宽不足,数据发送不及时
			//1102:启动网络重连
			//3004:UNKNOWN
			//3005:tcp通道发送失败 错误码[-4]
			//-1307:所有IP都已经尝试失败,可以放弃治疗
			statechange(e){
				console.log("状态"+e.detail.code+e.detail.message);
				if(e.detail.code==3005){//TCP通道断开
				this.date = new Date();
				this.dateStr = this.date.getFullYear()+":"
							+this.date.getMonth()+1+":"
							+this.date.getDate()+":"
							+this.date.getHours()+":"
							+this.date.getMinutes()+":"
							+this.date.getSeconds();
					this.flag = true;
					this.message = this.dateStr+"网络断开,正在重新连接";
					this.open();
				}if(e.detail.code==1102){//启动网络重连
					
				}if(e.detail.code==1001){//已经连接RTMO服务器
					// this.close();
					// this.message = "已连接服务器";
					// this.open();
					
				}if(e.detail.code==1002){//RTMP开始推流
					this.flag = false;
					this.close();
				}if(e.detail.code==-1307){//重连失败
					this.close();
					this.message = "重连失败";
					this.open();
				}
			},
			open() {
			        this.$refs.popup.open('top')
			},
			close() {
			        this.$refs.popup.close()
			}
			
        }
	}

</script>

<style>
.livePusher-top{
	background-color:white;
	
}
</style>

live.vue

<template>
	<view>
		<uni-table border stripe emptyText="暂无更多数据" >
		    <!-- 表头行 -->
		    <uni-tr>
		        <uni-th  align="center">客户端ID</uni-th>
		        <uni-th  align="center">客户端IP</uni-th>
		        <uni-th  align="center">类型</uni-th>
				<uni-th  align="center">操作</uni-th>
		    </uni-tr>
		    <!-- 表格数据行 -->
		    <uni-tr v-for="(list,index) in liveList">
		        <uni-td align="center">{
   
   {list.id}}</uni-td>
		        <uni-td align="center">{
   
   {list.ip}}</uni-td>
		        <uni-td align="center">{
   
   {list.type}}</uni-td>
				<uni-td align="center">
					<button @click="tichu(list.id,index)" class="mini-btn" type="warn" size="mini">踢出</button>
				</uni-td>
		    </uni-tr>
		    
		
		</uni-table>
		
	</view>
</template>

<script>
	
	export default {
		data() {
			return {
				//定义客户端列表
				liveList : null,
			}
		},
		onReady() {
			// 每秒更新客户端列表数据
			setInterval(()=>{
				uni.request({
					url:"http://192.168.5.104:1985/api/v1/clients",
					success: (res) => {
							this.liveList = res.data.clients;
					    },
					fail: (err) =>{
						console.log(err.data);
						console.log("失败");
					}
				})
			},1000)
			
		},
		methods: {
			tichu(clientID,index){
				uni.request({
					url:"http://192.168.5.104:1985/api/v1/clients/"+clientID,
					method:'DELETE',
					success: (res) => {
							if(res.data.code==0){
								this.liveList.splice(index,1);
							}
					    },
					fail: (err) =>{
						console.log(err.data);
						console.log("失败");
					}
				})
			}
		}
	}
</script>

<style>

</style>

3.2. SRS サービスの設定、http_api サービスを開く、RTC サービスを開く、RTMP を RTC ストリームに開く、後で RTMP プロトコルを使用してストリームをプッシュする、RTC プロトコルを使用してストリームをプルする (再生)

 

 

 

3.3. ページを作成した後は、直接実行することができます。HBuilderX を開いて携帯電話に接続し、実機上で実行して、ライブ ブロードキャスト (プッシュ ストリーミング) を開始します。

 

 3.4. Google Chrome を使用して http://192.168.5.104:8080 を開き、RTC プレーヤーを使用してストリームをプルします (RTC プロトコルは再生遅延が低い)

 3.5. HBuilderX を使用してブラウザ (Chrome) を実行し、ライブ ブロードキャスト センターを開き、クライアントをキックアウトします。

 このページには、2 つのクライアント (GET リクエスト http://192.168.5.104:1985/api/v1/clients)、1 つのプッシャーと 1 つのプーラーが表示されます。

PC 側の GIF のスクリーンショット (画質は説明しにくいですが、CSDN はビデオのアップロードをサポートしていません)、約 32 秒でキックされ、携帯電話のプッシュ ストリームが切断されて再接続されたため、その後自動的に再接続されます。プッシュエンドから追い出される ストリーミング後に画面がフリーズし、再接続すると再び動きます。

 

 モバイルのスクリーンショット

 上記のことから、http_api を介して SRS サービスを操作することにより、クライアントが正常に追い出されたことがわかります。

 

おすすめ

転載: blog.csdn.net/weixin_44341110/article/details/122516644