音視頻推流同步
類圖
協議
傳輸協議 : 長連接(斷開重連) 短連接(三次握手,開銷大)
Rtmp
優點:實時協議,收到數據,立刻轉發,延時小,主流CDN支持
缺點:1.基於TCP協議相對UDP開銷大(TCP面向字節拼接,頭部複雜) 2.有序校驗次序 3.TCP每發送的數據包,對方都要確認
UDP 是一個面向報文(報文可以理解爲一段段的數據)的協議。意思就是 UDP 只是報文的搬運工,不會對報文進行任何拆分和拼接操作,也會校驗包對不對,但不管是否收到。因此 1.無連接 2.不可靠 3.沒有擁塞控制
- 在發送端,應用層將數據傳遞給傳輸層的 UDP 協議,UDP 只會給數據增加一個 UDP 頭標識下是 UDP 協議,然後就傳遞給網絡層了
- 在接收端,網絡層將數據傳遞給傳輸層,UDP 只去除 IP 報文頭就傳遞給應用層,不會任何拼接操作
HLS :數據包一個一個發,延時大
Rtmp協議類型
- 工作在TCP之上的“明文協議”(抓包時,可抓出整個通信協議的過程,https就是加密的,但也可破解漏洞),使用端口1935
- RtmpT封裝在Http請求之中,可穿越防火牆
- RtmpS封裝RtmpT,但使用的是Https連接
握手:不僅TCP三層握手,本身Rtmp也有握手
推流
準備工作以下爲centOS
yum install wget cmake
yum install openssl-devel #頭文件和靜態庫
ubuntu下會報錯No package libssl-dev available.
wget https://codeload.github.com/j0sh/crtmpserver/zip/centosinit
unzip centosinit
cd crtmpserver-centosinit/
cd builders/cmake
cmake . #在當前路徑生成Makefile
make #編譯
運行啓動程序
#傳遞參數是這個lua的腳本(所有的參數和配置都可以在這個lua腳本中執行)
#音視頻lua性能很好,很好嵌入C++
./crtmpserver/crtmpserver ./crtmpserver/crtmpserver.lua
這樣就啓動成功了
下載ffmpeg https://ffmpeg.zeranoe.com/builds/
解壓後可以把它.exe的路徑放入環境變量path中,這樣在任一位置即可訪問
ffmpeg -i zhangyi.flv -f flv rtmp://IP地址/live
nginx流媒體服務器搭建
sudo apt-get install libssl-dev
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
sudo apt-get install zlib1g-dev
這些都在ubuntu下,centos找對應的就行
下載nginx並配置rtmp模塊
wget http://nginx.org/download/nginx-1.13.3.tar.gz
tar -zxvf nginx-1.13.3.tar.gz
git clone https://github.com/arut/nginx-rtmp-module.git
./configure --add-module=/home/jiangzongqing/project/nginx_server/nginx-rtmp-module
所用到的庫
然後make -> make install 默認都安裝在/usr/local/nginx下
別輕易使用rm /usr/local/nginx -r 在公司裏可能會把有用的web等其他搭建的刪掉
在/usr/local/nginx/sbin/下輸入
./nginx
啓動
輸入IP地址
直播
快速進入
cd /usr/local/nginx/conf
vim nginx.conf
#RTMP服務
rtmp
{
server
{
listen 1935;
chunk_size 4096; #塊大小
application live #直播名字配置
{
live on; #開啓
}
}
}
退掉進程
pkill nginx
仍然端口占用
之前開啓的srs 服務器佔據1935端口
pkill srs
在windows cmd上 ,我的下載的視頻zhangyi.flv就放在youku_dowload文件夾下
成功推流
這裏的mp4格式仍需轉成flv,清晰度會差一點,可以copy
ffmpeg -i zhangyi.flv -c copy -f flv rtmp://IP地址/live
VLC播放效果 (直播:即推流中拉流纔可播放)
通過網頁查看直播推流的狀態
在nginx-rtmp-module下就有一個stat.xsl
root路徑 -> pwd複製路徑
關閉重啓
每刷新一下,數據都會不同
用ffmpeg自帶的ffplay播放
#nobuffer沒有緩衝
ffplay rtmp://IP地址/live -fflags nobuffer
代碼驅動這些推流,拉流操作
使用ffmpeg SDK推流
- 播放文件推流
- 使用瀏覽器flash播放直播
- 大華海康相機rtsp推流
開發環境
- ffmpeg 64 dev share
- 使用vs2015編譯工具