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》