Posted on

使用OBS來推流H265

使用OBS來推流H265

OBS也在v29板之後支持了HEVC推流,支持利用RTMP的封裝方式來推送H265編碼的串流格式,若電腦沒有可支持硬編碼的GPU,其CPU編碼所採取的編碼方案是QuickSync HEVC。

若是電腦有可支持硬編碼的GPU,則下拉選單會增加該硬件編碼的編碼選項

並且可以錄製SVT-AV1、AOM-AV1和HEVC的格式的影片

Posted on

高壓縮比編碼格式的介紹 – AV1

高壓縮比編碼格式AV1介紹

AV1是一種免費、開源的視頻編解碼器,由Alliance for Open Media(AOMedia)聯盟開發。它是H.265(HEVC)的競爭對手,旨在提供更高的壓縮效率和更好的視頻質量。
AV1使用了許多新技術來提高壓縮效率,例如可變帶寬預測、可變塊大小和可變熵編碼等。與H.265相比,AV1在相同的比特率下可以提供更高的視頻質量。同時,AV1還具有更好的自適應流媒體性能,可以更好地適應網絡帶寬的變化。
AV1可以支持多種分辨率和色彩空間,包括8位、10位和12位色彩深度。此外,它還可以支持HDR(高動態範圍)和WCG(廣色域)等高級視頻格式,以提供更真實的圖像質量。
由於AV1是一種開放標準,並且沒有專利費用,因此它被廣泛用於在線視頻流媒體服務和其他應用,例如YouTube、Netflix、Amazon Prime Video等。同時,AV1還適用於各種類型的視頻內容,包括電影、電視節目、動畫和遊戲。

常見的編碼器

SVT-AV1和AOM-AV1

SVT-AV1和AOM-AV1都是AV1編碼器,不過它們有幾個不同之處:

  • 開發者:SVT-AV1是由英特爾開發的,而AOM-AV1是由Alliance for Open Media(AOM)開發的。
  • 編碼質量:SVT-AV1相對於AOM-AV1來說,可以提供更高的編碼質量,尤其是在高比特率下。
  • 編碼速度:AOM-AV1的編碼速度相對於SVT-AV1來說更快,這對於需要實時編碼的場景非常重要。
  • 適用範圍:SVT-AV1更適用於需要高質量視頻編碼的場景,如影片後期製作等;而AOM-AV1更適用於實時編碼的場景,如視頻通話、視頻會議等。

甚麼是AV1 SVC

AV1 SVC中的SVC是指可伸縮視頻編碼(Scalable Video Coding)。可伸縮視頻編碼是一種視頻編碼技術,可以將視頻數據分成多個層級,每個層級可以根據不同的要求進行編碼和解碼。這種編碼技術可以在不同的設備和網絡帶寬上提供不同的視頻質量和分辨率。在AV1 SVC中,視頻數據被分成多個空間和時間層級。空間層級是根據空間分辨率進行編碼的,例如低分辨率圖像和高分辨率圖像。時間層級是根據時間分辨率進行編碼的,例如低幀率和高幀率圖像。這些層級可以按需選擇和合併,以提供適合設備和網絡帶寬的最佳視頻質量。+

AV1 SVC可以提供更高的編碼效率和更好的視頻質量,同時可以適應不同的設備和網絡環境。這使得它非常適合用於實時視頻流傳輸、視頻會議和移動通信等應用場景。AV1是第一個支持SVC的編解碼器。對於那些對關於SVC是如何發揮作用的更多細節感興趣的人,Alex E.博士在2016年寫了一篇很好的解釋性博文。寫的是關於VP9,大多數點對AV1有效的內容。

SVT-AV1和AOM-AV1都支持可伸縮視頻編碼(SVC),但是它們支持的SVC規格略有不同。具體而言:

  • SVT-AV1支持SVC的規格是MPEG-5 Part 2 LCEVC(Low Complexity Enhancement Video Coding),這是一種用於增強現有編碼器的規格,可以提高編碼效率和視頻質量。
  • AOM-AV1支持的SVC規格是AV1 Scalable Video Technology(SVT),這是一種基於AV1的可伸縮視頻編碼技術,可以實現在不同的網絡帶寬和終端設備之間動態調整視頻質量和分辨率。

非常適合用於會議場合

AV1旨在與下一波WebRTC視頻創新集成:端到端加密,SVC和獨立於編解碼器的轉發。因此,這與視頻編解碼器無關,而與下一代架構有關。

1. 隨著WebRTC現在通過可插入流(和SFrame)合併了E2E加密,並且NSA現在推薦E2E安全性,由於有效負載可能是不透明的,因此會議系統需要RTP標頭擴展來轉發數據包。因此,如果瀏覽器和編解碼器不支持可插入流或與下一代編解碼器集成的轉發頭擴展名,則將無法滿足NSA的要求,並且會議供應商將無法提供完整的功能。

2. SVC支持對於會議很重要。AV1內置了SVC;在HEVC中,它是一個擴展。Dependency Descriptor(在AV1 RTP有效負載規範中定義)優於用於空間可伸縮性模式的Framemarking RTP標頭擴展。如果瀏覽器(和下一代編解碼器)不支持帶有轉發頭擴展名的SVC,那麼它就沒有競爭力。

3. AV1包含屏幕編碼工具作為基本功能,而不是像HEVC中的擴展。這是會議的主要競爭優勢。”

屏幕共享

對於文本內容以及超高動態內容,在對屏幕內容進行編碼時,AV1都非常高效。實際上,AV1實時的性能非常優越,以至於像Cisco在Webex中所做的那樣,AV1實時可能只部署在單個使用案例中。

在共享屏幕或應用程序時,如果選擇了“優化運動和視頻”,並且您所在的機器至少有四個內核,則支持傳輸AV1。任何至少有兩個內核的機器都支持接收AV1。只要會議的所有參與者都支持AV1,AV1就會自動用於共享此類屏幕內容,否則它將自動恢復為H.264。

有趣的是,這里分別提到了4和2個內核的約束條件。思科在2019年6月的大蘋果大會上進行現場演示時也發表了同樣的觀點。

我們將在下一個部分中繼續討論性能的問題,但是為了提供相關的背景信息,MacBook Air自2008年以來一直使用具有2個內核的Intel core-2芯片,並且自2011年以來在MacBook Pro中具有4個或更多內核的Intel i7或更高版本。就筆記本電腦和台式機而言,預計擁有4個內核並不是一個大問題。

端到端加密

E2EE是下一件值得關注的問題。也許是因為這是webrtc最初許下的承諾之一。又或許是因為它成為了一個過度使用的營銷術語,而Zoom已經變得遍體鱗傷。也許是因為大多數人仍然聲稱擁有它,實際上卻沒有。

關於E2EE,對這個問題最好的回應之一是Emil Ivov的這篇演講。

