昨晚和死黨聊天的時候聽他聽到推流這個東西,然后就找了下資料了解了一下,這兒做個簡單的隨筆記錄
推流
推流:指的是把采集階段封包好的內容傳輸到服務器的過程。其實就是將現場的視頻信號傳到網絡的過程。所謂“采集階段封包好”,我覺得應該是未解碼的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就是是所謂的封裝視頻的封裝格式。
問題四
從視頻播放器播放一個互聯網上的視頻文件的過程
需要經過以下幾個步驟:解協議,解封裝,解碼視音頻,視音頻同步。如果播放下載好了的本地文件則不需要解協議,其他步驟相同。

- 解協議:流媒體協議的數據,解析為標准的相應的封裝格式數據
- 解封裝:將輸入的封裝格式的數據,分離成為音頻流壓縮編碼數據和視頻流壓縮編碼數據。
- 解碼:就是將視頻/音頻壓縮編碼數據,解碼成為非壓縮的視頻/音頻原始數據。
- 視音頻同步:就是根據解封裝模塊處理過程中獲取到的參數信息,同步解碼出來的視頻和音頻數據,並將視頻音頻數據送至系統的顯卡和聲卡播放出來。
