樹莓派ffmpeg直播推送,nginx視頻流接受轉碼,客戶端hls rtmp視

樹莓派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 *;

        }

注意事項:

  1. ts切片保存路徑要和rtmp模塊的一致
  2. 記得加上這行代碼d_header Access-Control-Allow-Origin *;避免網頁端播放出現跨域問題
開啓雲服務器的防火牆端口,啓動nginx
  1. 注意給雲服務器的1935,80端口放行,阿里雲就直接在控制檯安全組自定義一個開放端口。
  2. 啓動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視頻流
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章