雖然許多人認為E2EE加密只是一種視頻會議或聊天應用程序功能,但它在整個媒體行業中都以縮寫“DRM”(數字版權管理)的形式使用。然而,傳統的DRM在瀏覽器和媒體播放器中的實現並不是真正的端到端的,只涵蓋了交付這一模塊。當人們上傳他們的內容到一個平台時仍然需要信任這個平台(以及任何可以合法訪問或不合法訪問該平台的人)與他們的原始內容。

真正的E2EE要求在對媒體進行編碼時在源處對媒體進行加密,並且僅在播放時對其進行解密。它允許內容提供商不信任該平台。

WebRTC可通過插入流API方案來得到了廣泛的應用,因為它可以用於很多方面。它是使您能夠訪問媒體的API,也是啟用E2EE的必要步驟。但是,它本身沒有加密功能或加密密鑰管理功能。

推流端支持AV1的相關資料

SRS在4.0.91開始支持經過WebRTC去推流AV1
RTC: Support av1 for Chrome M90 enabled it. 4.0.91
事實上,這已經是瀏覽器內建就可以做到的了。針對WEBRTC而言,Chrome已經在90版之後支持AV1編碼
Google Chrome 90 正式版發佈,支援 AV1 解碼

另外騰訊雲則可支持使用AV1格式推流
實現直播AV1 編碼

解碼端支持AV1的相關資料

騰訊雲有自己開發出可支援AV1透過FLV格式來解碼
播放AV1格式視頻

播放AV1視頻

通過支持AV1的播放器,按播放步驟3中生成的地址進行播放即可。在播放器的選擇上,可以選擇已支持AV1的播放器,也可以對自有播放器進行改造。

已支持AV1的播放器

App 客戶端

1. ExoPlayer已支持AV1,用的libgav1
2. ijkplayer FFmpeg 版本陳舊,可以升級FFmpeg 並集成dav1d

Web 端

1. dash.js已經支持(解碼取決於瀏覽器,Chrome 支持)
2. shaka-player已經支持(解碼取決於瀏覽器,Chrome 支持)

PC 端

VLC PC 版,支持AV1 in FLV、HEVC in FLV, 可按需下載Windowos 版& MacOS 版

Posted on 1 Comment

OBS在版本29版之後增加的新的編碼支持(H265及AV1)

OBS支持HEVC推流

OBS在v29版本之後支持了HEVC推流,支持利用RTMP的封裝方式來推送H265編碼的串流格式,若電腦沒有可支持硬編碼的GPU,其CPU編碼所採取的編碼方案是QuickSync HEVC。

若是電腦有可支持硬編碼的GPU,則下拉選單會增加該硬件編碼的編碼選項

支持AV1及HEVC的錄影格式

並且可以錄製SVT-AV1、AOM-AV1和HEVC的格式的影片

Posted on

為SRS6編譯支持HTTP-FLV的FFMPEG檔案

SRS介紹

SRS是一個簡單高效的實時視頻服務器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。
是一個運營級的互聯網直播服務器集群並發7.5k+,支持多種轉碼,RTMP->HLS,RTMP->FLV等,支持HTTP回調,RTMP0.1s延時
在HTTP-FLV的低延遲實踐方案上,可以說是繼FMS之後,非常有用心地在更新、維護的一個開源專案

主要開發者很熱心地回答問題,相關的文件也隨著時間越來越完整,使用的人數也越來越多,是一個高效能且穩定的開源串流服務器。

SRS6.0已支持H.265編碼格式

在SRS 6.0之中,很開心我們終於看到SRS支持H265了,這其中很重要的一個工作就是我們需要在推流端能夠讓RTMP的FLV格式推流能夠支持H265。
但是,若我們使用從FFMPEG官網下載的.EXE檔案,即便我們使用ffmpeg -version顯示支持H265,在實際推H265的流時仍然會發生錯誤。

錯誤訊息如下圖

這個錯誤代表說,官方所提供的版本雖然支持H.265,但是卻不支持使用FLV來封裝H.265的編碼格式。

為FFmpeg增加支持HEVC over RTMP的補丁

對於SRS6.0支持HEVC over RTMP的詳細說明於此: https://github.com/ossrs/srs/issues/465

支持 HEVC over RTMP 或 FLV 的規範和用法。runner365為FFmpeg提供了FFmpeg 4.1/5.1/6.0 的補丁,以支持通過 RTMP 或 FLV 的 HEVC。Intel也有針對此功能的補丁。

這裡面提到說,SRS 6之所以能夠支持H265 over RTMP是因為使用了runner365自己為ffmpeg所增加的補丁功能。官方的版本並不支持HEVC over RTMP,若我們希望使用RTMP來推流H265,則需要重新編譯包含這份補丁的FFMPEG執行檔案。

另外要注意的是,雖然,但是應該是它們採用HEVC支持RTMP的實作方式與SRS6.0使用的FFMPEG方案並不一致,若是使用OBS的v29.0.2推H265的流到SRS伺服器,伺服器並沒有辦法正確的解析串流內容,因此,在推流時,一定要使編譯過的(runner365的補丁版本)、可支援HEVC over RTMP的FFMPEG來推流,才可以正確把H265的流推送到SRS。

這邊是官方如何編譯ffmpeg的教學:
https://github.com/ossrs/srs/issues/465#ffmpeg-tools

使用ffmpeg推流HEVC格式的影片,其重點在於將vcodec指定為libx265

ffmpeg -i sample.mp4 -c:v libx265 -b:v 350k -f flv rtmp://127.0.0.1/live/livestream

以下指令可推送極低延遲的H.265影片

ffmpeg -i sample.mp4 -c:v libx265 -crf 28 -x265-params profile=fast -preset veryfast -tune zerolatency -b:v 300k -minrate 300k -maxrate 300k -f flv rtmp://127.0.0.1/live/livestream

如何在linux裡面編譯支持H265 over rtmp的ffmpeg

支持 HEVC over RTMP 或 FLV 的規範和用法。 runner365 為 FFmpeg 提供了 FFmpeg 4.1/5.1/6.0 的補丁,以支持通過 RTMP 或 FLV 的 HEVC。

在編譯ffmpeg之前,要先編譯libx264

cd ~/git
git clone https://code.videolan.org/videolan/x264.git
cd ~/git/x264
./configure --prefix=$(pwd)/build --disable-asm --disable-cli --disable-shared --enable-static
make -j10
make install


以及libx265

cd ~/git
git clone https://bitbucket.org/multicoreware/x265_git.git
cd ~/git/x265_git/build/linux
cmake -DCMAKE_INSTALL_PREFIX=$(pwd)/build -DENABLE_SHARED=OFF ../../source
make -j10
make install


接著載入HEVC over RTMP/FLV的補丁:

