樹莓派ffmpeg直播推送,nginx視頻流接受轉碼,客戶端hls rtmp視頻流拉流
樹莓派利用ffmpeg將攝像頭視頻流以rtmp視頻流的格式,推送到安裝有nginx,nginx-rtmp的雲服務器端,在雲服務器端會進行視頻流的錄製成flv格式或者轉碼成m3u8格式的hls視頻流
ffmpeg,rtmp,hls簡單瞭解
- ffmpeg
ffmpeg用於記錄,轉換和流傳輸音頻和視頻的完整的跨平臺解決方案。
這是ffmpeg的官方對ffmpeg的定義,ffmpeg官網FFmpeg
說人話就是,這個工具特別強大,只要是圖片視頻相關的,他都能做,比如視頻flv轉成mp4格式,比如加個水印,比如做個直播推流到b站,播放視頻收看直播等等… - rtmp
RTMP是Real Time Messaging Protocol(實時消息傳輸協議)的首字母縮寫。RTMP是一種設計用來進行實時數據通信的網絡協議,主要用來在Flash/AIR平臺和支持RTMP協議的流媒體/交互服務器之間進行音視頻和數據通信,flv格式。rtmp協議是由adobe公司開發,所以目前瀏覽器需要拉取rtmp視頻流需要使用flash插件,因而在移動端瀏覽器無法播放rtmp視頻流。
優點:視頻音頻能夠做到實時傳輸,延遲較小。
缺點:- 對流媒體服務器的帶寬要求較高,如果服務器或者客戶端瀏覽器帶寬比較小會出現畫面卡頓的情況。
- 大部分手機端瀏覽器無法播放rtmp視頻流。
- hls
- HLS (HTTP Live Streaming)是Apple的動態碼率自適應技術。主要用於mac osx PC和Apple終端的音視頻服務。包括一個m3u(8)的索引文件,TS媒體分片文件和key加密串文件。
- 工作原理:將整個視頻切分成很多切片ts文件,用一個m3u8文件作爲切片ts文件的索引文件,瀏覽器播放視頻時,瀏覽器一邊下載ts文件,一邊渲染視頻,而不用將整個文件下載下來之後再播放。
- 優點:畫面幾乎無卡頓,在移動端適配性較好,可以直接播放。
- 缺點:在直播系統中,相較於rtmp視頻流,hls延遲較大。很多window的瀏覽器如chrome瀏覽器無法直接播放m3u8格式文件(Edge瀏覽器可以),但html5可以藉助於hls.js播放m3u8格式視頻流。
作者:yywfy的暱稱
鏈接:https://www.jianshu.com/p/6de22b88dc73
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
準備工作
- 帶有攝像頭的樹莓派
- 一臺雲服務器(Linux系統),如果沒有也沒有問題
- 一臺電腦
- 一臺手機
樹莓派安裝ffmpeg
sudo apt-get install ffmpeg
雲服務器安裝nginx,nginx-rtmp
sudo apt-get install nginx
sudo apt-get install libnginx-mod-rtmp
雲服務器端 nginx.conf配置rtmp
sudo vim /etc/nginx/nginx.conf
在http模塊上方寫入下列配置
rtmp {
server {
listen 1935; #監聽的端口號
application myapp { #rtmp視頻流
live on;
}
application hls { #hls視頻流
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 2s;
#hls_playlist_length 12s;
}
}
}
簡單介紹一下上面的參數
- rtmp 表示nginx接受rtmp視頻流
- listen 1935 表示接受rtmp視頻流的端口號
- application myapp 表示接受的應用名爲myapp,可以自定義
- live on 表示處於接受rtmp的狀態中
- hls on 將接受到的rtmp視頻轉碼成hls視頻(也就是m3u8格式),切片成.ts文件,.m3u8作爲索引文件
- hls_path /tmp/hls 表示rtmp轉碼成hls視頻流,也就是.ts .m3u8文件存儲的地址,這個文件夾的權限要注意哦
- hls_fragment 2s 表示每個切片ts文件的大小,太大了對於帶寬較小的服務器會有卡頓
- hls_playlist_length 12s; 表示播放列表的長度,進度條顯示的長度,默認自動適應
服務器端 nginx.conf配置拉流的http接口
sudo vim /etc/nginx/nginx.conf
將下面的配置,寫在http{server{}}裏面
location /live {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/hls/; #這個路徑和rtmp中hls切片保存路徑一致
add_header Cache-Control no-cache;
# cross-origin 解決html5播放hls時出現跨域問題
add_header Access-Control-Allow-Origin *;
}
注意事項:
- ts切片保存路徑要和rtmp模塊的一致
- 記得加上這行代碼
d_header Access-Control-Allow-Origin *;
避免網頁端播放出現跨域問題
開啓雲服務器的防火牆端口,啓動nginx
- 注意給雲服務器的1935,80端口放行,阿里雲就直接在控制檯安全組自定義一個開放端口。
- 啓動nginx
sudo service nginx start
樹莓派開始推流
- 推流到hls應用
ffmpeg -i /dev/video0 -s 640x360 -vcodec libx264 -max_delay 100 -r 20 -b:v 1000k -b:a 128k -f flv rtmp://47.100.78.117:1935/hls/room1
注意window如果使用攝像頭推流需要在ffmpeg後面添加 -f dshow
加載一個流媒體驅動
解析一下其中的參數
-i /dev/video0
表示視頻輸入源是 /dev/video0 即攝像頭 ls /dev/就能查看到有一個video0的設備,也可以-i input.mp4
用視頻文件作爲輸入源
-s 640x360
表示圖像的分辨率,如果太大了,容易出現卡頓情況
-vcodec libx264
一種視頻編碼格式
-max_delay 100
最大延遲時間
-r 20
這個表示每秒拍攝多少幀,也會影響的畫面是卡頓
-b:v 1000k
表示傳輸視頻流的碼率
-b:a 128k
表示傳輸音頻流的碼率
-f flv rtmp://47.100.78.117:1935/hls/room1
表示傳輸的格式是flv,因爲rtmp協議的視頻流以flv格式傳輸,後面接的rtmp://ip:1935/hls/roomNum
ip地址也可以換成服務器的域名,hls是nginx.conf配置好的rtmp應用的名稱,room1自定義的名稱,類似於房間號
你只需要改ip地址即可
- 推送到rtmp應用
ffmpeg -i /dev/video0 -s 640x360 -vcodec libx264 -max_delay 100 -r 20 -b:v 1000k -b:a 128k -f flv rtmp://47.100.78.117:1935/myapp/room1
改了rtmp應用的名稱myapp
拉流
- hls拉流
拉流地址
http://47.100.78.117/live/room1.m3u8
live nginx.conf中location後的名稱
room1 推流的房間號
手機端直接打開拉流地址即可播放,window用Edge瀏覽器播放,或者vlc播放器,但是谷歌火狐無法播放
- rtmp拉流
在vlc中串流地址寫入下面的
rtmp://47.100.78.117:1935/myapp/room1
實際效果圖
vlc播放rtmp視頻流
win10自帶的Edge瀏覽器播放hls視頻流
手機端查看hls視頻流