-
Youtube Tutorial - Nginx 搭配 RTMP HLS 建立簡易直播 Server - 概念 -part1
-
Youtube Tutorial - Nginx 搭配 RTMP HLS 建立簡易直播 Server - 實戰 -part2
簡易版架構圖
請確認電腦有安裝 ffplay
以及 ffmpeg
ffplay 用來播放影片 (拉流)
ffplay -version
FFmpeg 用來將影片(轉檔)送到 server (推流)
ffmpeg -version
在 docker-compose.yml 底下, 所使用的 docker image 是 nginx-rtmp
(注意, 這個容器底下是沒有 FFmpeg 的)
底下的 stat.xsl 是要看 server 推拉流的狀態.
檔案來源為 nginx-rtmp-module/blob/master/stat.xsl
nginx_simple.conf 則是簡易版的設定, 底下分別設定了 RTMP 以及 HLS 的參數.
詳細參數說明可參考 nginx-rtmp-module
啟動指令 docker-compose up -d
可以先來看 server 推拉流的狀態
推流
將本地的影片以 stream 的方式推給 Nginx RTMP Server
ffmpeg -re -stream_loop -1 -i project_view.mp4 -c:v copy -c:a copy -f flv rtmp://your_ip:1935/live/test
test 是你的 stream key, 可以定義自己喜歡的.
指令說明
-stream_loop number (input)
0
代表不 loop
-1
代表無限 loop
-re
讀取輸入來源(流)原生的 frame rate
-i
輸入來源
-c:v copy
等於 -vcodec copy
影片格式,copy 代表與來源相同
-c:a copy
等於 -acodec copy
聲源格式,copy 代表與來源相同
-f flv
轉檔成 flv
這邊是用 FFmpeg 來完成推流, 也可以用軟體, 像是最常見的 OBS 推流也是可以的.
拉流
從 Nginx server 拉流 (stream) 下來觀看
RTMP 拉流
RTMP (Real-Time Messaging Protocol) 延遲比較低.
(但有可能被防火牆擋下來)
ffplay rtmp://your_ip:1935/live/test
剛剛設定的 stream key 是 test, 所以這邊也要選擇 test
也可以禁用快取, 會比較沒有延遲
ffplay -fflags nobuffer rtmp://your_ip:1935/live/test
http 拉流
HLS (HTTP Live Streaming) 延遲比較高.
(比較不會被防火牆擋下來, 因為是以 http 為基礎)
ffplay http://your_ip:8088/test.m3u8
如果你到容器內的 tmp/hls
底下觀看,
你會發現有一個 .m3u8
, 然後很多個 .ts
,
.m3u8
是一個索引檔案, 會自動去尋找對應的 .ts
檔案.
除了用 ffplay 拉流之外, 也可以使用 VLC player 之類的工具觀看,
這邊用 RTMP 拉流示範
其他推流
推流搭配濾鏡 (加上logo)
ffmpeg -re -i project_view.mp4 -i demo.jpeg -filter_complex "overlay=W-w" -c:v libx264 -c:a aac -r 30 -preset ultrafast -f flv rtmp://your_ip:1935/live/test_logo
這邊的 stream key 設定為 test_logo
-r
set frame rate
-filter_complex overlay=W-w
設定影片的濾鏡, 加在右上角
-preset ultrafast
代表編碼速度
拉流指令如下
ffplay http://your_ip:8088/test_logo.m3u8
或
ffplay rtmp://your_ip:1935/live/test_logo
推流 (將電腦鏡頭的影像以及聲音推流到 server)
找到 audio interface
arecord -L
-L
代表列出所有的裝置
找到 webcam device
先安裝 v4l-utils
sudo apt-get install v4l-utils
列出全部的 webcam device
v4l2-ctl --list-devices
指令 ( 將電腦鏡頭的影像以及聲音推流到 server )
ffmpeg \
-f video4linux2 -framerate 25 -video_size 640x360 -i /dev/video0 \
-f alsa -ac 2 -i default \
-c:v libx264 -b:v 1600k -preset ultrafast \
-x264opts keyint=50 -g 25 -pix_fmt yuv420p \
-c:a aac -b:a 128k \
-vf "drawtext=fontfile=DejaVuSansMono-Bold.ttf: \
text='CAMERA %{localtime\:%Y-%m-%dT%T}': fontcolor=white@0.8: fontsize=20: x=100: y=10: box=1: boxcolor=black: boxborderw=8" \
-f flv "rtmp://your_ip:1935/live/test_webcam"
這邊的 stream key 設定為 test_webcam
-i /dev/video0
我的視訊裝置
-i default
我的音源裝置
-b:v
代表 audio bitrate
-b:a
代表 video bitrate
-vf
設定影片的濾鏡
拉流指令如下
ffplay http://your_ip:8088/test_webcam.m3u8
或
ffplay rtmp://your_ip:1935/live/test_webcam
來看一下 RTMP Server 的狀態, 總共推了3個流
test
正常影片
test_logo
影片加上logo濾鏡
test_webcam
webcam
容器內有 FFmpeg 的 nginx-rtmp,
更建議去參考裡面的設定 master/nginx.conf ,
他的作法是透過 nginx server 裡的 FFmpeg 再處理後轉發出去 (當然也有可能是轉發到其他雲空間).
文章都是我自己研究內化後原創,如果有幫助到您,也想鼓勵我的話,歡迎請我喝一杯咖啡:laughing: