Android WebRTC 音視頻開發總結(四)-- webrtc傳輸模塊


在介紹WebRTC通訊之前我們先來看一個P2P視頻聊天包括的主要過程,轉載請說明出處(博客園RTC.Blacker):

 

音視頻數據采集->編碼->發送->接收->解碼->播放。

編碼、解碼、以及會用到加密、解密、回聲消除等針對不同系統處理方式都一樣,與平台無關,

但像Socket通信涉及到的數據發送、接收不同平台則有不同的處理方式,如Socket模型,windows里面用的是WSASocket,

Linux下用的則是socket,所以他通過模版模式來創建不同類型,

 

下面主要是介紹WebRTC自帶的一個傳輸模塊,實際應用中您可以根據自己的需求注冊不同的傳輸模塊。

        

其中:udp_socket_wrapper.h主要負責Socket相關操作,如Socket創建、啟動、端口綁定、停止。

       udp_socket2_windows.h主要負責windows平台上的Socket相關操作,與之對應的就是linux平台上的udp_socket_posix.h

       udp_transport.h主要負責包的發送和接收,如果你想實現自己的數據包收發邏輯,可重寫該類,如他里面的LoopBack方式就是通過重寫該模塊來實現的。

對客戶端調用來說主要就是做四件事情:

  1、設置音視頻遠端地址和端口(包括遠端音視頻的RTP、RTCP端口和本地接收音視頻的RTP、RTCP端口)。

  2、啟動音視頻數據的發送。

  3、啟動音視頻數據的接收。

  4、啟動音視頻數據的播放。

具體代碼結構如下:

1 public void start() {
2         this.setRemoteIp(WebRTCClient.str_remote_ip);WebRTCClient.str_to);
3         if (audioEnabled) {
4             startVoE();
5         }
6         if (receiveVideo || sendVideo) {
7             startViE();
8         }
9     }
1 public void startVoE() {
2         check(!voeRunning, "VoE already started");
3         check(voe.startListen(audioChannel) == 0, "Failed StartListen");
4         check(voe.startPlayout(audioChannel) == 0, "VoE start playout failed");
5         check(voe.startSend(audioChannel) == 0, "VoE start send failed");
6         voeRunning = true;
7     }
 1 public void startViE() {
 2         check(!vieRunning, "ViE already started");
 3 
 4         if (receiveVideo) {
 5             if (viewSelection == context.getResources().getInteger(R.integer.openGl)) {
 6                 svRemote = ViERenderer.CreateRenderer(context, true);
 7             } else if (viewSelection == context.getResources().getInteger(R.integer.surfaceView)) {
 8                 svRemote = ViERenderer.CreateRenderer(context, false);
 9             } else {
10                 externalCodec = new MediaCodecVideoDecoder(context);
11                 svRemote = externalCodec.getView();
12             }
13             if (externalCodec != null) {
14                 check(vie.registerExternalReceiveCodec(videoChannel, VCM_VP8_PAYLOAD_TYPE,
15                         externalCodec, true) == 0, "Failed to register external decoder");
16             } else {
17                 check(vie.addRenderer(videoChannel, svRemote, 0, 0, 0, 1, 1) == 0,
18                         "Failed AddRenderer");
19                 check(vie.startRender(videoChannel) == 0, "Failed StartRender");
20             }
21             check(vie.startReceive(videoChannel) == 0, "Failed StartReceive");
22         }
23         if (sendVideo) {
24             startCamera();
25             check(vie.startSend(videoChannel) == 0, "Failed StartSend");
26         }
27         vieRunning = true;
28     }

希望查看這個調用過程能是您大概明白流媒體數據的發送過程,為后面自定能夠以傳輸模塊打下基礎。 

請思考:WebRTC里面如何操作音視頻設備?如打開揚聲器,啟動攝像頭,后面會揭曉答案,請關注。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM