????????我的音視頻/流媒體開源項目(github)
????????GB28181系列目錄
目錄
一、ZLMediaKit介紹
二、?ZLMediaKit安裝、運行(Ubuntu)
1、安裝
2、運行
3、配置
三、ZLMediaKit使用
一、ZLMediaKit介紹
????????ZLMediaKit是一個基于C++11的高性能運營級流媒體服務框架,項目地址:https://github.com/ZLMediaKit/ZLMediaKit
????????ZLMediaKit支持多種協議轉發,入下圖所示(摘自ZLMediaKit項目):
GB28181的RTP推流支持如下功能:
- 支持UDP/TCP RTP(PS/TS/ES)推流服務器,可以轉換成RTSP/RTMP/HLS等協議
- 支持RTSP/RTMP/HLS等協議轉rtp推流客戶端,支持TCP/UDP模式,提供相應restful api,支持主動被動方式
- 支持H264/H265/AAC/G711/OPUS編碼
- 支持es/ps/ts/ehome rtp推流
- 支持es/ps rtp轉推
- 支持GB28181主動拉流模式
- 支持雙向語音對講
- 支持多軌道模式
二、?ZLMediaKit安裝、運行(Ubuntu)
1、安裝
#國內用戶推薦從同步鏡像網站gitee下載
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
#千萬不要忘記執行這句命令
git submodule update --initsudo apt-get install build-essentialsudo apt-get install cmake#除了openssl,其他其實都可以不安裝
sudo apt-get install libssl-dev
sudo apt-get install libsdl-dev
sudo apt-get install libavcodec-dev
sudo apt-get install libavutil-dev
sudo apt-get install ffmpegmkdir build
cd build
#macOS下可能需要這樣指定openss路徑:cmake .. -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2j/
cmake ..
make -j4
2、運行
cd ZLMediaKit/release/linux/Debug
#通過-h可以了解啟動參數
./MediaServer -h
#以守護進程模式啟動
./MediaServer -d &
3、配置
????????配置文件:ZLMediaKit/release/linux/Debug/config.ini
? ? ? ? 各個配置項的含義參考項目wiki中的說明。
三、ZLMediaKit使用
????????ZLMediaKit的HTTP API是一組通過HTTP協議訪問的接口,用于控制和管理ZLMediaKit流媒體服務器的功能和狀態。通過以下訪問可查看api列表:
curl http://127.0.0.1/index/api/getApiList?secret=xxxxxxxxxxxsecret在配置文件中獲取:ZLMediaKit/release/linux/Debug/config.ini
????????ZLMediaKit支持GB28181的 ps-rtp推流,支持的編碼格式分別為h264/h265/aac/g711/opus。 在收到GB28181推流后,ZLMediaKit會依次做以下事情:
- rtp排序去重。
- rtp解析成ps或ts。
- ps或ts解析成h264/h265/aac/g711/opus。
- 輸入到復用器,生成rtsp/rtmp/ts/fmp4等格式,以便轉換成其他協議或容器。
GB28181簡單使用:
????????ZLMediaKit默認開啟10000端口用于接收UDP/TCP的GB28181推流,由于國標推流不好測試,ZLMediaKit同時也支持rtp_mpegts推流,代碼會自適應判斷是否為ps還是ts。 所以如果大家沒有攝像頭的情況下,可以用FFmpeg簡單測試,基本上體驗跟國標推流并無二致。
- ffmpeg推流命令:
ffmpeg -re -i www/record/robot.mp4 -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000
- MediaServer收到推流后的日志:
????????上圖中,這個推流的rtp ssrc為BFC2C622(16進制打印),這個流的app為rtp, stream_id為BFC2C622。
????????需要指出的是,國標推流的app固定為rtp,你只能通過代碼來修改它,stream_id為rtp流的ssrc,這個是隨機的,在FFmpeg中貌似沒法控制。
????????另外,每次推流時,請更換ssrc,否則ZLMediaKit發現推流端ip和端口變化后,會直接丟棄rtp包;這樣做的目的是為了防止兩個設備使用同一個ssrc推流時互相干擾。
????????ZLMediaKit也可以往其他國標服務器推流,還有其他的高級功能。都是調用HTTP API實現的,具體可參考項目的wiki。
多個國標設備向ZLMediaKit推流時,都是向ZLMediaKit的10000端口推,ZLMediaKit會根據ip、端口以及RTP的ssrc區分不同的設備。但是在使用openRtpServer接口動態開啟國標收流端口后,這個端口只能產生一個流,也就是說,一個攝像頭需要一個服務器端口用于接收國標推流。
? ? ? ? ZLMediaKit支持多種推拉流方式(RTSP/HLS/RTMP等),ZLMediaKit的播放url規則如下:
以rtsp://somedomain.com:554/live/0?token=abcdefg&field=value為例,該url分為以下幾個部分:協議(scheam) : rtsp協議,默認端口554
虛擬主機(vhost) : somedomain.com,該字段既可以是域名也可以是ip,如果是ip則對應的虛擬主機為__defaultVhost__
服務端口號(port) : 554,如果不指定端口號,則使用協議默認端口號
應用名(app) : live
流ID(streamid) : 0
參數(args) : token=abcdefg&field=value
????????剛才的rtp_mpegts推流中app和stream_id都可以看到,通過下面的地址就可以使用rtsp協議拉到流了:
rtsp://127.0.0.1/rtp/BFC2C622
? ? ? ? 更多操作請參考項目的wiki,地址:https://github.com/zlmediakit/ZLMediaKit/wiki/