cd ~/git
git clone -b 5.1 https://github.com/runner365/ffmpeg_rtmp_h265.git
cp ~/git/ffmpeg_rtmp_h265/flv.h ~/git/FFmpeg/libavformat/
cp ~/git/ffmpeg_rtmp_h265/flv*.c ~/git/FFmpeg/libavformat


然後編譯ffmpeg

cd ~/git/FFmpeg
env PKG_CONFIG_PATH=~/git/x264/build/lib/pkgconfig:~/git/x265_git/build/linux/build/lib/pkgconfig \
./configure \
  --prefix=$(pwd)/build \
  --enable-gpl --enable-nonfree --enable-pthreads --extra-libs=-lpthread \
  --disable-asm --disable-x86asm --disable-inline-asm \
  --enable-decoder=aac --enable-decoder=aac_fixed --enable-decoder=aac_latm --enable-encoder=aac \
  --enable-libx264 --enable-libx265 \
  --pkg-config-flags='--static'
make -j10


嘗試推流

./ffmpeg -stream_loop -1 -re -i ~/srs/doc/source.flv -acodec copy -vcodec libx265 \
  -f flv rtmp://localhost/live/livestream
Posted on

WEBM影片格式介紹

WEBM格式是一種媒體文件格式,開源為Web使用設計,主要用於視頻的播放。

WebM簡介

WebM 是一個開源的媒體文件格式,主要用於封裝使用 VP8 或 VP9 編碼的視頻流和使用 Vorbis 或 Opus 編碼的音頻流。這個格式是由 Google 主導開發的,並於 2010 年首次推出。

以下是一些 WebM 格式的特點和詳情:

1. 設計目的

WebM 主要設計用於在線流媒體傳輸,特別是作為 HTML5 的 <video> 標籤的一部分。它旨在提供一個開放、高效、免版權費的視頻壓縮方案。

2. 視頻和音頻編碼

  • 視頻:VP8 或 VP9
  • 音頻:Vorbis 或 Opus

3. 優勢

  • 開放和免費:WebM 是一個完全開源和免費的格式,這意味著任何人都可以使用和分發它,無需支付任何費用。
  • 高效壓縮:使用 VP9 編碼的 WebM 文件可以提供與 H.264 相似的視頻質量,但文件大小通常更小。
  • 廣泛支持:大部分主流瀏覽器,如 Chrome、Firefox 和 Opera,都支持 WebM 格式的播放。

4. 缺點

  • 兼容性問題:一些瀏覽器(如 Safari)和一些媒體播放器可能不原生支持 WebM 格式。
  • 硬體支持限制:與某些其他視頻格式相比,硬體支持可能較少。

5. 適用場景

由於 WebM 的高效壓縮和開放性質,它特別適合用於網頁視頻、視頻會議、流媒體服務等場景。

6. 文件結構

WebM 使用 Matroska 容器格式,這是一個流行的開源媒體容器格式,可以容納多種編碼的音頻和視頻流。

可使用的傳輸協議

  1. HTTP/HTTPS:作為最常見的Web傳輸協議,HTTP和HTTPS可用於傳輸WEBM文件。這是在網頁中嵌入和播放WEBM視頻的標準方法。
  2. RTSP (Real-Time Streaming Protocol):用於控制多媒體流的傳輸,可以用於WEBM格式的傳輸。
  3. HLS (HTTP Live Streaming):由Apple開發的基於HTTP的流媒體通信協議,也可用於傳輸WEBM格式。
  4. DASH (Dynamic Adaptive Streaming over HTTP):另一種基於HTTP的適應流媒體傳輸協議,支持WEBM格式。
  5. FTP (File Transfer Protocol):用於在客戶端和服務器之間傳輸文件的協議,可以用於傳輸WEBM文件。
  6. WebSocket:允許在Web瀏覽器和服務器之間建立全雙工通信通道,也可用於傳輸WEBM數據。
  7. WebRTC:允許Web瀏覽器進行即時通信,也可以用來傳輸WEBM格式的視頻。

優缺點分析

優點:

  1. 開放標準: WEBM是一個免費並開源的格式,這意味著它不受專利限制,可以自由使用。
  2. 高質量和高效編碼: WEBM使用VP8/VP9視頻編碼,這些編碼器提供了與其他流行格式相當的視頻質量,但文件大小更小。
  3. 廣泛支持: 大多數現代Web瀏覽器都支持WEBM格式,使其成為網絡視頻的理想選擇。
  4. 支持HTML5: WEBM被設計為與HTML5 <video> 標籤完全兼容,使其在網頁中的集成變得簡單。
  5. 支持透明度: VP8/VP9支持透明度(Alpha Channel),允許視頻有透明背景。

缺點:

  1. 軟件兼容性: 雖然大多數現代瀏覽器支持WEBM,但一些舊的或非主流的瀏覽器和媒體播放器可能不支持。
  2. 專業編輯支持有限: 相比其他格式如MP4,WEBM在專業視頻編輯軟件中的支持可能較少。
  3. 不是所有設備都支持: 一些移動設備和媒體播放器可能不支持WEBM格式。
  4. 沒有廣泛的工業標準: 雖然WEBM在Web環境中表現出色,但它還沒有像MP4那樣成為廣泛接受的工業標準。
  5. 音頻格式限制: WEBM通常使用Opus或Vorbis作為音頻編碼,這可能不是所有應用的最佳選擇。

由Google開發的其他格式

WEBP 是一種圖像格式,用於同時提供有損和無損壓縮。同樣也是由Google開發,目的是加速圖片在網頁上的加載速度。

要把.jpg轉成.webp可使用下面的語法

ffmpeg -i input.jpg -c:v libwebp output.webp

QUIC

  • QUIC則是一個多路復用的傳輸層協議,使用UDP進行數據傳輸。
  • 它的目的是減少連接建立的延遲,並且改善在不可靠網絡中的數據傳輸性能。
  • QUIC還包括了一個內置的TLS,增強了安全性。

WEBM和QUIC解決了網絡中不同的問題。WEBM專注於視頻編碼和播放,而QUIC則專注於連接和數據傳輸的效率和可靠性。Google作為一個網絡技術的領先公司,一直在推動和創造各種新的技術標準,以改進整個互聯網的性能和體驗。

Posted on

TCP/UDP協議中的串流協定

基於或可以使用UDP (User Datagram Protocol)的協定

RTP(Real-time Transport Protocol)

