一、說明
本文接上篇,實作功能:
- 接收攝像頭的rtp流
- 推送rtp流到rtmp伺服器
- 使用vlc播放rtmp視訊
二、準備工作
1. 按前篇完成GB28181 invite解析
2. 安裝vls播放器、準備ffmpeg工具
3. 準備ZLMediaKit
https://github.com/xiongziliang/ZLMediaKit/wiki/ZLMediaKit%E6%8E%A8%E6%B5%81%E6%B5%8B%E8%AF%95
三、實作
1. 看看攝像頭是否有流推出來
經過前幾篇的功能,現在已經有媒體流推送到伺服器端口,如果使用ffmpeg和 nginx-rtmp,可以測試有沒有流:(這裡實際可以跳過,隻是驗證有流但不能正确播放)現在建立一個sdp檔案,放媒體資訊:
v=0o=34020000001320000001 0 0 IN IP4 媒體伺服器ips=Playc=IN IP4 媒體伺服器ipt=0 0m=video 10000 RTP/AVP 96 97 98a=sendrecva=rtpmap:96 PS/90000a=rtpmap:98 H264/90000a=rtpmap:97 MPEG4/90000y=00000000031234567891011
媒體資訊在攝像頭回複的invite資訊裡可以看到。執行指令:
ffmpeg -protocol_whitelist "file,rtp,udp,tls" -i test1.sdp -vcodec copy -acodec copy -f flv rtmp://nginx 位址:9092/hls/t_1_1
使用vlc打開rtmp位址:
rtmp://nginx位址:9092/hls/t_1_1
正常情況就有視訊出現了。但顯示的畫面很可能是不正常的,
這是由于GB28181的封包格式是RTP承載PS流。下面使用ZL搭一個媒體伺服器。
2.安裝ZL作媒體伺服器
ZLMediaKit 是一個基于C++11的高性能營運級流媒體服務架構,目前在快速疊代更新中。其項目特點:
- 基于C++11開發,避免使用裸指針,代碼穩定可靠,性能優越。
- 支援多種協定(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV/GB28181/MP4),支援協定互轉。
- 使用多路複用/多線程/異步網絡IO模式開發,并發性能優越,支援海量用戶端連接配接。
- 代碼經過長期大量的穩定性、性能測試,已經線上上商用驗證已久。 支援linux、macos、ios、android、windows全平台。
- 支援畫面秒開、極低延時(500毫秒内,最低可達100毫秒)。 提供完善的标準C API,可以作SDK用,或供其他語言調用。
- 提供完整的MediaServer伺服器,可以免開發直接部署為商用伺服器。 提供完善的restful api以及web
- hook,支援豐富的業務邏輯。 打通了視訊監控協定棧與直播協定棧,對RTSP/RTMP支援都很完善。
- 全面支援H265/H264/AAC/G711。
可以從:https://github.com/xiongziliang/ZLMediaKit/releases下載下傳可執行檔案,這裡在CentOS系統使用docker:
# 建立dockerdocker run -id -p 10000:10000/udp -p 1935:1935 -p 8080:80 -p 554:554 -p 332:332 -p 9000:9000 gemfield/zlmediakit:20.04-runtime-ubuntu18.04
其它docker指令:
# 進入容器docker exec -it containerid /bin/bash# 啟動容器docker start containerid
ZLMediaKit預設使用10000端口收GB28181流。
ZLMediaKit收到流後,會列印:
日志中相關字元串分别代表:
2020-04-10 12:51:52.331 I | regist rtsp __defaultVhost__ rtp 206442D7 ^ ^ ^ ^ schema vhost app stream_id
如果控制台提示:
onDecode unsupported codec type:STREAM_AUDIO_G711
就把攝像頭的音頻編碼格式調整一下。
使用vlc就可以打開視訊了:206442D7
rtsp://ip/rtp/206442D7rtmp://ip/rtp/206442D7
接下來對整個項目進行整合。