轉載請注明出處:https://blog.csdn.net/impingo
我的開源項目位址:https://github.com/pingostack/pingos
開源項目:https://pingos.io
目錄
- 1. 如何支援H265編碼?
- 2. 如何降低直播延時?
-
- 2.1 優化推流端
- 2.2 優化PingOS伺服器配置
- 2.3 優化播放器端
- 3. 如何降低HLS直播延時?
- 4. 如何支援拉取rtsp源?
- QQ交流群:697773082
本篇内容記錄大家問的比較多的問題,持續更新…
1. 如何支援H265編碼?
PingOS支援H265編碼直播和H265編碼的mpegts、flv檔案錄制功能。rtmp和flv預設使用12(十六進制 0x0c)代表h265編碼。同時推流工具也要配合修改,使用12做為h265的。
你可以通過HLS、HLS+、http-flv、rtmp、http-ts協定播放h265編碼的流,其中http-flv和rtmp需要播放器做特殊改進才能支援,一般桌面版播放器都能直接支援H265編碼的HLS和HLS+直播流。
你也可以使用其他的codecid來作為H265編碼類型的擴充。配置方式如下:
https://pingos.io/docs/zh/config-core#hevc_codecid

以ffmpeg推流工具為例,如果你需要能夠推送支援h265編碼的rtmp流,你需要下載下傳特殊的ffmpeg版本,ffmpeg源碼連接配接:https://github.com/im-pingo/CDN-Union_H265
ffmpeg編譯過程可參考ffmpeg官網文檔:https://trac.ffmpeg.org/wiki/CompilationGuide/Centos
ffmpeg編譯成功後使用ffmpeg推流:
ffmpeg -i input.mp4 -vcodec h265 -acodec aac -f flv rtmp://ip/app/name
2. 如何降低直播延時?
在直播過程中,推流端、伺服器端、播放器、網絡環境等因素都會影響延時。
對于每個端上的優化措施可以參考以下參數:
2.1 優化推流端
- h264編碼一定不要開啟B幀, 解碼時B 幀依賴于前後的幀,會增加延遲。
- h264 編碼使用 H.264 baseline profile,減少編碼時消耗的時間。
- 音頻盡量使用AAC-LC Codec,這樣會減少編碼時消耗的時間。
- 适當調整關鍵幀間隔(GOP大小),因為前文說過伺服器是以GOP個整數倍進行緩存的,如果GOP過大伺服器端的緩存也會變大,建議設定為2s(但是同等碼率下GOP越小清晰度也會越低,是以建議大家視場景而定,推薦不小于1s)。
以OBS推流工具為例,要想盡量減少延時,可以參考如下配置:
2.2 優化PingOS伺服器配置
對于伺服器端來說,可優化的點并不多,無非是對緩存大小進行優化。直接以PingOS伺服器為例:
配置項 | 優化項 | 講解 | 配置示例 |
---|---|---|---|
cache_time | 緩存大小 | 以時間為機關的配置項,緩存大于等于整數倍個gop長度的資料,理論上這個值越小延時會越低。如果你不關心播放端的首屏顯示的速度,可以将cache_time設定為0,這樣伺服器就不會緩存任何資料,實時将内容下發。 | cache_time 0s; |
low_latency | 開關 on/off | 低延時選項,cache_time大于0時有效,開啟後伺服器緩存中如果有新的關鍵幀,則跳過P幀,從新的關鍵幀處開始分發 | low_latency on |
send_all | 開關 on/off | cache_time大于0時有效,第一次向播放端發送資料時,是否一次性将緩存資料全部下發。如果一次将緩存資料全部下發,則相當于将伺服器緩存積累的延時抛給了播放端,這樣的話,即使設定了low_latency也沒用,因為緩存中已經無資料可跳過。将這個配置設定成false,并且和low_latency配合使用可一定程度上降低延時。 | send_all |
伺服器配置示例:
application live {
live on;
cache_time 2s;
low_latency on;
send_all off;
}
2.3 優化播放器端
播放端的優化因播放器而定,這裡以flv.js播放器為例,圖中stashInitialSize的值就是播放器緩存大小,可按需調整。
3. 如何降低HLS直播延時?
關于HLS的延時優化,除了在前文
2. 如何降低直播延時?
中提到的操作外,伺服器端主要是通過降低切片大小來實作。
這裡主要介紹三個配置:
hls_fragment 1300ms;
hls_max_fragment 1800ms;
hls_playlist_length 3900ms;
-
和hls_fragment
配置一起決定了一個ts切片檔案的時長,ts檔案的時長會小于hls_max_fragment
,大于等于hls_max_fragment
。是以适當調整這兩個參數能夠使ts切片更實時,這裡建議hls_max_fragment大于等于2000ms,并且小于2 * hls_fragment。hls_fragment
-
設定成hls_playlist_length
的三倍即可。hls_fragment
4. 如何支援拉取rtsp源?
目前PingOS還不支援直接拉取rtsp源,但是可以利用
exec_pull
配置配合ffmpeg工具拉取rtsp源。
exec_pull
配置的作用是允許在第一次有人請求播放某一條直播流的時候PingOS會執行一條
Shell
指令,你可以在這條
Shell
指令裡執行ffmpeg拉流轉推到PingOS的操作。
例如添加下面的配置:
exec_pull bash -c "ffmepg -i rtsp://$parg_ip/$parg_uri -vcodec copy -acodec aac -f flv rtmp://127.0.0.1/live/$name";
當你向PingOS請求播放http-flv流的時候,PingOS就會觸發ffmpeg向rtsp源拉流并且轉推到本地。
舉個栗子:
播放http-flv流:http://127.0.0.1/flv/cam01?ip=192.168.1.5&uri=/h264/channel1
ffmpeg則會向拉取rtsp流:rtsp://192.168.1.5/h264/channel1,并且将内容推送給PingOS伺服器。
關于配置中使用到的$name等變量的含義,可以參考PingOS的官方文檔
QQ交流群:697773082
QQ交流群:697773082