RTP(Real-time Transport Protocol,即時傳輸協定)是一個網絡協定,用於交付音頻和視頻等多媒體數據流。以下是RTP的一些關鍵特性和細節:

  1. 即時性:RTP旨在實時交付數據,這意味著它需要以最小的延遲和抖動來傳輸數據。
  2. 協議層次:RTP通常運行在UDP之上,這樣可以降低延遲,但可能會導致一些封包丟失。在某些情況下,它也可以運行在TCP上。
  3. 封包結構:RTP封包包括了一個標頭和有效負載。標頭包括有關封包的資訊,如序列號、時間戳等,用於同步和順序排列。有效負載則包括媒體數據。
  4. 同步和排序:RTP的頭部包含一個序列號,用於標識每個數據包。這使得接收端能夠檢測丟失的數據包並重新排序接收到的數據包。在實時通信中,尤其是視頻和音頻流,這一功能非常重要,因為它可以讓接收端正確地播放數據。每個RTP數據包還包含一個時間戳,用於表示數據的取樣時刻。這可以讓接收端同步不同類型的媒體流(例如音頻和視頻),並控制播放的速度和節奏。
  5. 與RTCP的組合使用:RTP通常與RTCP(RTP控制協議)一同使用。RTCP可以提供有關媒體傳輸質量的反饋,如丟包率、抖動等,這有助於調整和改進傳輸質量。
  6. 多播和單播:RTP支持單播和多播傳輸,使其能夠服務於一對一通信和一對多通信的場景。
  7. 可擴展性:RTP本身是一個相對簡單的協議,但它的設計允許通過擴展標頭和其他機制來添加新功能。
  8. 安全性:RTP可以與SRTP(安全RTP)結合使用,以提供加密和數據完整性保護。

RTP(Real-time Transport Protocol)和WebRTC(Web Real-Time Communication)是兩個密切相關但有所不同的技術。

  1. 定義和目的
    • RTP:是一個協議,用於實時傳輸多媒體數據,例如音頻和視頻流。它可以運行在各種應用和平台上。
    • WebRTC:是一個開放的框架,允許Web瀏覽器進行即時通信(RTC)。它包括一組協議和API,用於在Web瀏覽器之間建立P2P連接。
  2. 組件和協議
    • RTP:是實時數據傳輸的核心協議之一,通常與RTCP(RTP控制協議)一起使用。
    • WebRTC:使用了多個協議和技術,其中RTP就是其中之一,用於媒體數據的實時傳輸。WebRTC還使用了其他協議,如STUN/TURN/ICE(用於NAT穿透和對等發現)和DTLS/SRTP(用於安全性)。
  3. 應用範圍
    • RTP:不限於Web,可用於各種音頻和視頻通信應用。
    • WebRTC:主要用於Web應用,允許瀏覽器進行視頻和音頻通信。
  4. 傳輸層
    • RTP:通常運行在UDP上,也可以在TCP上。但是RTP在TCP上運行時,可能會有一些效能方面的考量,由於RTP自身具有序列號,用於檢測丟失的數據包並重新排序接收到的數據包,與TCP的可靠傳輸機制重疊。另外,TCP的可靠傳輸機制需要確認(ACK)機制,可能會增加傳輸的延遲
    • WebRTC:使用RTP作為其媒體數據的傳輸協議,並使用UDP作為傳輸層協議。

在WebRTC應用中,你可能需要使用WebSocket作為信令通道,以此幫助建立和協調P2P連接。在這種情況下,WebSocket用於傳送元數據(例如SDP描述和ICE結果),而WebRTC用於傳送實時語音、視頻和數據。

RTSP(Real Time Streaming Protocol)

RTMP 和 RTSP 都是使用 TCP 進行控制信令傳輸,但它們在傳輸媒體數據的方式上有所不同。RTMP 使用 TCP 進行媒體數據的傳輸,而 RTSP 使用 RTP/RTCP 在 UDP 上進行媒體數據的傳輸傳輸。RTSP允許客戶端通過建立和控制媒體流會話來請求和傳輸實時媒體數據。

以下是RTSP的一些特點和功能:

  1. 實時性:RTSP主要用於實時傳輸音頻和視頻等實時媒體數據,能夠提供較低的傳輸延遲,適用於實時的音視頻通訊。
  2. 客戶端/服務器模型:RTSP採用客戶端/服務器模型,客戶端通過發送請求來控制服務器上的媒體流,並獲取媒體數據。
  3. 控制功能:RTSP支持控制功能,客戶端可以發送請求來控制媒體流的播放、暫停、快進、倒退等操作。
  4. 媒體描述:RTSP支持媒體描述功能,客戶端可以通過請求獲取媒體流的描述信息,如編解碼器信息、媒體流格式等。
  5. 使用RTP/RTCP:RTSP常用與RTP(Real-time Transport Protocol)和RTCP(RTP Control Protocol)結合使用,以在網絡上傳輸實時媒體數據。

RTSP在視頻監控、視頻會議、流媒體直播等場景中得到廣泛應用。它為實時媒體數據的傳輸提供了一種靈活、高效的通信機制,使實時音視頻通訊和流媒體播放成為可能。

SRT(Secure Reliable Transport)


SRT(Secure Reliable Transport)是一種基於UDP的開源傳輸協定,由Haivision公司發起並由SRT聯盟持續開發。它的主要目的是優化在公共網路(如互聯網)上進行高品質視訊串流的性能。

SRT旨在解決在廣播等高品質視訊串流場景下,對於低延遲、丟包率低的傳輸要求。它在UDP之上實現了數據包重傳機制,並且加入了AES加密,以確保傳輸的安全性。此外,SRT還提供了一個預測網路傳輸性能的機制(稱為「SRT預測模型」),該模型可動態調整傳輸參數,以優化傳輸性能並減少延遲。

因此,SRT協定將UDP的低延遲特性與TCP的可靠傳輸特性相結合,旨在在公共網路上提供一種安全、可靠、低延遲的視訊傳輸解決方案。這使得它在如廣播、遠程生產和OTT串流等領域中得到了廣泛應用。

QUIC (Quick UDP Internet Connections)

Quick UDP Internet Connections(QUIC)是一種實驗性的傳輸層協議,旨在優化網絡連接性能並提高網絡傳輸的安全性。QUIC主要依賴於用戶數據報協議(UDP)而非傳統的傳輸控制協議(TCP) 。這使得 QUIC 能夠降低網絡延遲、提高連接速度,並在保持安全性的同時減少握手次數

要使用QUIC,您需要遵循以下幾個步驟:

  1. 確保支持QUIC協議的瀏覽器或客戶端要使用QUIC,首先您確保的瀏覽器或客戶端支持該協議。許多現代瀏覽器(如Google Chrome和Mozilla Firefox)已默認啟用QUIC。如果使用或其他瀏覽器,請查看其文檔以確認是否支持QUIC,並了解如何實現。
  2. 使用支持QUIC的服務器為了充分利用QUIC協議的優勢,您需要確保服務器端也支持QUIC。您可以選擇支持QUIC的雲服務商,如Google雲平台,或者手機搭建支持QUIC的服務器,例如使用Caddy或nginx 。
  3. 配置服務器 如果您要搭建自己的服務器,需要配置服務器以啟用QUIC。對於Caddy和nginx等服務器軟件,您可以參考相應的文檔來配置QUIC支持。確保您已正確配置服務器以使用QUIC,並且需要時提供相應的加密證書。
  4. 測試QUIC連接一旦服務器和客戶端都支持QUIC,您就可以通過訪問設置為使用QUIC的網站或服務來測試連接。可以使用瀏覽器的開發者工具檢查網絡連接是否成功地使用了QUIC協議。
  5. 監控和優化使用QUIC協議後,您可能需要監控連接性能,並根據需要進行調整。可以使用各種網絡分析工具來評估QUIC連接的表現,並根據結果優化服務器配置。

