戰(zhàn)指南)
做螢石開放平臺的音視頻接入我印象最深的一句話是設(shè)備接入這件事看起來是“填幾個參數(shù)、調(diào)一個接口”但真正決定項(xiàng)目后續(xù)順不順的其實(shí)是接入之前把整個鏈路想清楚了。螢石開放平臺的直播流管理核心就是把攝像頭這類設(shè)備通過平臺接入到云端然后拿到一路又一路的直播流地址再集成到自己的后臺、小程序或者App里。它解決的是“我有硬件設(shè)備怎么把它變成實(shí)時可看的音視頻資源”這個問題。這篇東西適合正在做音視頻開發(fā)、集成商項(xiàng)目、或是個人想快速搭一套可視化監(jiān)控系統(tǒng)的朋友參考我盡量把設(shè)備接入和直播流管理的實(shí)操細(xì)節(jié)都講透。1. 在碰代碼之前先把設(shè)備接入這件事想清楚1.1 設(shè)備接入的本質(zhì)是一條完整鏈路很多人拿到螢石開放平臺的文檔第一反應(yīng)是去找“接口列表”然后就開始調(diào)。這個順序雖然不能說錯但如果一開始不明白整條鏈路的走向后面排查問題會很被動。設(shè)備接入的本質(zhì)其實(shí)是把一條數(shù)據(jù)通路打通終端設(shè)備攝像頭/DVR/NVR通過螢石云完成注冊設(shè)備上線后由平臺側(cè)統(tǒng)一管理設(shè)備信息、通道信息、視頻流開放平臺再把設(shè)備能力以 HTTP OpenAPI 的形式暴露給開發(fā)者開發(fā)者拿著這些接口去獲取設(shè)備列表、拿直播地址最后在自家播放器里把畫面播出來。我習(xí)慣把這個過程拆成三段來看第一段是“設(shè)備上云”也就是設(shè)備端的注冊和在線第二段是“平臺取流”也就是通過開放平臺調(diào)用接口拿到可播放的地址第三段是“播放落地”也就是在網(wǎng)頁、客戶端、小程序里把流拉起來。三段中間任何一環(huán)斷了都會表現(xiàn)為“畫面出不來”。這里有一個容易混淆的點(diǎn)螢石開放平臺本身不直接生產(chǎn)視頻流它是“設(shè)備側(cè)能力的管理者和轉(zhuǎn)發(fā)者”。你要拿到的直播地址其實(shí)是平臺根據(jù)設(shè)備通道實(shí)時生成的帶有鑒權(quán)信息并且有過期時間。所以你會發(fā)現(xiàn)同樣的一個設(shè)備每次調(diào)用取流接口拿到的 URL 可能都不一樣這不是平臺不穩(wěn)定而是它的防盜鏈機(jī)制在起作用。1.2 前置準(zhǔn)備賬號、應(yīng)用、密鑰三件套設(shè)備接入和直播流管理繞不開三樣?xùn)|西開發(fā)者賬號、應(yīng)用、密鑰。這三者相當(dāng)于你的“系統(tǒng)身份證”。在螢石開放平臺控制臺注冊開發(fā)者賬號之后需要創(chuàng)建一個應(yīng)用應(yīng)用創(chuàng)建成功后會生成一對關(guān)鍵的密鑰AppKey 和 AppSecret。AppKey 相當(dāng)于你的應(yīng)用在平臺上的身份標(biāo)識AppSecret 相當(dāng)于你的應(yīng)用密碼。后續(xù)調(diào)用絕大多數(shù)開放平臺接口都需要先用這兩個值去換取訪問憑證 accessToken。accessToken 是一次性拿到的臨時身份令牌它在有效期內(nèi)可以讓你調(diào)用設(shè)備列表、直播地址等接口而不用每次帶著 AppSecret。說通俗點(diǎn)AppKey/AppSecret 就是“你的登錄賬號密碼”accessToken 就是“你登錄后發(fā)的會話票據(jù)”。這里要提醒一下AppSecret 的保管非常重要不要把它寫死在博客、GitHub、小程序前端這些能被扒到的地方。很多項(xiàng)目后期出現(xiàn)接口被惡意調(diào)用都是因?yàn)槊荑€從前端源碼里泄露出去的。正確的做法是把密鑰放在服務(wù)端由服務(wù)端統(tǒng)一換 token前端只拿 token 跟你們的業(yè)務(wù)服務(wù)通信。另外應(yīng)用創(chuàng)建時通常需要選擇應(yīng)用類型和權(quán)限范圍關(guān)于音視頻相關(guān)的權(quán)限要在控制臺里確認(rèn)已經(jīng)開通。我遇到過不少人在這一步卡住應(yīng)用建好了接口卻提示無權(quán)限排查了半天才發(fā)現(xiàn)音視頻能力沒有勾選開通。這也是為什么我把“前置準(zhǔn)備”單拎出來說因?yàn)樗苯記Q定后面的流程是否走得通。1.3 設(shè)備接入的三種方式怎么選螢石設(shè)備接入開放平臺從操作路徑上大致分三類我根據(jù)自己的項(xiàng)目經(jīng)驗(yàn)整理了一個對比接入方式適用場景優(yōu)點(diǎn)需要注意的點(diǎn)App 掃碼/驗(yàn)證碼綁定個人開發(fā)、快速驗(yàn)證操作簡單設(shè)備信息自動上云設(shè)備歸到賬號下要保證賬號體系一致開放平臺控制臺手動添加集成商項(xiàng)目、批量管理有設(shè)備管理和通道管理界面能快速核對需要拿到設(shè)備序列號和驗(yàn)證碼OpenAPI 接口對接獨(dú)立產(chǎn)品化、二次開發(fā)可自動化創(chuàng)建用戶、設(shè)備、流地址邏輯復(fù)雜度高調(diào)試鏈路長如果你是個人做測試最省事的方式是先把設(shè)備用手機(jī)上的螢石云視頻 App 綁定到賬號再用同一個手機(jī)號注冊開發(fā)者賬號然后調(diào)接口查回來的設(shè)備列表就是你這批設(shè)備。如果你是幫客戶做集成那客戶手里那批攝像頭很可能已經(jīng)在別人賬號下你需要讓客戶先在螢石云視頻 App 上把設(shè)備解綁再綁到你項(xiàng)目對應(yīng)的管理賬號里否則接口是拉不到這些設(shè)備的。還有一種情況是設(shè)備走局域網(wǎng)私有協(xié)議或其他非螢石協(xié)議的 IPC那這條路就暫時走不通。螢石開放平臺的設(shè)備接入主要面向支持螢石協(xié)議、能夠上云的硬件設(shè)備。如果客戶用的是雜牌攝像頭又不支持螢石協(xié)議先別急著寫代碼得先確認(rèn)硬件層面是否具備接入條件。2. 設(shè)備接入的完整實(shí)操流程從注冊到上線2.1 創(chuàng)建應(yīng)用并拿到密鑰我先說下我通常的操作路徑。在螢石開放平臺控制臺注冊并登錄后進(jìn)入“開發(fā)者服務(wù)”里的“應(yīng)用管理”創(chuàng)建一個應(yīng)用。應(yīng)用名稱、描述這些按實(shí)際填就行關(guān)鍵是創(chuàng)建成功后在應(yīng)用詳情頁里找到 AppKey 和 AppSecret。拿到密鑰之后第一件事不是去調(diào)設(shè)備接口而是先用它獲取一次 accessToken 驗(yàn)證一下鏈路是通的。接口形式一般是 POST 請求把 AppKey 和 AppSecret 作為參數(shù)提交返回的數(shù)據(jù)里會帶 accessToken 和過期時間。你可以用 Postman、Apifox或者直接在命令行里 curl 一把。我第一次用的命令大致長這樣curl -X POST https://open.ys7.com/api/lapp/token/get \ -d appKey你的AppKey \ -d appSecret你的AppSecret返回正常的話你會拿到一串很長的 accessToken。這個token的有效期每個開發(fā)者應(yīng)用可能有差異但通常是以天為級別的。我建議你在項(xiàng)目里做一個統(tǒng)一的服務(wù)端 token 管理定時刷新避免在業(yè)務(wù)代碼里到處粘貼 token。這里有一個實(shí)踐上的細(xì)節(jié)accessToken 在快過期的時候再去刷新就行不要每次請求都重新?lián)Q取。開放平臺接口一般有頻率限制頻繁換取 token 容易觸發(fā)限流反而讓業(yè)務(wù)收到異常錯誤。我在一個項(xiàng)目里就犯過這個毛病寫了個每次調(diào)用都先調(diào) token 接口的代碼結(jié)果一壓測直接被平臺限流教訓(xùn)很深刻。2.2 把設(shè)備添加到賬號序列號與驗(yàn)證碼拿到密鑰和 token 之后最關(guān)鍵的一步來了把設(shè)備加到你的賬號下。這一步很多人以為是調(diào)一個“設(shè)備添加”接口就完了其實(shí)根據(jù)設(shè)備當(dāng)前狀態(tài)不同操作路徑是不同的。如果設(shè)備是全新的你可以在“螢石云視頻”App 里通過掃碼或者手動錄入 SN設(shè)備序列號、驗(yàn)證碼來添加。設(shè)備會出現(xiàn)在你賬號的設(shè)備列表里。然后開發(fā)者控制臺對應(yīng)的同賬號下也能在設(shè)備列表里看到它。如果是控制臺方式添加一般是進(jìn)入設(shè)備管理頁面選擇添加設(shè)備輸入設(shè)備序列號和設(shè)備驗(yàn)證碼。設(shè)備序列號在哪里看通常貼在攝像頭機(jī)身底部或側(cè)面是一串由字母和數(shù)字組成的 SN比如像 “E12345678” 或 “C12345678” 這種格式。設(shè)備驗(yàn)證碼則是單獨(dú)的一串 6 位字符也在機(jī)身標(biāo)簽上和 SN 是兩樣?xùn)|西。很多人會把這倆搞混或者找不到驗(yàn)證碼就去試默認(rèn)密碼位結(jié)果是“驗(yàn)證碼錯誤”或者“設(shè)備已被添加”。注意這里說的是設(shè)備接入開放平臺的“賬號歸屬權(quán)”。設(shè)備在同一時間里只能被一個主賬號管理。如果客戶手里那臺設(shè)備之前已經(jīng)綁定了別的賬號你必須先在原賬號下刪除或解綁設(shè)備才能在新的賬號下添加成功。我在調(diào)試一個項(xiàng)目時客戶發(fā)來一臺“二手?jǐn)z像頭”我始終添加失敗最后才確認(rèn)是前任綁定沒有解除。所以接手設(shè)備前先確認(rèn)這臺設(shè)備是不是“自由身”很重要。2.3 用 token 查詢設(shè)備列表與通道狀態(tài)設(shè)備添加成功之后項(xiàng)目代碼里通常要做的第一件業(yè)務(wù)操作就是“查詢設(shè)備列表”。開放平臺提供了設(shè)備列表相關(guān)的接口傳入 accessToken可以拿到當(dāng)前賬號下的設(shè)備信息一般包括設(shè)備序列號、設(shè)備名稱、設(shè)備狀態(tài)、通道列表這些字段。我一般會在代碼里把設(shè)備列表和通道狀態(tài)打印出來因?yàn)檫@是驗(yàn)證“設(shè)備接入是否真正生效”的最直接證據(jù)。設(shè)備狀態(tài)status通常用 1 和 0 來表示在線和離線通道列表里的通道號channelNo則是后面取流時必填的參數(shù)。通道的概念要稍微解釋一下。普通家用攝像頭通常有 1 個通道也就是一路畫面但對于 NVR 這類設(shè)備一個 NVR 下可能掛接多路 IPC每個通道對應(yīng)一路攝像頭。所以查詢出來的設(shè)備下會有一個 channel 數(shù)組里面的 channelNo 從 1 開始編號。取流的時候你不僅要告訴平臺“我要看哪臺設(shè)備”還要告訴它“我要看這臺設(shè)備的第幾路畫面”。在調(diào)試階段我會在庫里把 deviceSerial 和 channelNo 一起保存下來作為后面調(diào)用直播地址接口的基礎(chǔ)數(shù)據(jù)。這里有個小經(jīng)驗(yàn)設(shè)備序列號的大小寫必須原樣保留很多人在手抄或復(fù)制中把大小寫搞錯了導(dǎo)致查詢不到設(shè)備。英文字母 O 和數(shù)字 0、字母 I 和數(shù)字 1 也是重災(zāi)區(qū)建議直接從設(shè)備列表接口返回的數(shù)據(jù)里復(fù)制粘貼而不是人肉抄錄。2.4 設(shè)備上線的判斷標(biāo)準(zhǔn)與排查思路設(shè)備加入賬號后不代表立刻就能取流。你還需要確認(rèn)設(shè)備狀態(tài)是“在線”。在控制臺的設(shè)備管理頁面里你會看到設(shè)備的在線狀態(tài)在線才說明設(shè)備已經(jīng)成功連上云端具備取流條件。實(shí)際項(xiàng)目里我發(fā)現(xiàn)設(shè)備離線的原因大致有這么幾類設(shè)備所在網(wǎng)絡(luò)無法訪問外網(wǎng)、設(shè)備被斷電、Wi-Fi 信號弱導(dǎo)致頻繁重連、NTP 時間不對導(dǎo)致設(shè)備鑒權(quán)失敗。螢石云設(shè)備上云依賴公網(wǎng)連接如果項(xiàng)目部署在比較封閉的內(nèi)網(wǎng)環(huán)境、設(shè)備只連著局域網(wǎng)那它是無法跟云端建立長連接的直播流當(dāng)然出不來。判斷設(shè)備是否在線不要只看控制臺頁面最好在代碼里循環(huán)檢測設(shè)備列表接口返回的 status 字段。我在對接某項(xiàng)目的時候曾經(jīng)遇到頁面顯示在線但接口返回“設(shè)備不在線”的情況。后來發(fā)現(xiàn)是因?yàn)轫撁嬗芯彺嫜舆t真實(shí)的狀態(tài)以接口返回為準(zhǔn)。所以業(yè)務(wù)邏輯里要盡量以接口數(shù)據(jù)做實(shí)時狀態(tài)判斷不要依賴人工去看頁面。3. 直播流管理從取流地址到播放器落地3.1 直播地址是怎么生成的設(shè)備在線之后直播流管理就進(jìn)入關(guān)鍵環(huán)節(jié)從平臺獲取一路可以播放的直播地址。螢石開放平臺直播流管理的核心接口大致是這樣傳入 accessToken、設(shè)備序列號 deviceSerial、通道號 channelNo以及想要的協(xié)議類型 protocol平臺返回一條帶鑒權(quán)的 URL 和過期時間。我把直播地址的生成過程理解為“平臺按需簽發(fā)的門票”。你告訴平臺想看哪臺設(shè)備的哪個通道、想用什么協(xié)議看、想看多久平臺就給你生成一張對應(yīng)“門票”URL。這張門票帶有時效和簽名信息播放器拿這個 URL 去拉流平臺校驗(yàn)通過后就把視頻流放出來。這里有一個容易混淆的地方直播地址接口返回的是“地址”并不是“視頻流本身”。相當(dāng)于平臺給你指了一個“哪里能拿到流”的方向真正拉流是播放器基于這個地址去做的。所以調(diào)試時不要只盯著接口返回是否成功還要用播放器實(shí)際拉流驗(yàn)證返回的 URL 是否可播。關(guān)于協(xié)議類型我通常見到的有 RTMP、HLS、RTSP、HTTPS-FLV 這幾種。選擇哪種取決于你要在什么端播放不能一概而論。下面我會展開講一下協(xié)議選型。3.2 RTMP/HLS/RTSP/HTTPS-FLV 怎么選這是我被問得最多的問題之一。很多剛接觸螢石開放平臺的人看到返回的地址后綴不一樣就會擔(dān)心是不是選錯了協(xié)議。其實(shí)這幾個協(xié)議沒有絕對的優(yōu)劣關(guān)鍵是匹配你的播放端和業(yè)務(wù)場景。協(xié)議延遲水平播放端適配典型場景HLS中等秒級網(wǎng)頁、移動端兼容性好通用監(jiān)控回放、低交互需求RTMP低1-2秒PC播放器、部分服務(wù)端轉(zhuǎn)推友好傳統(tǒng)直播平臺轉(zhuǎn)推RTSP極低毫秒級專業(yè)播放器/VLC局域網(wǎng)或?qū)I(yè)客戶端HTTPS-FLV低1-3秒網(wǎng)頁、移動端支持較好Web端低延遲播放我自己的習(xí)慣是如果做 Web 端監(jiān)控頁面優(yōu)先考慮 HTTPS-FLV 或 HLS如果用 VLC 這類本地播放器調(diào)試RTSP 和 RTMP 都很直觀如果要做微信小程序端播放則要看小程序 live-player 組件的協(xié)議支持情況通常 HLS 兼容性較好部分場景可用 RTMP。這里插一句不要迷信“延遲越低越好”因?yàn)榈脱舆t協(xié)議往往對網(wǎng)絡(luò)和播放器要求更高出現(xiàn)花屏、卡頓的概率也會增加。我見過一個客戶執(zhí)意要 RTSP 方案來做手機(jī)端觀看結(jié)果在 4G 網(wǎng)絡(luò)下頻繁斷流最后還是換成了 HLS。選協(xié)議前先明確需求你的用戶是用什么終端看、對延遲的容忍度是多少、網(wǎng)絡(luò)環(huán)境是否可控這幾個問題定了再選協(xié)議。3.3 把直播流地址接到播放器里拿到直播地址之后下一步就是播放器驗(yàn)證。我調(diào)試監(jiān)控流最常用的工具是 VLC 和 ffplay因?yàn)樗鼈儾恍枰獙懘a打開地址就能播。比如你拿到了一個 RTSP 地址直接在 VLC 里打開網(wǎng)絡(luò)串流輸入地址回車幾分鐘內(nèi)就能確認(rèn)這個流是否正常。如果你是在自己的應(yīng)用里集成那就要用播放器 SDK 或前端播放庫。螢石官方有自家的播放器組件同時你也可以根據(jù)協(xié)議選用通用方案。比如 HLS 在 Web 端可以用 hls.jsFLV 流可以用 flv.js小程序端則用 live-player 組件。這些方案之間沒有絕對的好與壞更多是看你的播放端技術(shù)棧。我建議項(xiàng)目一開始就把播放器做成一個獨(dú)立的模塊配置文件里能切換協(xié)議和地址。因?yàn)樵诤罄m(xù)聯(lián)調(diào)中你很有可能會因?yàn)榫W(wǎng)絡(luò)原因從 RTMP 切到 FLV或者從 HLS 切到 WebRTC 方案播放器可配置會省掉很多不必要的重構(gòu)。接播放器的時候還有一個地方要留意直播 URL 里通常帶鑒權(quán)參數(shù)這些參數(shù)在拼接進(jìn)播放器之前一定要做必要的 URL 編碼處理否則播放器解析地址的時候會截斷或者漏參表現(xiàn)為“視頻加載不出來但接口返回明明是成功的”。3.4 直播地址的有效期與防盜鏈處理直播流管理最容易忽略的就是地址有效期。螢石開放平臺生成的直播地址并不是永久有效的這個設(shè)計本意是防止地址被惡意盜用但如果你沒有做地址的定時刷新管理就會出現(xiàn)“用戶看著看著畫面突然黑掉”的問題。我在實(shí)際項(xiàng)目里見過不少這樣的情況開發(fā)者把直播地址存在數(shù)據(jù)庫里第二天再拿出去播結(jié)果全斷了。這是因?yàn)榈刂愤^期了。解決方案一般是兩種思路一是每次播放時都即時調(diào)用接口獲取新地址不落庫二是做地址緩存刷新機(jī)制在地址過期前重新獲取并替換??紤]到直播地址接口調(diào)用也有頻率限制我傾向于采用“按需獲取 短時緩存”的策略。當(dāng)用戶進(jìn)入某個監(jiān)控頁面時后端才去拿直播地址返回給前端緩存時間控制在地址有效期內(nèi)。這樣既不會頻繁調(diào)用接口也能保證用戶每次看到的地址都是新鮮可用的。另外要強(qiáng)調(diào)一點(diǎn)拿到直播地址接口返回后不要把 expires 時間字段丟了。前端可以在播放前檢查地址是否快要過期快過期時就重新向后端要地址避免播放中斷。這個體驗(yàn)細(xì)節(jié)在做過幾個項(xiàng)目之后你會意識到它有多重要。4. 我踩過的坑常見問題與排查經(jīng)驗(yàn)4.1 序列號、驗(yàn)證碼相關(guān)的坑怎么避開序列號和驗(yàn)證碼問題是我在設(shè)備接入階段遇到最多的一類坑。先說序列號。SN 是設(shè)備的唯一標(biāo)識很多設(shè)備因?yàn)殚L期放在戶外機(jī)身標(biāo)簽褪色或者磨損抄錄時很容易看錯字符。更麻煩的是有些項(xiàng)目的設(shè)備列表是從 Excel 表格里導(dǎo)出來的表格里的 SN 前導(dǎo)空格、字母大小寫、全半角括號都會導(dǎo)致接口查不到設(shè)備。我在做一個連鎖門店項(xiàng)目時就曾經(jīng)因?yàn)?SN 里的字母 I 被誤寫成數(shù)字 1導(dǎo)致門店設(shè)備一直在設(shè)備列表里查不到。折騰了一個晚上最后逐字符比對才找出問題。我的建議是所有設(shè)備信息盡量通過接口拉取后直接落庫不要人工維護(hù) SN 表格。如果需要人工錄入前端要做格式校驗(yàn)比如限制只能輸入字母數(shù)字、統(tǒng)一轉(zhuǎn)為大寫、去掉前后空格。驗(yàn)證碼的問題則更隱蔽。驗(yàn)證碼是設(shè)備在云信令節(jié)點(diǎn)認(rèn)證時用的不是所有設(shè)備都一直印在機(jī)身上。有些設(shè)備出廠后驗(yàn)證碼可能被管理員在 App 里修改過所以你拿著機(jī)身標(biāo)簽上的驗(yàn)證碼去添加反而提示錯誤。這時候需要先通過已有渠道確認(rèn)驗(yàn)證碼是否被重置過。如果確認(rèn)不了只能通過設(shè)備重置恢復(fù)出廠重新獲取驗(yàn)證碼。4.2 設(shè)備離線、通道號不對導(dǎo)致取流失敗取流失敗的排查我一般先看設(shè)備在不在線。很多次同事跟我說“取流失敗”我第一反應(yīng)不是去看直播地址接口而是先查設(shè)備列表接口看 status 是不是 1。如果設(shè)備離線直播地址接口大概率會提示設(shè)備不在線這時候花時間去分析 URL 是沒有意義的。設(shè)備在線但取流還是失敗就要看通道號。NVR 設(shè)備在添加不同 IPC 通道后通道號可能是按添加順序分配的也可能在配置界面手動調(diào)整過。如果不核對通道號和實(shí)際畫面的對應(yīng)關(guān)系就會出現(xiàn)“視頻流能拉到但畫面不是預(yù)期那個攝像頭”的情況。我的經(jīng)驗(yàn)是初始化階段就把設(shè)備列表接口返回的通道數(shù)組完整打印出來跟現(xiàn)場畫面逐一核對再錄入數(shù)據(jù)庫中不要等上線之后再來回排查。還有一種情況是設(shè)備在線、通道號也對但直播地址接口返回的 URL 在播放器里播不出來。這時候我會先試 VLC 手動播一下。如果 VLC 也播不出來就換個協(xié)議類型再取一次地址試試。有些設(shè)備或網(wǎng)絡(luò)環(huán)境下某個協(xié)議的流會被防火墻或運(yùn)營商給攔掉換一個協(xié)議往往就通了。4.3 播放黑屏、卡頓、花屏怎么排查黑屏和卡頓的問題發(fā)生在“播放”這一段的概率遠(yuǎn)大于“取流”這一段。我先說黑屏如果直播地址接口返回成功URL 放入播放器后畫面一直黑屏很大概率是播放器和協(xié)議不匹配。比如你拿了 HLS 地址但是播放器對 HLS 的支持有問題或者拿了 RTSP 地址播放器所在網(wǎng)絡(luò)對 RTSP 端口不通。卡頓和花屏則要先分清是設(shè)備上傳帶寬不足還是播放端下行帶寬不足。很多家用攝像頭在公網(wǎng)上傳本身就受限當(dāng)碼率較高而網(wǎng)絡(luò)上行不穩(wěn)定時平臺輸出的流就會出現(xiàn)花屏。排查辦法是把直播地址拿到一個網(wǎng)絡(luò)更好的環(huán)境里播如果流暢那就是上行或中間鏈路的問題如果還是卡頓就要考慮降低碼率或換協(xié)議。還有一個小細(xì)節(jié)螢石開放平臺直播流默認(rèn)的編碼參數(shù)是設(shè)備側(cè)的有些老設(shè)備默認(rèn)編碼是 H.264有些新設(shè)備支持 H.265。如果你在網(wǎng)頁端用瀏覽器播放 H.265 格式的流可能會遇到兼容性問題因?yàn)椴簧贋g覽器對 H.265 的支持并不好。這時候要么在平臺或設(shè)備側(cè)切編碼格式要么改用原生播放器方案。4.4 排查問題的幾個好習(xí)慣踩坑踩多了我慢慢養(yǎng)成一套自己的排查習(xí)慣。第一所有接口請求和響應(yīng)日志必須留詳細(xì)尤其是 accessToken、deviceSerial、channelNo、協(xié)議類型、請求時間、返回碼。很多問題其實(shí)在日志里一眼就能看出來比如 token 過期了、設(shè)備號打錯了、參數(shù)格式不對。沒有日志排查就像盲人摸象。第二先分清是“平臺的問題”還是“自己的問題”。拿到一個報錯先看返回碼在官方文檔里的含義再對照自己的請求參數(shù)。很多時候不是你代碼寫得不對而是文檔里要求的字段你沒傳全或者格式不對。開放平臺對這些字段是非常敏感的多一個空格、少一個字符都可能報參數(shù)錯誤。第三做技術(shù)驗(yàn)證時要敢于用最笨的工具。不要一上來就在自己的播放器代碼里加斷點(diǎn)先用 VLC 手動拉流驗(yàn)證地址是否有效有效就說明平臺這一側(cè)是通的問題在播放器代碼無效就說明取流環(huán)節(jié)有異常往上排查。這個次序能幫你快速收斂問題范圍。大家不要覺得這些是“基本功”就掉以輕心。我在實(shí)際項(xiàng)目中見過不少莫名其妙的故障最后定位下來的原因其實(shí)都特別基礎(chǔ)比如設(shè)備掉線、密鑰輪換后沒有及時更新、地址過期后前端還在死磕舊地址。這些問題的共同特點(diǎn)就是在接入階段沒把鏈路搞清楚在管理階段沒把生命周期管起來。最后再分享一個我自己的習(xí)慣每次對接螢石開放平臺的音視頻項(xiàng)目我都會在項(xiàng)目初期做一個小工具頁面專門用來展示賬號下的設(shè)備列表、通道狀態(tài)、在線狀態(tài)并且能一鍵獲取某臺設(shè)備當(dāng)前最新的直播地址。這個小工具看起來不起眼但它幫我省下了大量“幫客戶驗(yàn)證設(shè)備到底能不能看”的時間。設(shè)備接入和直播流管理說到底是鏈路、數(shù)據(jù)和管理的問題把這三樣理清了項(xiàng)目的穩(wěn)定性基本就有了底。