ffmpeg+nginx將rtsp視頻流轉成本地發佈的hls視頻流

0、爲什麼要轉視頻流

我這邊遇到的兩個問題,一個是多個客戶端同時訪問rtsp視頻流時,會導致斷幀或者丟包(也就是圖像殘缺),所以考慮發佈一個本地局域網的流媒體服務器供大家取流。另外一個原因就是前端播放rtsp和rtmp都比較麻煩,網上說要用vlc插件,而且chrome超過41版本的還用不了。這麼苛刻的條件我實在接受不了。而hls就輕鬆多了,基於http協議,而且只需下載一些js組件包就可以播放了。所以,我做了下述的3個工作。

1、ffmpeg解決視頻流轉換問題

參考:https://medium.com/androvideo/convert-rtsp-to-hls-using-ffmpeg-2fe2cdf3a0de

一個命令

$ nohup ffmpeg -i [視頻流地址] -fflags flush_packets -max_delay 1 -an -flags -global_header -hls_time 10 -hls_list_size 3 -hls_wrap 10 -vcodec copy -y [切片存儲地址/index.m3u8] &

或者

ffmpeg -fflags nobuffer \
 -rtsp_transport tcp \
 -i rtsp://your_rtsp_address \
 -vsync 0 \
 -copyts \
 -vcodec copy \
 -movflags frag_keyframe+empty_moov \
 -an \
 -hls_flags delete_segments+append_list \
 -f segment \
 -segment_list_flags live \
 -segment_time 1 \
 -segment_list_size 3 \
 -segment_format mpegts \
 -segment_list /tmp/stream/index.m3u8 \
 -segment_list_type m3u8 \
 -segment_list_entry_prefix ./ \
/tmp/stream/%d.ts

ffmpeg在處理音視頻流上是專業的,對於視頻流的接入、解碼、編碼、視頻流轉換都是一句命令解決的問題。

2、nginx發佈本地視頻流

就是讓其它人可以接入你發佈的視頻流。其實也挺簡單的,hls流本質上就是文件,首先是一個叫m3u8的文件,其次是分塊的視頻文件,ts格式。m3u8會不斷更新,它是一個索引文件,它會告訴客戶端,最新的分塊視頻文件是哪個。這種機制不可避免的就是延遲。假如一個分塊視頻文件是20s,那麼可以預見的最小延遲是20s(因爲你必須等最新的分塊視頻文件生成好了之後才能夠訪問它),最大的延遲是40s(自行腦補其中邏輯)。嚴謹點說,這邊所說的延遲不包括網絡的延遲和rtsp原始流的延遲。
發佈本地視頻流很簡單,就是nginx的基礎運用,只要保證客戶端能夠訪問到你的m3u8文件就可以了。
參考我的配置,server節點是在http節點內的。關於nginx的配置還真的要花點時間琢磨,要不然這麼易用的傢伙都能折騰上半天。(我就是)

server {
      listen       80;
      server_name  localhost;
      #charset koi8-r;
      #access_log  logs/host.access.log  main;
      add_header Access-Control-Allow-Origin *;
      add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
      add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-type,Authorization';
      location / {
	      root   /tmp/stream;
	      index  index.html index.htm;
      }
  }

3、前端展示

前端的展示就要用到video.js 和 video_contrib.js了。具體的請百度“前端如何播放hls視頻流”。

4、shit words

加班結束寫總結,還是挺愜意的。不過有些細節還真的就懶得寫了,畢竟窗外下着雨,我又是窮逼程序員,只有小電驢,而且我住的地方離公司20公里,意味着我要在雨中馳騁1小時。skr,還好我會rap,沒錯!一路rap到家!

軟中華
軟玉溪
頭髮越短越牛皮
搶地盤
夾毛居
再大的場合都不得虛
...《重慶魂——gai》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章