在線監(jiān)控視頻用的喝瞻荆康,RTSP協(xié)議盆繁,支持直播和回放掀淘,項(xiàng)目前期用的flash播放器,到2020年底flash已不再被瀏覽器支持改基,因此公司需要實(shí)現(xiàn)一種支持瀏覽器(H5)播放的方案繁疤。
直播
目前直播的技術(shù)方案一般是:把RTSP流轉(zhuǎn)成RTMP流推到RTMP流媒體服務(wù)器上咖为,瀏覽器請(qǐng)求RTMP流開(kāi)始播放秕狰。
RTMP是Adobe公司推出的格式稠腊,視頻格式是flv,這個(gè)不能直接在瀏覽器里播放除非用flash播放器鸣哀,可以把flv.js把flv視頻流轉(zhuǎn)成http流架忌。
用nginx做為RTMP流媒體服務(wù)器,
RTSP流轉(zhuǎn)成RTMP流用ffmpeg實(shí)現(xiàn)我衬,ffmpeg api不太好用叹放,因此用java Process調(diào)ffmpeg命令行實(shí)現(xiàn),需要把process的inputStream和errorStream要讀取出來(lái)挠羔。
命令demo:
ffmpeg -re -rtsp_transport tcp -i rtsp://ip:554/Streaming/Channels/101?transportmode=unicast -vcodec copy -acodec aac -f flv rtmp://ip:1935/live/c1233a2402615b76f04e8cc16869e6a8_live
nginx配置:
rtmp {
server {
listen 1935; # 接受推流的端口號(hào)
chunk_size 8192; # 單一推流數(shù)據(jù)包的最大容量井仰?
application live { # 可以自行更換名字
live on; # 打開(kāi)直播
meta off; # 為了兼容網(wǎng)頁(yè)前端的 flv.js,設(shè)置為 off 可以避免報(bào)錯(cuò)
gop_cache on; # 支持GOP緩存破加,以減少首屏?xí)r間俱恶,但也會(huì)增加視頻延時(shí)
allow play all; # 允許來(lái)自任何 ip 的人拉流
}
}
}
location /live { # 拉流時(shí)的 uri ,可以自行修改
flv_live on; # 打開(kāi) http-flv 服務(wù)
chunked_transfer_encoding on;
add_header 'Access-Control-Allow-Origin' '*'; # 允許跨域
add_header 'Access-Control-Allow-Credentials' 'true';
}
location /playback {
root html;
add_header 'Access-Control-Allow-Origin' '*';
}
回放
回放視頻轉(zhuǎn)碼和直播一樣范舀,前端用video.js合是。
flv.js不支持手機(jī)瀏覽器,同時(shí)也為了在回放的時(shí)候可以暫停锭环、拖動(dòng)聪全,因此回放采用了hls方案,hls的延遲會(huì)更大辅辩,但是把hls_time設(shè)小點(diǎn)也能減少延遲难礼。
參數(shù)示例:
ffmpeg/bin/ffmpeg -re -rtsp_transport tcp -i rtsp://ip:554/Streaming/tracks/101?starttime=20201102t110204z&endtime=20201102t120920z -ss 00:00:00 -to 01:07:16 -tune zerolatency -preset ultrafast -hls_flags split_by_time -hls_time 2 -hls_list_size 0 -hls_wrap 0 -s 720x576 -r 25 -vcodec libx264 -b:v 500000 -acodec aac -b:a 64000 -g 30 -y /usr/local/nginx/html/playback/2829fa0d1b98c75ef90baa979944da2d_playback.m3u8
注意點(diǎn)
- ffmpeg的命令參數(shù)位置不能亂放,參數(shù)主要針對(duì)視頻玫锋、音頻編碼蛾茉,碼率,幀率景醇,分辨率臀稚,gop_size, 編碼速度等方面的配置。
- 直播上顯示的時(shí)間和系統(tǒng)時(shí)間會(huì)有5秒的延遲三痰,這方面可以把gop_cache禁掉吧寺,但是首屏打開(kāi)要很長(zhǎng)時(shí)間。
- flv.js在播放一段時(shí)間后散劫,會(huì)產(chǎn)生累積延遲稚机,這個(gè)是TCP特性造成的,可以在js里定時(shí)任務(wù)判斷追平获搏。
參考:
https://blog.csdn.net/wishfly/article/details/53079303
https://www.cnblogs.com/yulibostu/articles/11623493.html
https://blog.csdn.net/kingvon_liwei/article/details/79271361
https://blog.csdn.net/weixin_40777510/article/details/103764198
https://blog.csdn.net/string_kai/article/details/100598268
https://ffmpeg.org/ffmpeg.html