MPEG-DASH(Dynamic Adaptive Streaming over HTTP)

在使用HTTP-TS進行傳輸時,需要對數據進行分片,以提高傳輸效率和穩定性。可以使用各種分片技術,例如MPEG-DASH的架構技術、HLS的架構M3U8文件等。雖然名稱中包含“HTTP”,但MPEG-DASH可以在任何數據傳輸協議上運行,包括UDP

MPEG-DASH 通常使用 HTTP 協議,因此它可以通過標準的 HTTP 端口 80 進行傳輸。如果是使用 HTTPS 的話,則是端口 443。這樣的設計使得 MPEG-DASH 能夠更容易通過防火牆和代理伺服器,並且在現有的 Web 基礎設施上部署,因為它使用的是 Web 通信的標準端口和協議。

這種基於 HTTP 的流媒體傳輸方式還有其他的好處,例如緩存和兼容性,因為許多現有的 HTTP 伺服器和網絡設備已經能夠支持 MPEG-DASH,無需進行特殊的配置或升級。

MPEG-DASH(Dynamic Adaptive Streaming over HTTP)是一種自適應比特率流媒體技術,允許高品質的流媒體通過HTTP進行交付,從不同的比特率和質量的媒體文件中進行選擇。因此,你可以將其視為一種基於HTTP的分片技術,而非一個獨立的傳輸協議

這種自適應技術的核心是將媒體內容分成多個小的段(或稱分片),然後通過HTTP傳輸。客戶端(例如視頻播放器)可以根據網絡條件和設備能力動態選擇不同的質量和比特率的段進行播放。

這使得MPEG-DASH可以在各種網絡條件下提供更好的視頻觀看體驗,適應網絡帶寬的變化,並提供流暢的播放,無論連接速度快慢。它不是一個新的傳輸協議,而是建立在現有的HTTP協議之上的一種媒體交付方法。

RTMP (Real-Time Messaging Protocol)

RTMP(Real-Time Messaging Protocol)和 RTSP(Real Time Streaming Protocol)都是基於 TCP 的應用層協議,它們都使用 TCP 協議進行數據傳輸。雖然它主要使用TCP,但也可以使用UDP。

RTMP是一種用於實時數據傳輸的協議,主要用於音頻、視頻等媒體數據的傳輸。它使用TCP連接來傳輸數據,因為TCP提供了可靠的數據傳輸機制,確保數據的可靠性和缺陷,適合實時數據的傳輸。

RTSP也是一種用於實時媒體數據傳輸的協議,它用於控制媒體流的傳輸和播放。RTSP使用TCP連接來發送控制命令和接收媒體描述信息等控制數據,以確保控制信令的可靠傳輸。而媒體數據本身通常使用RTP(Real-time Transport Protocol)和RTCP(RTP Control Protocol)協議在UDP上進行傳輸,因為UDP具有較低的傳輸延遲,更適合實時媒體數據的傳輸。

因此,RTMP 和 RTSP 都是使用 TCP 進行控制信令傳輸,但它們在傳輸媒體數據的方式上有所不同。RTMP 使用 TCP 進行媒體數據的傳輸,而 RTSP 使用 RTP/RTCP 在 UDP 上進行媒體數據的傳輸傳輸。

那RTSP和RTMP是同樣的數據,如果RTSP設計於UDP傳輸,不是有順序可靠的檢查的動作,而RTMP沒有?

其中,RTSP(Real Time Streaming Protocol)和 RTMP(Real Time Messaging Protocol)在設計上有一些不同,儘管它們都是用於實時媒體傳輸的應用層協議。

RTSP 是一個控制協議,主要用於控制媒體流的傳輸和播放。RTSP 使用 TCP 連接發送控制命令並接收媒體描述信息等控制數據,以確保控制信令的可靠傳輸。而媒體數據本身通常使用RTP(Real-time Transport Protocol)和 RTCP(RTP Control Protocol)協議在 UDP 上進行傳輸。

RTP和RTCP是專門設計用於傳輸實時媒體數據的協議。RTP負責傳輸媒體數據,並提供時序、序列號等信息來保證數據順序和實時性。而RTCP則用於傳輸控制信息,例如網絡RTCP的一項功能就是檢查丟包率並做出相應的調整,以保證媒體數據的傳輸質量。

相比而言,RTMP 是一種用於實時數據傳輸的協議,主要用於音頻、視頻等媒體數據的傳輸。RTMP 使用 TCP 連接來傳輸數據,保證數據的可靠性和缺陷。RTMP 協議本身並並沒有專門設計用於檢查丟包率和調整傳輸速率的機制,這些功能通常需要在應用層實現。

綜上所述,RTSP 和 RTMP 在傳輸實時媒體數據的方式和設計上有所不同。RTSP 主要用於控制媒體流的傳輸和播放,使用 RTP/RTCP 在 UDP 上進行媒體數據傳輸,並帶有丟包而RTMP則主要用於傳輸媒體數據,使用TCP進行數據傳輸,對於丟包率和傳輸速率的控制通常需要應用層實現。

基於 TCP 的串流協議

  1. HTTP Live Streaming (HLS):由 Apple Inc. 提出的基於 HTTP 的串流協議,被廣泛使用在各種串流場景中。它將串流內容分割成一系列小型的基於 HTTP 的文件來傳遞給客戶端。
  2. MPEG-DASH(Dynamic Adaptive Streaming over HTTP):這是一種領先的元率串流技術,使高品質的串流媒體成為可能,通過HTTP傳輸。
  3. RTSP (Real-Time Streaming Protocol):雖然 RTSP 本身是一種控制協議,用於控制串流媒體服務器,但實際上,它的串流通常用 RTP 跨越 UDP 實現。然而,RTSP 也可以跨越 TCP 串流實現傳輸。
  4. RTMP (Real-Time Messaging Protocol):RTMP 是由 Adob​​e Systems 為 Flash 播放器播放音訊、視訊和數據而開發的開放協議,主要使用 TCP。
  5. Microsoft Smooth Streaming (MSS):這是微軟開發的一種前置串流協議,通過HTTP進行傳輸。
  6. HTTP/2:這是 HTTP 協議的第二個主要版本,它允許服務器將多個響應客戶端到客戶端,而無需客戶端明確的請求,這對於串流媒體來說是有利的。
Posted on

串流的網路概念

FFmpeg介紹

