視訊直播的 推流是啥意思
昨晚和死黨聊天的時候聽他聽到推流這個東西,然後就找了下資料瞭解了一下,這兒做個簡單的隨筆記錄
推流
推流:指的是把採集階段封包好的內容傳輸到伺服器的過程。其實就是將現場的視訊訊號傳到網路的過程。所謂“採集階段封包好”,我覺得應該是未解碼的H264的NALU。
我再直白點,推流就是把本地音視訊資料(編碼過的)通過網路上傳到雲端/後臺伺服器的過程
流程大概是這樣:原視訊—>對音視訊進行編碼—>某種封裝格式封裝—>通過某種協議傳輸—>伺服器
問題1
這兒呢就有一個問題:“所有的視訊都一定要編碼嗎?” 答案是肯定的。相信檢視其他人的部落格的理由是一樣的:不經過壓縮的視訊太大!在網路傳輸時對頻寬的要求和壓力太大!
視訊編碼的主要作用是將視訊畫素資料(RGB,YUV等)壓縮成視訊碼流,從而降低視訊的資料量。舉個例子:比如當前手機的螢幕解析度是1280 * 720
(即我們平時在視訊軟體中可選的720P),假設一秒鐘30幀(即1秒鐘傳輸30張圖片),那麼一秒鐘的資料為 1280 * 720(位畫素)*30(張) / 8(
1位元組8位),也就是一秒鐘的資料量為3.456M資料量,一分鐘就是207.36M,那麼我們平常看一部電影就是大約18G的流量,這樣是很恐怖的一件事
問題2
H264的NALU是個啥,這就需要涉及一點H264編碼格式的知識
首先 H264 是一種編碼格式,或者說編碼演算法,包含兩個東西 VCL(視訊編碼層)和NAL(網路提取層),大概步驟可以這麼理解
- 壓縮:預測(幀內預測和幀間預測)-> DCT變化和量化 -> 位元流編碼;
- 切分資料,主要為了第三步。這裡一點,網上看到的“切片(slice)”、“巨集塊(macroblock)”是在VCL中的概念,一方面提高編碼效率和降低誤位元速率、另一方面提高網路傳輸的靈活性。
- 打包封裝成NAL。
NALU是NAL的組成單元, NALU由頭和身體兩個部分組成:
- 頭:一般儲存標誌資訊,譬如NALU的型別。
- 身體:儲存了真正的資料。
更多H264的資訊見 https://zhuanlan.zhihu.com/p/71928833
問題三
所謂的封裝格式究竟是啥?
在日常我們一定見過很多字尾為avi, mp4, rmvb, flv等格式的視訊檔案。其實avi, mp4, rmvb, flv就是是所謂的封裝視訊的封裝格式。
問題四
從視訊播放器播放一個網際網路上的視訊檔案的過程
需要經過以下幾個步驟:解協議,解封裝,解碼視音訊,視音訊同步。如果播放下載好了的本地檔案則不需要解協議,其他步驟相同。
- 解協議:流媒體協議的資料,解析為標準的相應的封裝格式資料
- 解封裝:將輸入的封裝格式的資料,分離成為音訊流壓縮編碼資料和視訊流壓縮編碼資料。
- 解碼:就是將視訊/音訊壓縮編碼資料,解碼成為非壓縮的視訊/音訊原始資料。
- 視音訊同步:就是根據解封裝模組處理過程中獲取到的引數資訊,同步解碼出來的視訊和音訊資料,並將視訊音訊資料送至系統的顯示卡和音效卡播放出來。