里來詳細了解一下Sip協議。以下內容大致分為以下幾個部分:
SIP(Session Initiation Protocol,會話初始協議)是由IETF(Internet Engineering Task Force,因特網工程任務組)制定的多媒體通信協議。廣泛應用于CS(Circuit Switched,電路交換)、NGN(Next Generation Network,下一代網絡)以及IMS(IP Multimedia Subsystem,IP多媒體子系統)的網絡中,可以支持并應用于語音、視頻、數據等多媒體業務,同時也可以應用于Presence(呈現)、Instant Message(即時消息)等特色業務。可以說,有IP網絡的地方就有SIP協議的存在。
SIP是類似于HTTP,SIP可以減少應用特別是高級應用的開發時間。由于基于IP協議的SIP利用了IP網絡,固定網運營商也會逐漸認識到SIP技術對于他們的原意義。
在Sip IM通信應用過程中,一般存在著兩種會話模式:
會話中,對于消息體內容大于1300字節時,一般采用Session Model。其會話建立過程如下圖所示:
主叫方A呼叫被叫方B:
注:以上的整個流程稱之為一個Dialog
在Sip消息中,對于消息體不大于1300字節時,一般采用Pager Model。Sip消息通信中采用MESSAGE方法,MESSAGE方法本身并不建立Dialog,在多數應用中,每條IM消息都是獨立的,頗似分頁消息。
RFC3428對Sip協議進行了擴展,在Sip協議中增加了MESSAGE請求方法。采用Pager Model進行通信,傳遞不超過1300字節的數據。MESSAGE方法詳細可參考 “SIP-RFC3428” https://tools.ietf.org/html/rfc3428。
當User1想給User2發送IM消息時,只需構造一個MESSAGE,發出去即可。
對于其消息體body可以是任何MIME格式。但必須支持plain/text格式,可以選擇支持message/cpim、message/sdp格式,可能用message/cpim會好一點,因為已有的IM系統標準是message/cpim格式。
注:想了解CPIM消息格式的同學可參考:CPIM 消息格式:https://xiaxl.blog.csdn.net/article/details/104718006
注:想了解SDP消息格式的同學可參考:SDP 消息格式:https://xiaxl.blog.csdn.net/article/details/104723834
以User1向User2發送MESSAGE消息為例:
SIP消息體結構與Http協議結構相似,均由三部分組成:
請求行格式:Method Request-URI SIP-Version CRLF
請求行舉例:INVITE sip:bob@zte.com SIP/2.0 /r/n
Method
以下列出了幾種消息Method方法:
Method | 方法說明 |
REGISTER | 注冊聯系信息 |
INVITE | 發起會話請求 |
ACK | INVITE 請求的響應的確認 |
CANCEL | 取消請求 |
BYE | 終結會話 |
OPTIONS | 查詢服務器能力 |
MESSAGE | RFC3428對Sip協議的擴展,增加了MESSAGE方法。采用Pager Model進行通信,傳遞不超過1300字節的數據。MESSAGE方法詳細可參考 “SIP-RFC3428” https://tools.ietf.org/html/rfc3428 |
Request-URI
指示請求的用戶或者服務的地址信息
SIP-Version
請求和響應消息都需要包含SIP版本信息
狀態行格式: SIP-Version Status-Code Reason-Phrase CRLF
狀態行舉例:SIP/2.0 200 OK /r/n
Status-Code狀態碼:
狀態代碼由3位數字組成,表示請求是否被理解或被滿足。
狀態代碼的第一個數字定義了響應的類別,后面兩位沒有具體的分類。
第一個數字有五種可能的取值:
狀態碼 | 含義 |
1xx: | 臨時響應、表示請求消息正在被處理 |
2xx | 成功響應、表示請求已被成功接收完全理解并接收 |
3xx | 重定向響應、表示需采取進一步完成請求 |
4xx | 客戶機錯誤、表示請求消息中包含語法錯誤信息或服務器無法完成客戶機的請求 |
5xx | 服務器錯誤、表示服務器無法合法完成請求 |
6xx | 全局故障 、表示任何服務器都無法完成該請求 |
常用的狀態碼舉例:
狀態碼 | msg | 含義 |
100 | Trying | 試呼叫 |
180 | Ringing | 振鈴 |
181 | Call is Being Forwarded | 呼叫正在前轉 |
200 | OK | 成功響應 |
302 | Moved Temporarily | 臨時遷移 |
400 | Bad Request | 錯誤請求 |
401 | Unauthorized | 未授權 |
403 | Forbidden | 禁止 |
404 | Not Found | 用戶不存在 |
408 | Request Timeout | 請求超時 |
480 | Temporarily Unavailable | 暫時無人接聽 |
486 | Busy Here | 線路忙 |
504 | Server Time-out | 服務器超時 |
600 | Busy Everywhere | 全忙 |
發送MESSAGE消息給user2
MESSAGE sip:user2@domain.com SIP/2.0
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
Max-Forwards: 70
From: sip:user1@domain.com;tag=49583
To: sip:user2@domain.com
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Type: text/plain
Content-Length: 18
user2, come here.
Header 字段含義說明:
Header | 含義說明 | 舉例 |
Call-ID | 由本地設備(Client)生成,全局唯一,每次呼叫這個值唯一不變 | Call-ID: asd88asd77a@1.2.3.4 |
From | 表示請求的發起者 | From: sip:user1@domain.com;tag=49583 |
To | 表示請求的接受者 | To: sip:user2@domain.com |
Via | Via頭域是被服務器插入request中,用來檢查路由環的,并且可以使response根據via找到返回的路 | Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse |
Max-Forwards | 用于表示這個包最多可以傳送多少跳,每經過一跳都會減一檔Max-Forwards==0系統會返回483。默認為70 | Max-Forwards: 70 |
Contact | 包含源的URI信息,用來給響應方直接和源建立連接用 | Contact: sip:192.168.100.1:1111 |
Content-Type | 指明消息體的類型 (SDP會話描述協議) | Content-Type: text/plain;Content-Type: application/sdp; Content-Type: application/cpim; |
Content-Length | 指明消息體的字節大小 | Content-Length: 18 |
這里舉兩個例子:
以User1發送MESSAGE消息給user2為例:
MESSAGE sip:user2@domain.com SIP/2.0
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
Max-Forwards: 70
From: sip:user1@domain.com;tag=49583
To: sip:user2@domain.com
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Type: text/plain
Content-Length: 18
user2, come here.
代理服務器收到步驟1請求,到數據庫中查找User2(注冊過程中生成數據庫),隨后生成步驟2的數據。
MESSAGE sip:user2@domain.com SIP/2.0
Via: SIP/2.0/TCP proxy.domain.com;branch=z9hG4bK123dsghds
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse;
received=1.2.3.4
Max-Forwards: 69
From: sip:user1@domain.com;tag=49394
To: sip:user2@domain.com
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Type: text/plain
Content-Length: 18
user2, come here.
直接回應(200-OK) 沒有Body,也不攜帶Contact頭域
SIP/2.0 200 OK
Via: SIP/2.0/TCP proxy.domain.com;branch=z9hG4bK123dsghds;
received=192.0.2.1
Via: SIP/2.0/TCP user1pc.domain.com;;branch=z9hG4bK776sgdkse;
received=1.2.3.4
From: sip:user1@domain.com;tag=49394
To: sip:user2@domain.com;tag=ab8asdasd9
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Length: 0
代理服務器收到回復后,去掉最頂端的Via,轉發如下消息給User1
SIP/2.0 200 OK
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse;
received=1.2.3.4
From: sip:user1@domain.com;;tag=49394
To: sip:user2@domain.com;tag=ab8asdasd9
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Length: 0
首先舉例一個非鑒權注冊消息。
192.168.2.161機器發送注冊消息給192.168.2.89服務器:
REGISTER sip:192.168.2.89 SIP/2.0
Via: SIP/2.0/UDP 192.168.2.161:10586
Max-Forwards: 70
From: <sip:01062237496@192.168.2.89>;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931
To: <sip:01062237496@192.168.2.89>
Call-ID: da56b0fab5c54398b16c0d9f9c0ffcf2@192.168.2.161
CSeq: 1 REGISTER
Contact: <sip:192.168.2.161:10586>;methods="INVITE, MESSAGE, INFO, SUBSCRIBE, OPTIONS, BYE, CANCEL, NOTIFY, ACK, REFER"
User-Agent: RTC/1.2.4949 (BOL SIP Phone 1005)
Event: registration
Allow-Events: presence
Content-Length: 0
當注冊成功(回送200 OK)時,服務器發送的res消息參考如下:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.2.161:10586
From: <sip:01062237496@192.168.2.89>;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931
To: <sip:01062237496@192.168.2.89>;tag=-00834-14d0805b62bc026d
Call-ID: da56b0fab5c54398b16c0d9f9c0ffcf2@192.168.2.161
CSeq: 1 REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: sip:192.168.2.161:10586
Content-Length: 0
Expires: 3600
當需要鑒權注冊時
SIP 協議,即 會話初始協議(Session Initiation Protocol),是一個應用層的 點對點協議,用于初始、管理和終止網絡中的語音和視頻會話,是 GB28181 的核心之一。
按照 IETFRFC2543 的定義:
SIP是一個基于文本的應用層控制協議,獨立于底層傳輸協議 TCP/UDP/SCTP,用于建立、修改和終止IP網上的雙方或多方多媒體會話。SIP協議借鑒了HTTP、SMTP等協議,支持代理、重定向及登記定位用戶等功能,支持用戶移動。通過與RTP/RTCP、SDP、RTSP等協議及DNS配合,SIP支持語音、視頻、數據、E-mail、狀態、IM、聊天、游戲等。SIP協議可在TCP或UDP之上傳送,由于SIP本身具有握手機制,可首選UDP。
SIP 用于設備管理,其中有兩個要素 - SIP用戶代理 和 SIP網絡服務器。
SIP 協議雖然屬于應用層協議,然而 SIP 本身并不提供任何服務。但是 SIP 是通信的基礎,在 SIP 這個通信的基礎上可以用來構建不同的服務。SIP 協議在建立和維持多媒體會話中,主要支持如下 5 個功能:
1)檢查終端用戶的位置。無論被叫方在哪里均能確保呼叫達到被叫方,進行任何描述信息到定位信息的轉換;
2)檢查用戶參與會話的意愿程度。參與者在呼叫中能夠引入其他用戶加入或者取消其他用戶的連接;
3)檢查媒體和媒體參數,允許與呼叫有關的組在支持特性上保持一致;
4)在呼叫與被叫雙方建立會話;
5)發送和終止會話,修改會話參數,激活服務等會話管理操作;
GB28181流傳輸幾種模式
UDP
服務端監聽UDP端口,通過INVITE信令告知設備端口,設備主動向服務端發起流傳輸
TCP 被動
服務端監聽TCP端口,通過INVITE信令告知設備端口,設備向服務端發起流傳輸
TCP 主動
設備端告知服務端監聽的TCP端口情況,服務端主動向設備拉流,此種場景較少,且設備所在網絡可以被服務所在網絡訪問(如下級設備與上級GB28181服務在同一個局域網,或者都在公網上能相互訪問)。
smarteye 流媒體服務軟件: 提供用戶管理及Web可視化頁面管理; 提供設備狀態管理,可實時查看設備是否掉線等信息; 實時流媒體處理,PS(TS)轉ES; 設備狀態監測、云臺控制、錄像檢索、回放; 提供RTSP、RTMP、HTTP-FLV、HLS等多種協議流輸出; 對外提供服務器獲取狀態、信息,控制等HTTP restful API接口。
支持本地、內網、私有云部署;為企業視頻能力建設,提供了視頻點播轉碼、手機直播推流、云端錄像存儲計劃、RTMP拉流推流服務、RTSP拉流推流服務、設備GB28181接入、Onvif云臺控制等等能力,同時提供性能強大穩定的RTMP/HLS/RTSP/HTTP-FLV分發,支持H5頁面無插件直播,強大的后臺管理,詳細的二次開發接口文檔,服務搭建簡單解壓后一鍵啟動,支持Windows和Linux環境部署
視頻監控安防平臺-GB28181_2016版本-INVITE請求視頻(UDP、TCP active、 TCP passive)
在GB28181里面,視頻請求是最重要的環節,GB28181 2016版本最主要的新增內容 估計就是請求視頻的時候支持tcp active和tcp passive, 其實早在GB28181 2014版本的時候都已經定義了tcp傳輸碼流,tcp最大的好處就是對下載的時候能保證不丟包,下面簡要說一下INVITE請求視頻的流程.
GB/T28181
國標GB/T28181協議全稱《安全防范視頻監控聯網系統信息傳輸、交換、控制技術要求》,是一個定義視頻聯網傳輸和設備控制標準的白皮書,由公安部科技信息化局提出,該標準規定了城市監控報警聯網系統中信息傳輸、交換、控制的互聯結構、通信協議結構,傳輸、交換、控制的基本要求和安全性要求,以及控制、傳輸流程和協議接口等技術要求。解決了視頻間互聯互通,數據共享,以及設備控制的問題,這個問題從頂層解決了視頻信息各自為戰的問題,打通了視頻聯網的信息孤島。
優勢:GB28181相對RTMP,支持TCP和UDP模式,信令流負責session交互,數據流負責數據傳輸,適合標準協議規范的平臺級產品對接。
除了支持常規的數據接入外,還支持針對攝像機的PTZ控制,支持標準28181服務對接。
劣勢:外部支持GB28181的服務器不多,開源如SRS服務器針對GB28181的支持暫不夠商用級,期待后續版本升級支持更好。
以海康攝像頭對接28281平臺為例,具體交互流程如下:
REGISTER sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.120:15068;rport;branch=z9hG4bK1624213340
From: <sip:34020000001110000044@3402000000>;tag=2045629479
To: <sip:34020000001110000044@3402000000>
Call-ID: 1367363228
CSeq: 1 REGISTER
Contact: <sip:34020000001110000044@192.168.0.120:15068>
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.120:15068;rport=15068;received=192.168.0.120;branch=z9hG4bK1624213340
From: <sip:34020000001110000044@3402000000>;tag=2045629479
To: <sip:34020000001110000044@3402000000>;tag=993246605
CSeq: 1 REGISTER
Call-ID: 1367363228
User-Agent: LiveGBS v210723
Contact: <sip:34020000001110000044@192.168.0.120:15068>
Content-Length: 0
Date: 2021-08-13T10:14:11.789
Expires: 3600
MESSAGE sip:34020000001110000044@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.199:15060;rport;branch=z9hG4bK796247609
From: <sip:34020000002000000001@3402000000>;tag=180247609
To: <sip:34020000001110000044@3402000000>
Call-ID: 807247609
CSeq: 2 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: LiveGBS v210723
Content-Length: 157
<?xml version="1.0" encoding="GB2312"?>
<Query>
<CmdType>Catalog</CmdType>
<SN>552247609</SN>
<DeviceID>34020000001110000044</DeviceID>
</Query>
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.199:15060;rport=15060;branch=z9hG4bK796247609
From: <sip:34020000002000000001@3402000000>;tag=180247609
To: <sip:34020000001110000044@3402000000>;tag=1518451596
Call-ID: 807247609
CSeq: 2 MESSAGE
User-Agent: IP Camera
Content-Length: 0
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.120:15068;rport;branch=z9hG4bK138770826
From: <sip:34020000001110000044@3402000000>;tag=2116434170
To: <sip:34020000002000000001@3402000000>
Call-ID: 111408894
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 590
<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>Catalog</CmdType>
<SN>552247609</SN>
<DeviceID>34020000001110000044</DeviceID>
<SumNum>1</SumNum>
<DeviceList Num="1">
<Item>
<DeviceID>34020000001320000001</DeviceID>
<Name>Camera 01</Name>
<Manufacturer>Hikvision</Manufacturer>
<Model>IP Camera</Model>
<Owner>Owner</Owner>
<CivilCode>CivilCode</CivilCode>
<Address>Address</Address>
<Parental>0</Parental>
<ParentID>34020000001110000044</ParentID>
<SafetyWay>0</SafetyWay>
<RegisterWay>1</RegisterWay>
<Secrecy>0</Secrecy>
<Status>ON</Status>
</Item>
</DeviceList>
</Response>
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.120:15068;rport=15068;received=192.168.0.120;branch=z9hG4bK138770826
From: <sip:34020000001110000044@3402000000>;tag=2116434170
To: <sip:34020000002000000001@3402000000>;tag=514247616
CSeq: 20 MESSAGE
Call-ID: 111408894
User-Agent: LiveGBS v210723
Content-Length: 0
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.120:15068;rport;branch=z9hG4bK1946244729
From: <sip:34020000001110000044@3402000000>;tag=1705757152
To: <sip:34020000002000000001@3402000000>
Call-ID: 1030239866
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 177
<?xml version="1.0" encoding="GB2312"?>
<Notify>
<CmdType>Keepalive</CmdType>
<SN>11</SN>
<DeviceID>34020000001110000044</DeviceID>
<Status>OK</Status>
<Info>
</Info>
</Notify>
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.120:15068;rport=15068;received=192.168.0.120;branch=z9hG4bK1946244729
From: <sip:34020000001110000044@3402000000>;tag=1705757152
To: <sip:34020000002000000001@3402000000>;tag=334251619
CSeq: 20 MESSAGE
Call-ID: 1030239866
User-Agent: LiveGBS v210723
Content-Length: 0
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.120:15068;rport;branch=z9hG4bK1402863583
From: <sip:34020000001110000044@3402000000>;tag=754663007
To: <sip:34020000002000000001@3402000000>
Call-ID: 187348500
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 177
<?xml version="1.0" encoding="GB2312"?>
<Notify>
<CmdType>Keepalive</CmdType>
<SN>12</SN>
<DeviceID>34020000001110000044</DeviceID>
<Status>OK</Status>
<Info>
</Info>
</Notify>
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.120:15068;rport=15068;received=192.168.0.120;branch=z9hG4bK1402863583
From: <sip:34020000001110000044@3402000000>;tag=754663007
To: <sip:34020000002000000001@3402000000>;tag=959261639
CSeq: 20 MESSAGE
Call-ID: 187348500
User-Agent: LiveGBS v210723
Content-Length: 0
RTSP推送
rtsp推送相關的資料和測試軟件比較少,支持RTSP TCP模式和UDP模式,除非對接第三方平臺,不建議使用RTSP推送。
具體流程如下:
1. rtsp推送流程.
主要分兩部分:第一部分先發送信令;第二部分發送rtp包。
信令流程:
1.1 先發送OPTIONS, OPTIONS比較常用,就不做詳細說明了。
1.2 發送ANNOUNCE, 發送ANNOUNCE主要是把要推送的音視頻信息通過sdp格式傳給服務器。關于sdp信息如何構造,對于h264請參考rfc6184. h265請參考rfc7798. 下面舉兩個例子.
h264+aac ANNOUNCE:
ANNOUNCE rtsp://192.168.0.188:554/livexxxx.sdp RTSP/1.0
Content-Type: application/sdp
CSeq: 2
User-Agent: xxxyyy
Content-Length: 489
v=0
o=- 0 0 IN IP4 127.0.0.1
s=dddookkk
c=IN IP4 192.168.0.188
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z00AKp2oHgCJ+WbgICAoAAADAAgAAAMBlCA=,aO48gA==; profile-level-id=4D002A
a=control:streamid=0
m=audio 0 RTP/AVP 97
a=rtpmap:97 MPEG4-GENERIC/44100/1
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1208
a=control:streamid=1
h265(hevc) + aac ANNOUNCE:
ANNOUNCE rtsp://192.168.0.174:554/live3.sdp RTSP/1.0
Content-Type: application/sdp
CSeq: 2
User-Agent: mmmmd
Content-Length: 364
v=0
o=- 0 0 IN IP4 127.0.0.1
s=uvsdewewe
c=IN IP4 192.168.0.174
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H265/90000
a=control:streamid=0
m=audio 0 RTP/AVP 97
a=rtpmap:97 MPEG4-GENERIC/44100/1
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1208
a=control:streamid=1
1.3 發送 SETUP,這個和播放基本一樣,請參考播放流程.
1.4 發送 RECORD,record之后,信令流程完成, 接下來發送rtp包即可。
關于rtp包的構造,h264 參考rfc6184。 h265參考 rfc7798。
以Android平臺為例,相關接口設計如下:
/*+++++++++++++++推送rtsp相關接口+++++++++++++++*/
/*
* 設置推送rtsp傳輸方式
*
* @param transport_protocol: 1表示UDP傳輸rtp包; 2表示TCP傳輸rtp包. 默認是1, UDP傳輸. 傳其他值SDK報錯。
*
* @return {0} if successful
*/
public native int SetPushRtspTransportProtocol(long handle, int transport_protocol);
/*
* 設置推送RTSP的URL
*
* @param url: 推送的RTSP url
*
* @return {0} if successful
*/
public native int SetPushRtspURL(long handle, String url);
/*
* 啟動推送RTSP流
*
* @param reserve: 保留參數,傳0
*
* @return {0} if successful
*/
public native int StartPushRtsp(long handle, int reserve);
/*
* 停止推送RTSP流
*
* @return {0} if successful
*/
public native int StopPushRtsp(long handle);
/*---------------推送rtsp相關接口---------------*/
RTMP推送
RTMP采用的是TCP傳輸,采用全自研框架,易于擴展,自適應算法讓延遲更低、采集編碼傳輸效率更高。延遲配合大牛直播SDK(官方)的播放器,依然可以實現毫秒級。
跨平臺設計如下:
[本地預覽]Windows平臺支持攝像頭/屏幕/合成數據實時預覽功能,Android/iOS平臺支持本地前后置攝像頭預覽;
[攝像頭反轉/旋轉]Windows平臺支持攝像頭水平反轉、垂直反轉、0°/90°/180°/270°旋轉;
[攝像頭采集]除常規YUV格式外,Windows平臺還支持MJPEG格式的攝像頭采集;
[麥克風/揚聲器采集]Windows平臺音頻輸入端支持麥克風、揚聲器,或麥克風和揚聲器混音輸入;
[RTMP推流]超低延時的RTMP協議直播推流SDK(Windows/Android/iOS支持RTMP擴展H.265推送);
[視頻格式]Windows/Android平臺支持H.264/H.265編碼(Android H.265硬編碼),iOS平臺支持H.264編碼;
[音頻格式]Windows/Android/iOS平臺支持AAC編碼,Windows/Android平臺支持Speex編碼;
[音頻編碼]Windows/Android平臺支持Speex推送、Speex編碼質量設置;
[音量調節]Windows/Android平臺采集端支持實時音量調節(其中,Windows平臺混音模式下支持單獨控制麥克風、揚聲器音量);
[H.264硬編碼]Windows/Android/iOS平臺支持H.264特定機型硬編碼;
[H.265硬編碼]Android/iOS平臺支持H.265特定機型硬編碼;
[硬編碼自適應]Android/iOS平臺支持硬編碼自適應,如檢測到硬編碼不支持,自動切換到軟編(iOS如H.265硬編,先切換到H.264硬編碼,如不支持再嘗試H.264軟編);
[軟硬編碼參數配置]支持gop間隔、幀率、bit-rate設置;
[軟編碼參數配置]支持軟編碼profile、軟編碼速度、可變碼率設置;
[多實例推送]支持多實例推送(如同時推送屏幕/攝像頭和外部數據);
[RTMP擴展H.265]Windows/Android/iOS推送SDK支持RTMP擴展H.265推送,Windows針對攝像頭采集軟編碼,使用H.265可變碼率,帶寬大幅節省,效果直逼傳統H.265編碼攝像頭,Android/iOS平臺支持H.265硬編碼;
[橫豎屏推流]Android/iOS平臺支持支持橫屏、豎屏推流;
[多分辨率支持]支持攝像頭或屏幕多種分辨率設置;
[Windows推屏]Windows平臺支持屏幕裁剪、窗口采集、屏幕/攝像頭數據合成等多種模式推送;
[移動端推屏]Android平臺支持后臺service推送屏幕(推送屏幕需要5.0+版本);
[移動端推屏]iOS平臺支持后臺推送屏幕(基于ReplayKit,需要iOS 10.0+版本);
[事件回調]支持各種狀態實時回調;
[水印]Windows平臺支持文字水印、png水印、實時遮擋,Android平臺支持文字水印、png水印;
[RTMP推送模式]支持RTMP推送 live|record模式設置(需服務器支持);
[鏡像]Android/iOS平臺支持前置攝像頭實時鏡像功能;
[前后攝像頭實時切換]Android/iOS平臺支持采集過程中,前后攝像頭切換;
[復雜網絡處理]支持斷網重連等各種網絡環境自動適配;
[動態碼率]支持根據網絡情況自動調整推流碼率;
[實時靜音]支持推送過程中,實時靜音/取消靜音;
[實時快照]支持推流過程中,實時快照;
[純音頻推流]支持僅采集音頻流并發起推流功能;
[純視頻推流]支持特殊場景下的純視頻推流功能;
[降噪]Windows/Android平臺支持環境音、手機干擾等引起的噪音降噪處理、自動增益、VAD檢測;
[回音消除]Android平臺支持實時傳遞遠端PCM數據,方便回音消除處理;
[外部編碼前視頻數據對接]支持YUV數據對接;
[外部編碼前音頻數據對接]支持PCM對接;
[外部編碼后視頻數據對接]支持外部H.264數據對接;
[外部編碼后音頻數據對接]外部AAC/PCMA/PCMU/SPEEX數據對接;
[推送端休眠設置]Windows平臺支持休眠接口(設置成休眠模式后CPU會適當降低);
[編碼后數據輸出]Android平臺支持輸出編碼后的H264/AAC數據到上層,方便對接第三方平臺(如GB28181)對接;
[擴展錄像功能]完美支持和錄像SDK組合使用,錄像相關功能,可參見”Windows/Android/iOS錄像SDK“;
[裁剪模式]Android/iOS平臺支持特定分辨率攝像頭裁剪模式設置;
[服務器兼容]支持自建服務器(如Nginx、SRS)或CDN。