FFmpeg 是一個應用程式工具,它的主要功能包括讀取、解碼、編碼、轉碼、重新封裝、串流等各種視頻和音頻格式。這種應用程式大多數情況下被認為是在應用層(Application Layer)

然而,如果從數據表示、編碼和轉換的角度來看,你也可以說 FFmpeg 做的工作涉及到表示層(Presentation Layer)的部分功能。例如,它會解碼影片檔案(從一種表現形式轉換為另一種),並將其轉換為對應的像素和音頻資料。

若是使用ffmpeg讀取HTTP-FLV的串流,HTTP-FLV 協議主要是在應用層工作,而接收端的應用程序(例如媒體播放器)則在應用層和表示層之間工作,負責解封裝和解碼接收到的數據

HTTP 和 WebSocket 協議

HTTP 協議的握手過程通常包括客戶端發送一個請求到伺服器,然後伺服器回應這個請求。這種請求/回應模式構成了 HTTP 的基本交互模式。

而 WebSocket 協議的握手過程稍微有些不同。WebSocket 的握手過程基於 HTTP,一開始由客戶端發送一個 HTTP 升級請求到伺服器。如果伺服器接受這個升級請求,它會回應一個升級的回應,此時連接就會從 HTTP 轉變為 WebSocket。然後這個 WebSocket 連接就可以用來做全雙工的通訊,直到一方選擇關閉連接為止。

這些握手過程都是在應用層進行的,並且直接涉及到最終的應用程序(例如網頁瀏覽器或者 Web 伺服器)的行為。

WebRTC(Web Real-Time Communications)的網路概念

WebRTC(Web Real-Time Communications)是一種用於網頁瀏覽器的 P2P(Peer-to-Peer,即點對點)通訊技術。它可以讓網頁瀏覽器直接與另一個網頁瀏覽器進行實時的音視頻通訊,不需要中間的伺服器轉發。

WebRTC 在 OSI 模型中的定位並不容易確定,因為它實際上涉及到了多個 OSI 層次。例如,WebRTC 使用了 RTP(Real-time Transport Protocol,實時傳輸協議)來傳輸音視頻數據,RTP 通常被認為是在傳輸層(第四層)。同時,WebRTC 還需要用到 STUN/TURN/ICE 這些協議來進行 NAT 穿透和對等節點的發現,這些協議也工作在傳輸層。而且,WebRTC 最終的實際應用(例如在網頁瀏覽器中進行音視頻通話)則是在應用層(第七層)

所以,我們不能簡單地說 WebRTC 屬於 OSI 模型的某一個層次。相反,我們可以說 WebRTC 是一種跨層次的技術,它涉及到了 OSI 模型中的多個層次。這也再次顯示了 OSI 模型在實際應用中的限制,並非所有的網路技術都能夠簡單地映射到 OSI 的七個層次中。

WebRTC 是一個開放標準,允許通過網頁進行實時通信(RTC)。它使用一系列的協議和技術來實現這一點。下面是一些關鍵部分:

  1. RTP(實時傳輸協議):用於媒體數據(例如音頻和視頻)的傳輸,通常基於UDP。
  2. STUN/TURN/ICE:這些協議和技術用於 NAT 穿透和對等節點發現。STUN 和 TURN 伺服器協助 WebRTC 節點找到彼此並建立直接連接。TURN 伺服器可以在需要時中轉數據,可能使用 TCP 或 UDP。
  3. 信令:WebRTC 本身不規定信令協議。信令用於在通信的兩個端點之間交換元信息,例如呼叫設置、能力協商等。這可以通過各種方式實現,例如使用 WebSocket、HTTP 或其他協議,通常基於 TCP。

所以,WebRTC 使用了多個協議,其中一些是基於 UDP 的(如 RTP 和某些 TURN 場景),而其他一些可能是基於 TCP 的(如信令或當 TURN 使用 TCP 時)。

上圖展示了整個WebRTC所運用的協定架構,左邊(TCP)為Signal應用,右邊(UDP)為串流應用, 協定堆的搭配使用,補足彼此的不足,而本章主要專注在串流應用(右邊)上的協定上,為WebRTC提供了哪些功能。

SRT(Secure Reliable Transport)協定

SRT(Secure Reliable Transport)是一種基於UDP的開源傳輸協定,由Haivision公司發起並由SRT聯盟持續開發。它的主要目的是優化在公共網路(如互聯網)上進行高品質視訊串流的性能。

SRT旨在解決在廣播等高品質視訊串流場景下,對於低延遲、丟包率低的傳輸要求。它在UDP之上實現了數據包重傳機制,並且加入了AES加密,以確保傳輸的安全性。此外,SRT還提供了一個預測網路傳輸性能的機制(稱為「SRT預測模型」),該模型可動態調整傳輸參數,以優化傳輸性能並減少延遲。

因此,SRT協定將UDP的低延遲特性與TCP的可靠傳輸特性相結合,旨在在公共網路上提供一種安全、可靠、低延遲的視訊傳輸解決方案。這使得它在如廣播、遠程生產和OTT串流等領域中得到了廣泛應用。

SRT 加入了一些特性來強化它的穩定性和效能,這使得它能夠對傳輸過程進行更細膩的控制,同時也提供了比 TCP 更低的延遲。

這些特性包括:

  1. 數據包重傳:如果檢測到數據包丟失,SRT 會嘗試重新傳輸這些丟失的數據包,這樣就可以保證數據的完整性。
  2. 端到端的安全性:SRT 支持數據加密,確保數據在傳輸過程中的安全性。
  3. 低延遲:相比 TCP,UDP 的傳輸延遲更低,這使得 SRT 更適合實時或近實時的視訊串流

SRT通常不直接在網頁上播放的原因也是因為他是使用UDP的傳輸協定:

  1. 協議支援:瀏覽器通常支援的協議,如HTTP和WebSocket,是基於TCP的。這些協議被廣泛用於Web應用程序中,因為它們提供了可靠的連接和內建的流控制。由於SRT是基於UDP的,它不是瀏覽器原生支援的協議之一。
  2. UDP的限制:UDP不保證資料包的到達順序或可靠性。SRT在此基礎上增加了一些特性來改善這些問題,但這並不意味著它可以直接在所有客戶端上使用。瀏覽器可能因安全和可靠性的考量而限制或不支援UDP流量。
  3. 轉碼和轉封裝:為了在網頁上播放SRT流,可能需要額外的伺服器組件來轉碼或轉封裝流為瀏覽器支援的格式,例如HLS或MPEG-DASH。這可能增加了複雜性和延遲。
  4. 安全性考量:網頁的安全模型可能限制了直接使用UDP的能力。WebRTC是一個允許網頁使用UDP的技術,但即使如此,它也需要符合特定的安全和隱私要求。
Posted on

直播相關教學文章庫

  • 直播點播錄播
  • 直播原理介紹
  • 視訊編解碼
  • 推流介紹
  • 串流格式介紹
  • 播放器介紹

*直播軟體比較

  • 直播品質關鍵
  • SRS-Bench: 搭建直播服务器以后需要对直播性能进行测试,srs-bench 针对特定业务性能测试并发推流来解决
Posted on

編碼與封裝

前言

要說到影片的編碼與封裝,就要先聊聊影片是怎麼產生的。相信大家小時後都有看過翻頁動畫吧,就是由很多張圖片組成的書,在快速翻書時就可以看到一幅連續的動畫,如下圖:
翻頁動畫
影片的原理也是如此,一張張的照片,經過快速的連續切換,就成為了動態影片。但是這樣子的原始影片大小非常的可觀,若影像的每個畫素的三個顏色RGB各需要一個位元組儲存,每一個畫素需要3位元組,解析度1280×720的影像的大小為2.76M位元組,若每秒FPS為25偵,所需的位元率會達到553Mb/s。這種大小不論是儲存或用網路傳輸都是有困難的,因此編碼壓縮勢在必行。

資料壓縮的難題

音檔和視訊有著完全不同的編碼方式和壓縮理論,音訊編碼的難點在於延時敏感、卡頓敏感、噪聲抑制(Denoise)、回聲消除(AEC)、靜音檢測(VAD)、混音演算法等…每個項目都有各別的演算法去深究如何優化音訊的擷取。

而視訊壓縮編碼的難點則在於編碼效率和編碼複雜度的平衡。例如H.265較H.264在相同的位元率之下有更好的畫質呈現、更小的檔案大小,但相較起來,編碼的複雜度約增加了近十倍。但在實際的應用當中,大多數狀況的編碼端及解碼端的電腦資源不固定,因此在編碼複雜度和編碼效率中取得平衡則是很重要的事。

H264和H265的比較圖
264vs265
來源: H.264和H.265(HEVC)深度解析及對比

影片壓縮衡量單位

位元速率

網路影音多媒體包括音視頻在單位時間內的資料傳輸率時通常使用碼流位元速率來表示,代表每秒傳輸或處理的位元量(資料流量),單位 Mbps (Mb/s) 。
亦可說是所需的最低下載速度,下載速度越低,需越高的壓縮,尤其是破壞性壓縮,故位元速率會影響到影片品質。

  • 相同解析度下,位元率越高,每秒包含的資訊越多,檔案越大、壓縮比越小,影音品質越佳,越吃頻寬及電腦的運算能力,配備不夠好者可能會很卡。
  • 使用較低的位元速率輸出,在靜止畫面差異較小,動態畫面容易產生色塊,畫質低落,整體較不清晰。

我們可以從位元速率去推算最終整個串流檔案的大小,完整的影片則包括『視頻』及『音頻』兩個軌道,其公式如下:

檔案大小(MB為單位) = (音訊編位元速率(KBit為單位)/8 + 視訊編位元速率(KBit為單位)/8)× 影片總長度(秒為單位

而音檔的位元速率公式如下:

位元速率(Bit Per Second) = 取樣率(Hz) x 採用位數 x 聲道數

通常,影片位元速率會受到FPS(每秒幀數)、解析度(指輸出的影像尺寸)、編碼方式(有VBR、CBR、ABR三種)、壓縮演算法(如:H.264、H.265和VP9)影響,音檔則受到取樣率、採用位數(指單次取樣儲存時所占大小,例如電話就是3kHZ取樣的7位聲音,而CD是44.1kHZ取樣的16位聲音)以及聲道數影響,以上幾項的選擇目標是達到位元速率的最小化播放畫質最佳化之間的理想的平衡。

下面針對上面提到的幾個名詞做解釋:

FPS

FPS是Frames Per Second的縮寫,是指每秒鐘重新整理的圖片的幀數,也可以理解為圖形處理器每秒鐘能夠重新整理幾次。越高的幀速率可以得到更流暢、更逼真的動畫。每秒鐘幀數(FPS)越多,所顯示的動作就會越流暢。

解析度

編碼方式

壓縮演算法

影像壓縮原理

資料壓縮是透過去除資料中的冗餘資訊而達成。就視訊資料而言,資料中的冗餘資訊可以分成四類:

  1. 時間上的冗餘資訊(temporal redundancy)
    在視訊資料中,相鄰的影格(frame)與影格之間通常有很強的關連性,這樣的關連性即為時間上的冗餘資訊。

  2. 空間上的冗餘資訊(spatial redundancy)
    在同一張影格之中,相鄰的像素之間通常有很強的關連性,這樣的關連性即為空間上的冗餘資訊。

  3. 統計上的冗餘資訊(statistical redundancy)
    統計上的冗餘資訊指的是欲編碼的符號(symbol)的機率分布是不均勻(non-uniform)的。

  4. 感知上的冗餘資訊(perceptual redundancy)
    感知上的冗餘資訊是指在人在觀看視訊時,人眼無法察覺的資訊。

Posted on

影音服務介紹

網路串流服務介紹

近年來影音相關的服務越來越火紅,許多的社交軟體都用直播影片來取代舊有的圖文內容。雖然網路影音服務在2000年左右就已經出現,但由於當時的移動設備和網路頻寬的限制,使得網路影音的發展受到很多限制。而在2013年後網路直播開始爆發,進入了直播影片的年代,一開始的網路直播以PC為主,而在移動設備普及後,各種社群媒體的APP更是紛紛支援直播串流功能。因為直播串流的普及、電腦設備及網路速度的進步下,也新興了如了Youtuber、實況主、直播主等這種專門經營此區塊的行業,可謂是非常火紅且受到矚目的一個領域。近年來,通信行業也更多的走向網路化,通訊軟體如Line、Facetime等,漸漸取代了過去的電話、簡訊。最近因5G和IoT的發展,未來應有更多的領域會走向網際網路化。

所有網路影音相關的服務,大致分為『點播』、『直播』和『錄播』。

  1. 所謂點播,其英文為Video On Demand,簡稱VOD。其中Demand意為需求,從字面上理解點播,指的是使用者點選想要看的影片,並將該影片使用實時串流的方式播放出來。相關的服務如:Netflix、Apple TV、HBO等…
    Video On Demand

  2. 直播的英文為Live broadcast,則是直播音視頻會以媒體流的形式推到服務器上(推流)。如果有觀眾收看直播,服務器收到用戶的請求後,會把視頻傳輸到網站、APP、客戶端的播放器,即時播放串流影片。相關的服務平台有Youtube、Facebook Live、Twitch等…
    Live broadcast

  3. 錄播: 一個完整的錄播系統包含了錄製剪輯、直播推送、影片處理等核心功能,配備了相關的軟體和硬體。能夠按照標準產出比較高質量的影片內容,較多使用在線上教學系統上。
    Live record

直播服務的原理

而這30天的系列文章,我們主要會著重在直播的研究,一個完整的直播服務會牽涉到非常多面項領域的技術,從視頻/音頻處理,圖形處理,視頻/音頻壓縮,CDN分發,即時通訊等技術等,每個項目都有很深的技術背景,都需要以年來計算的去鑽研,因此許多部份只會提及基本概念(但光概念就有一大堆艱深知識了…XD…推薦這個系列文,把許多概念知識都整理的很清楚: 30天之即時網路影音開發攻略(小白本))

本系列文主要介紹的重點會放在開源串流伺服器SRS的架設與影片品質調校上(以及相關必要知識)的介紹。

一般來說,一個影片的直播流程要經過以下環節:
採集影像 —> 影像處理 —> 編碼 —> 封裝 —> 推流 —> 串流伺服器 —> 拉流 —> 解封裝 —> 解碼 —> 播放
各個環節都有相關的技術或現成可使用的軟體,如下圖為以SRS伺服器的流程為例:
直播流程

其中,上述的事情發生在三個端點: 直播主的電腦、串流伺服器、觀眾的電腦,各個事件發生的地點如下圖:
直播流程

  1. 採集: 從系統的採集設備中獲取原始音視頻數據,將其輸出到下一個環節。一個影片的採集涉及兩方面數據的採集:音頻採集和影像採集,它們分別對應兩種完全不同的輸入源和數據格式。

  2. 編碼與封裝: 對於視訊資料而言,視訊編碼的最主要目的是資料壓縮。因為動態影像的畫素形式,資料量極為巨大,儲存空間和傳輸頻寬完全無法滿足儲存和傳輸的需求。舉例來說,若影像的每個畫素的三個顏色RGB各需要一個位元組儲存,每一個畫素需要3位元組,解析度1280×720的影像的大小為2.76M位元組,若每秒FPS為25偵,所需的位元率會達到553Mb/s。這樣的資料量無論是儲存或傳輸都不可能,因此編碼非常重要,編碼性能、編碼速度和編碼壓縮比會直接影響整個流媒體傳輸的用戶體驗和傳輸成本。這一部份之後會有各別的文章去介紹。

視訊資訊之所以存在大量可以被壓縮的空間,是因為其中本身就存在大量的資料冗餘。其主要型別有:

  1. 時間冗餘:視訊相鄰的兩幀之間內容相似,存在運動關係
  2. 空間冗餘:視訊的某一幀內部的相鄰畫素存在相似性
  3. 編碼冗餘:視訊中不同資料出現的概率不同
  4. 視覺冗餘:觀眾的視覺系統對視訊中不同的部分敏感度不同
    來源: https://www.itread01.com/content/1547220622.html
  1. 推流: 推流是影響整個直播串流能不能順暢播放的最根本因素,若是步驟2的影片編碼的編碼器效能不好、網路速度不夠,或者編碼的壓縮品質不佳,那麼後面的串流服務再怎麼好,使用者的影片觀看體驗和順暢度也不會好。因此步驟2的編碼,會連帶影響到步驟3的推流的順暢度。因此,像一些推流軟體如OBS,會自動偵測直播主的電腦配備和網路頻寬,去選擇適合的影片壓縮位元率(影響影片的品質)、編碼格式(VP9、MPEG或H.264)、編碼工具(如Quick Sync H.264或x264),以及設定適合的buffer,來達到讓推流能夠順暢的目的。
    現有推流最廣泛被使用的通訊協定為RTMP(Real Time Messaging Protocol),大部份的推流軟體都使用這個協定去做推流。
    FME推流介面
    圖片: FME推流介面

  2. 串流伺服器: 主要的工作為接收推流、轉發給拉流客戶端。現在的直播服務由於需要支援行動設備,隨著flash從網頁裡被淘汰,網頁端多已不能支持rtmp流協定的播放。但因推流的協定仍多為RTMP,因此大多需要經過轉碼的動作,轉為HLS或HTTP-FLV的格式,以支援行動端的播放。這部份伺服器的轉碼工作也會影響到直播的延遲時間。
    所謂『延遲』(latency)就是從直播端到播放端的時間差,造成延遲的原因有很多,因使用網路傳輸,影像串流需要經過編解碼並即時於使用者端播放。考量到網路狀況可能不穩定,又需顧及影片播放的順暢性,客戶端播放器的緩衝設定以及其解碼的速度,也是造成延遲的一大主因。不同傳輸方式其搭配的容器格式亦會影響到延遲的時間,一般來說RTMP的延遲時間約為0.3-1秒間,HTTP-FLV約1-3秒,而HLS則需要至少10秒以上的延遲(以最佳狀況來說)。
    目前市面上較受歡迎的串流伺服器有:
    *FMS: FMS是adobe的流媒體服務器,RTMP協議就是adobe提出來的,FMS一定是重量級的產品。
    *WOWZA: 由Wowza Media Systems開發的串流媒體服務器軟體
    *SRS: 本系列文主要探討的串流伺服器,產品定位是商用互動式社群直播伺服器叢集,支持K8S。
    *NGINX RTMP: 現在非常火紅並且被廣泛使用的開源伺服器
    *CRTMPD: 使用單線程異步socket,在當時處於領先水平,但是當NGINX出現後就漸漸淡出大眾視野了

  3. 拉流: 拉流是指伺服器已有直播內容,根據協議類型(如RTMP、RTP、RTSP、HTTP等),與伺服器建立連接並接收數據,進行拉取的過程。因為RTMP的協定較容易被防火牆檔掉,因此主要移動端的播放都採用HTTP的網路協定去做拉流,包括常見的HTTP-FLV與HLS。

  4. 解碼與播放: 其實所有的串流都會包括音視頻兩個部份,在解碼時會分別解碼音頻和視頻,並且將兩個搭配起來。在這邊播放會遇到的挑戰,很重要的部份就是buffer的設製,buffer會影響到三個點:『首屏』、『延遲』、『卡頓』。首屏指的是點擊畫面後到第一個畫面出來的時間、延遲是指與直播端的時間差、而卡頓則是影片播放時畫面不順暢的次數或時間。一般來說,若觀看端的buffer時間較長,從點擊到看到第一個畫面的時間也會較長、總延遲時間也會變長,但可以在網路狀況較不穩定下仍能維持一定的播放品質。另外若buffer設定的過短,機器的解碼的速度在電腦lag時短暫趕不上,就有可能會出現跳屏的狀況(ex: 從1秒直接跳到3秒),因此這部份也需要經過仔細的調校和設定。

各種傳輸協定比較表

RTMP HTTP-FLV HLS
延遲 0.3-1s 2-3s
傳輸協議 TCP HTTP
瀏覽器支持 N Y
數據分段 連續流 連續流

一般來說,在架設串流伺服器時,應考量用途和需求,去決定要使用那一種直播協議,每一種格式都有其優缺點,這邊有相關的比較文章:RTMP、HTTP-FLV、HLS,你了解常見的三大直播協議嗎

參考資料