溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Nginx-rtmp怎么實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果

發(fā)布時(shí)間:2022-04-27 14:06:13 來源:億速云 閱讀:104 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Nginx-rtmp怎么實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果”,在日常操作中,相信很多人在Nginx-rtmp怎么實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Nginx-rtmp怎么實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

0. 前言

  這段時(shí)間在搭建一個(gè)ipcamera項(xiàng)目服務(wù)器。視頻點(diǎn)對(duì)點(diǎn)通話,客戶端會(huì)查看設(shè)備端的音視頻實(shí)時(shí)流。為了省流量,是通過p2p進(jìn)行穿透。但是由于nat設(shè)備的原因和ipv4的枯竭。有些設(shè)備是無法進(jìn)行點(diǎn)對(duì)點(diǎn)傳輸實(shí)時(shí)流。所以需要進(jìn)行服務(wù)器轉(zhuǎn)發(fā)。這里為了快速實(shí)現(xiàn)原型,同時(shí)參考現(xiàn)在主流的流媒體協(xié)議。發(fā)現(xiàn)很多使用的是rtmp協(xié)議。

  下圖是總體設(shè)計(jì)圖,為了整合多平臺(tái),會(huì)自建rtmp流媒體服務(wù)器和使用云廠商saas的rtmp流媒體服務(wù)。但是由于有時(shí)候會(huì)傳輸一些非流媒體數(shù)據(jù),需要傳輸一些二進(jìn)制文件,所以會(huì)需要自定義媒體轉(zhuǎn)發(fā)服務(wù)。

  以下是我實(shí)際項(xiàng)目中,用到的架構(gòu)實(shí)現(xiàn)流程圖。

Nginx-rtmp怎么實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果

 1. 客戶端a無法進(jìn)行p2p穿透,請(qǐng)求業(yè)務(wù)服務(wù)器要進(jìn)行轉(zhuǎn)發(fā)。
 2. 業(yè)務(wù)服務(wù)器根據(jù)客戶端a,請(qǐng)求類型,返回對(duì)應(yīng)的轉(zhuǎn)發(fā)服務(wù)器地址和對(duì)應(yīng)的房間號(hào)roomid/token等信息
 3. 上述請(qǐng)求類型,可以是請(qǐng)求自建rtmp流媒體服務(wù),購買于云廠商rtmp流媒體服務(wù)或者自定義協(xié)議媒體轉(zhuǎn)發(fā)服務(wù)
 4. 客戶端a得到業(yè)務(wù)服務(wù)器返回的媒體服務(wù)器地址和roomid/token
 5. 通過信令服務(wù)器或者mqtt服務(wù)器,把對(duì)應(yīng)的媒體服務(wù)器地址和roomid/token告訴另一端客戶端b
 6. 客戶端a和客戶端b同時(shí)進(jìn)入相同房間room,客戶端a進(jìn)行推流,客戶端b進(jìn)行拉流
 7. 其他媒體信息,如編解碼格式,清晰度,播放,暫停,拍照等命令,通過上述信令或mqtt服務(wù)器進(jìn)行命令控制

1. 編譯nginx

  rtmp流媒體服務(wù)器,現(xiàn)成的開源方案有很多,有srs,red5,wowoza,fms等,我這里使用的是nginx的rtmp插件實(shí)現(xiàn)實(shí)時(shí)流轉(zhuǎn)發(fā)。

  下載 nginx-rtmp-module 

  重新編譯nginx

--prefix=/opt/nginx --with-stream --with-http_ssl_module --with-stream_ssl_module --with-debug --add-module=../nginx-rtmp-module

2. 配置nginx.conf

  基本的nginx配置,這里就不進(jìn)行介紹了,需要了解的可以參考我其他博客,里面有介紹。這里只介紹rtmp段的定義。

rtmp{
  server{
    listen 8081;
    access_log logs/rtmp_access.log;
    on_connect http://127.0.0.1:8080/v1/rtmp/on_connect;
    application rtmp {
      live on;
      notify_method get;
      on_play http://127.0.0.1:8080/v1/rtmp/on_play;
      on_publish http://127.0.0.1:8080/v1/rtmp/on_publish;
      on_done http://127.0.0.1:8080/v1/rtmp/on_done;
      on_play_done http://127.0.0.1:8080/v1/rtmp/on_play_done;
      on_publish_done http://127.0.0.1:8080/v1/rtmp/on_publish_done;
      on_record_done http://127.0.0.1:8080/v1/rtmp/on_record_done;
      on_update http://127.0.0.1:8080/v1/rtmp/on_update;
      notify_update_timeout 10s;
    }
    application vod {
      play /opt/openresty/video;
    }
  }
}

3. http異步通知回調(diào)

   nginx-rtmp-module插件實(shí)現(xiàn)了針對(duì)rtmp協(xié)議的一些命令做了事件通知。這里我通過一個(gè)簡單的springboot項(xiàng)目,快速搭建一個(gè)http服務(wù)來接收rtmp的回調(diào)。

 package com.wunaozai.rtmp.notify.controller;
import javax.servlet.http.httpservletrequest;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;
@restcontroller
@requestmapping(value="/v1/rtmp/")
public class rtmpnotifycontroller {
  @getmapping(value="/on_connect")
  public string onconnect(httpservletrequest request){
    debug(request, "on_connect");
    return "on_connect";
  }
  @getmapping(value="/on_play")
  public string onplay(httpservletrequest request){
    debug(request, "on_play");
    return "on_play";
  }
  @getmapping(value="/on_publish")
  public string onpublish(httpservletrequest request){
    debug(request, "on_publish");
    return "on_publish";
  }
  @getmapping(value="/on_done")
  public string ondone(httpservletrequest request){
    debug(request, "on_done");
    return "on_done";
  }
  @getmapping(value="/on_play_done")
  public string onplaydone(httpservletrequest request){
    debug(request, "on_play_done");
    return "on_play_done";
  }
  @getmapping(value="/on_publish_done")
  public string onpublishdone(httpservletrequest request){
    debug(request, "on_publish_done");
    return "on_publish_done";
  }
  @getmapping(value="/on_record_done")
  public string onrecorddone(httpservletrequest request){
    debug(request, "on_record_done");
    return "on_record_done";
  }
  @getmapping(value="/on_update")
  public string onupdate(httpservletrequest request){
    debug(request, "on_update");
    return "on_update";
  }
  private string debug(httpservletrequest request, string action){
    string str = action + ": " + request.getrequesturi() + " " + request.getquerystring();
    system.out.println(str);
    return str;
  }
}

4. 運(yùn)行效果

  (1) 啟動(dòng)nginx和springboot

  (2) 以下是springboot打印信息(各位可以簡單分析一下這些日志的)

on_connect: /v1/rtmp/on_connect app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178269841&call=connect
on_publish: /v1/rtmp/on_publish app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=publish&name=room&type=live
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=update_publish&time=10&timestamp=3999&name=room
on_done: /v1/rtmp/on_done app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=done&name=room
on_publish_done: /v1/rtmp/on_publish_done app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=publish_done&name=room
on_connect: /v1/rtmp/on_connect app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178305623&call=connect
on_publish: /v1/rtmp/on_publish app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=publish&name=room&type=live
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=10&timestamp=7296&name=room
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=20&timestamp=17248&name=room
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=30&timestamp=27328&name=room
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=40&timestamp=37280&name=room
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=50&timestamp=47296&name=room
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=60&timestamp=57312&name=room
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=70&timestamp=67264&name=room
on_connect: /v1/rtmp/on_connect app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178380351&call=connect
on_play: /v1/rtmp/on_play app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345
on_play_done: /v1/rtmp/on_play_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=play_done&name=room&pass=12345
on_done: /v1/rtmp/on_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=done&name=room&pass=12345
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=80&timestamp=77344&name=room
on_connect: /v1/rtmp/on_connect app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178388202&call=connect
on_play: /v1/rtmp/on_play app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345
on_done: /v1/rtmp/on_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=done&name=room&pass=12345
on_play_done: /v1/rtmp/on_play_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=play_done&name=room&pass=12345
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=90&timestamp=87360&name=room
on_connect: /v1/rtmp/on_connect app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178396146&call=connect
on_play: /v1/rtmp/on_play app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345
on_done: /v1/rtmp/on_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=done&name=room&pass=12345
on_play_done: /v1/rtmp/on_play_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=play_done&name=room&pass=12345
on_connect: /v1/rtmp/on_connect app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178403666&call=connect
on_play: /v1/rtmp/on_play app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=100&timestamp=97311&name=room
on_update: /v1/rtmp/on_update app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=update_play&time=10&timestamp=105504&name=room&pass=12345
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=110&timestamp=107199&name=room
on_done: /v1/rtmp/on_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=done&name=room&pass=12345
on_play_done: /v1/rtmp/on_play_done app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=play_done&name=room&pass=12345
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=120&timestamp=117344&name=room
on_update: /v1/rtmp/on_update app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=130&timestamp=122815&name=room

(3) 客戶端進(jìn)行推流,這里的推流軟件,我是使用這個(gè)

Nginx-rtmp怎么實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果

  (4) 移動(dòng)端,我使用微信小程序里的 騰訊視頻云  這個(gè)小程序里面有rtmp測(cè)試

Nginx-rtmp怎么實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果

  (5) nginx-rtmp 日志

1 113.74.127.195 [05/aug/2018:16:18:08 +0800] publish "rtmp" "room" "" - 2646572 687 "" "fmle/3.0 (compatible; fmsc/1.0)" (1m 46s)
 2 113.74.127.195 [05/aug/2018:16:19:49 +0800] play "rtmp" "room" "pass=12345" - 413 542 "" "" (4s)
 3 113.74.127.195 [05/aug/2018:16:19:57 +0800] play "rtmp" "room" "pass=12345" - 413 542 "" "" (4s)
 4 113.74.127.195 [05/aug/2018:16:20:05 +0800] play "rtmp" "room" "pass=12345" - 413 542 "" "" (4s)
 5 113.74.127.195 [05/aug/2018:16:20:13 +0800] play "rtmp" "room" "pass=12345" - 413 542 "" "" (4s)
 6 113.74.127.195 [05/aug/2018:16:30:39 +0800] play "rtmp" "room" "pass=12345" - 413 871 "" "" (4s)
 7 113.74.127.195 [05/aug/2018:16:30:54 +0800] play "rtmp" "room" "pass=12345" - 413 647163 "" "" (12s)
 8 113.74.127.195 [05/aug/2018:16:31:08 +0800] publish "rtmp" "room" "" - 4961955 409 "" "fmle/3.0 (compatible; fmsc/1.0)" (1m 30s)
 9 113.74.127.195 [05/aug/2018:23:06:47 +0800] publish "rtmp" "room" "" - 425763 529 "" "fmle/3.0 (compatible; fmsc/1.0)" (13s)
10 113.74.127.195 [05/aug/2018:23:08:29 +0800] play "rtmp" "room" "pass=12345" - 413 871 "" "" (4s)
11 113.74.127.195 [05/aug/2018:23:08:37 +0800] play "rtmp" "room" "pass=12345" - 413 871 "" "" (4s)
12 113.74.127.195 [05/aug/2018:23:08:45 +0800] play "rtmp" "room" "pass=12345" - 413 871 "" "" (4s)
13 113.74.127.195 [05/aug/2018:23:09:05 +0800] play "rtmp" "room" "pass=12345" - 413 926026 "" "" (17s)
14 113.74.127.195 [05/aug/2018:23:09:30 +0800] publish "rtmp" "room" "" - 7061016 409 "" "fmle/3.0 (compatible; fmsc/1.0)" (2m 20s)

5. rtmp鑒權(quán)方式

   一般商用的話,為了防止被其他人使用和安全性考慮,所以需要對(duì)rtmp進(jìn)行鑒權(quán)處理。鑒權(quán)如果有特殊性的,可以通過修改nginx-rtmp-module的源代碼,然后進(jìn)行修改,其實(shí)就是增加個(gè)auth函數(shù),這個(gè)函數(shù)可以查詢數(shù)據(jù)庫之類的,然后決定返回0成功還是-1表示失敗。

  除了上面說到的方式,還可以通過簡單的方式,就是上面提到的http回調(diào)。如果http回調(diào)返回的http狀態(tài)碼是2xx的,表示成功。如果是返回5xx的狀態(tài)碼,那么表示失敗。那樣的話,服務(wù)器就是斷開rtmp連接。

  就是在 rtmp://rtmp.wunaozai.com/rtmp_live/room?username=username&password=password

  至于實(shí)現(xiàn),這里暫時(shí)還沒有,其實(shí)就是在springboot項(xiàng)目中對(duì)每個(gè)請(qǐng)求,判斷一下參數(shù)即可。如果后面有機(jī)會(huì)就詳細(xì)寫一下,關(guān)聯(lián)redis數(shù)據(jù)庫,實(shí)現(xiàn)房間號(hào)功能。但是可能不會(huì)寫了,因?yàn)閷?shí)際上不難。就是整個(gè)流程跑通還是比較多代碼要寫的,在博客里貼太多代碼有點(diǎn)不好。博客最主要的還是提供思路。實(shí)際實(shí)現(xiàn)就應(yīng)該在項(xiàng)目中實(shí)現(xiàn)了。

6. 其他

  這里是一些配置說明和示例

application 創(chuàng)建一個(gè)rtmp應(yīng)用,這里有點(diǎn)區(qū)別于http的location
timeout 60s 
stocket超時(shí),可以配合keepalive和ping值來實(shí)現(xiàn)不讓服務(wù)器端長期處于監(jiān)聽連接客戶端狀態(tài),實(shí)現(xiàn)快速關(guān)掉socket
ping 3m
ping_timeout 30s
rtmp ping用于檢查活動(dòng)連接的協(xié)議。發(fā)送一個(gè)特殊的包遠(yuǎn)程連接,在ping_timeout指定時(shí)間內(nèi)期待一個(gè)回復(fù),如果沒有收到回復(fù),連接斷開
max_streams 32
設(shè)置rtmp流的最大數(shù)目,單一流數(shù)據(jù)最大限制,一般默認(rèn)的32就可以了
ack_window 5000000
設(shè)置rtmp窗口的大小
chunk_size 4096
數(shù)據(jù)塊大小 設(shè)置值越大cpu負(fù)載就越小
max_queue
最大隊(duì)列數(shù),一般默認(rèn)即可
max_message 1m
輸入數(shù)據(jù)消息的最大大小。所有輸入數(shù)據(jù)消息都會(huì)保存在內(nèi)存中,等待完成流媒體轉(zhuǎn)發(fā)。在理論上傳入的消息可以是非常大,對(duì)服務(wù)器穩(wěn)定性影響較大,所以一般默認(rèn)即可。
out_queue
out_cork
buflen 5s
設(shè)置默認(rèn)緩沖區(qū)長度。通??蛻舳税l(fā)送播放前rtmp set_buflen命令并重置該設(shè)置
訪問控制
access
allow/deny
允許來自指定地址或者所有地址發(fā)布/播放
allow public 127.0.0.1
deny publish all;
allow play 192.168.0.0/24
deny play all;
exec命令
exce 
exec_options on;
啟動(dòng)一些exec指令選項(xiàng),通過一些exec事件來干預(yù)整個(gè)rtmp流
可以仔細(xì)一些外部編解碼功能
exec ffmpeg -i rtmp://localhost?src/$name -vcodec libx264 -vprofile baseline -g 10 -s 300x200 -acodec libfaac -ar 44100 -ac 1 -f flv rtmp://localhost/hls/$name 2>> /var/log/ffmpeg-$name.log;
exce_statc 
類似exce,屬于靜態(tài)命令,不支持傳遞上下文參數(shù)
exec_kill_signal term;
exec_kill_signal user1;
exec_kill_signal 3;
exec_pull 
exec_push
exec_publish
指定與參數(shù)外部命令要在發(fā)布事件執(zhí)行。
exec_play
指定與要在打開事件執(zhí)行外部命令
exec_play_done
指定要在打開完成事件執(zhí)行外部命令
exec_publish_done
exec_record_done
例子
exec_play bash -c “echo $addr $pageurl >> /tmp/clients”
exec_publish base -c “echo $addr $flashver >> /tmp/publishers”
轉(zhuǎn)錄
exec_record_done ffmpeg -y -i $path -acodec libmp31ame -ar 44100 -ac 1 -vcodec libx264 $dirname/$basename.mp4
live 模式
live on
切換直播模式,即一對(duì)多廣播
meta on/copy/off
奇幻發(fā)送元數(shù)據(jù)到客戶端 默認(rèn)on
interleave on/off
切換交叉模式。在該模式下,音視頻會(huì)在同一個(gè)rtmpchunk流中傳輸。默認(rèn)為off
wait_key on|off
使視頻流從一個(gè)關(guān)鍵幀開始,默認(rèn)為off
wait_video on|off
在一個(gè)視頻幀發(fā)送前禁用音頻。默認(rèn)off
通過wait_key/wait_video進(jìn)行組合以使客戶端可以收到具有所有其他數(shù)據(jù)的視頻關(guān)鍵幀。但這樣會(huì)增加連接延遲。不過可以通過編解碼器中調(diào)整關(guān)鍵幀間隔來減少延遲。
publish_notify on
發(fā)送netstream.publish.start和netstream.publish.stop給用戶,默認(rèn)off
drop_idle_publisher 10s
終止指定時(shí)間內(nèi)閑置(沒有音頻、視頻)的發(fā)布連接,默認(rèn)為off。注意這個(gè)僅僅對(duì)于發(fā)布模式的連接起作用(發(fā)送publish命令之后)
sync 10ms
同步音視頻流。如果用戶帶寬不足以接收發(fā)布率,服務(wù)器會(huì)丟棄一些幀。這將導(dǎo)致同步問題。當(dāng)時(shí)間戳差超過sync指定值,將會(huì)發(fā)送一個(gè)絕對(duì)幀來解決這個(gè)問題,默認(rèn)為300ms
play_restart off
使nginx-rtmp能夠在發(fā)布啟動(dòng)或者停止時(shí)發(fā)送netstream.play.start 和 netstrem.play.stop到每個(gè)用戶。如果關(guān)閉的話,那么每個(gè)用戶就只能在回放的開始結(jié)束時(shí)收到該通知了。默認(rèn)為on
record 模式
record off|all|audio|video|keyframes|manual
切換錄制模式,流可以被記錄到flv文件
off 不錄制
all 錄制音頻和視頻
audio
video
keyframes 只錄制關(guān)鍵視頻幀
manual 不自動(dòng)啟動(dòng)錄制,使用控制接口來進(jìn)行啟動(dòng)和停止
record_path /tmp/rec
指定錄制的flv文件存放目錄
record_suffix -%d-%b-%y-%t.flv
錄制后綴strftime格式
record_unique on|off
是否添加時(shí)間戳到錄制文件,防止文件被覆蓋,默認(rèn)off
record_append on|off
切換文件附加模式。開啟后,錄制時(shí)將新數(shù)據(jù)附加到舊文件后面。默認(rèn)off
record_lock on|off
鎖定文件,調(diào)用系統(tǒng)的fcntl
record_max_size 128k
設(shè)置錄制文件的最大值
record_max_frames 2
設(shè)置每個(gè)錄制文件的視頻幀最大數(shù)量
record_interval 1s/15m
在這個(gè)指令指定的時(shí)間之后重啟錄制。默認(rèn)off設(shè)置為0表示錄制中無延遲。如果record_unique為off時(shí)所有的記錄都會(huì)被寫到同一個(gè)文件中。否則就會(huì)以時(shí)間戳區(qū)分在不同文件
record_notify on|off
奇幻當(dāng)定義錄制啟動(dòng)或者停止文件時(shí)發(fā)送netstream.record.start和netstream.record.stop狀態(tài)信息onstatus到發(fā)布者。
應(yīng)用
application rtmp{
live on;
record all;
record_path /var/rec;
recorder audio{
record audio;
record_suffix .audio.flv;
}
recorder chunked{
record all;
record_interval 15s;
record_path /var/rec/chunked;
}
}
創(chuàng)建錄制塊??梢栽趩蝹€(gè)application中創(chuàng)建多個(gè)記錄 。
vod媒體
play dir|http://loc 
播放指定目錄或者h(yuǎn)ttp地址的flv或者mp4文件。注意http播放是要在整個(gè)文件下載完后才開始播放。同一個(gè)play可以播放多個(gè)視頻地址(用于負(fù)載)。mp4格式要在編解碼都被rtmp支持才可以播放。一般常見的就是h264/aac
application vod{
play /var/flvs;
}
application vod_http{
play http://localhost/vod;
}
play_temp_path /www
設(shè)置遠(yuǎn)程vod文件完全下載之后復(fù)制于play_temp_path之后的路徑??罩档脑捊么斯δ?。
play_local_path dir
在播放前設(shè)置遠(yuǎn)程存儲(chǔ)vod文件路徑,默認(rèn)/tmp
play_local_path /tmp/videos;
paly /tmp/videos http://localhost/videos
表示播放視頻,先播放本地緩存,如果沒有的話,從localhost/videos下載到本地/tmp/videos后,在進(jìn)行播放
relay模式
pull url [key=value]
創(chuàng)建pull中繼。主要是從遠(yuǎn)程服務(wù)器拉取流媒體。并進(jìn)行重新發(fā)布。
url語法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么將會(huì)使用本地application名,如果找不到playpath那么久用當(dāng)前流名稱。
參數(shù)如下(使用key=value方式)
app 明確application名
name 捆綁到relay的bending流名稱。如果為空,那么會(huì)使用application中所有本地流
tcurl
pageurl
swfurl
flashver
playpath
live
start
stop
static
pull rtmp://cdn.example.com/main/ch?id=1234 name=channel;
push url [key=value]
與pull類似,只是push推送發(fā)布流到遠(yuǎn)程服務(wù)器。
push_reconnect 1s
在斷開連接后,在push重新連接錢等待的時(shí)間,默認(rèn)3秒
session_relay on;
切換會(huì)話relay模式。在這種情況下關(guān)閉時(shí)relay銷毀。
notify 模式
這個(gè)功能主要是提供http回調(diào)。當(dāng)發(fā)送一些連接操作是,一個(gè)http請(qǐng)求異步發(fā)送。命令處理會(huì)被暫停掛起,知道它返回結(jié)果代碼。當(dāng)http返回2xx成功狀態(tài)碼時(shí),rtmp會(huì)話繼續(xù)。3xx狀態(tài)碼會(huì)使rtmp重定向到另一個(gè)從http返回頭獲取到的application,否則連接丟失。其他狀態(tài)碼,連接斷開。目前用來做簡單的鑒權(quán)。
on_connect url
設(shè)置http連接回調(diào)。當(dāng)客戶分發(fā)連接命令時(shí)。
例子:
on_connect http://localhost/my_auth;
location /on_connect{
if($arg_flashver != “my_secret_flashver”){
rewrite ^.*$ fallback?permanent;
}
}
on_play url
設(shè)置http播放回調(diào)。分發(fā)客戶分發(fā)播放命令時(shí)。
http {
location /redirect {
rewrite ^.*$ newname?permanent;
}
}
rtmp{
application myqpp{
live on;
on_play http://localhost/redirect;
}
}
on_publish
on_doone
on_play_done
on_publish_done
on_record_done
on_update
notify_update_timeout
設(shè)置on_update回調(diào)時(shí)間
notify_update_strict on|off
notify_relay_redirect on
notify_method get
設(shè)置http方法通知,默認(rèn)是application/x-www-form-urlencodeed 的post內(nèi)容類型。有時(shí)候可能會(huì)需要get方法,在nginx的http{}部分處理調(diào)用。在這種情況下可以使用arg_*變量去訪問參數(shù)。
例如如果是method為get時(shí)
location /on_play{
if($arg_pageurl ~* localhost){
return 200;
}
return 500;
}
hls 模式
hls on|off
使application 切換hls協(xié)議直播
hls_path /tmp/hls;
設(shè)置hls播放列表和分段目錄。這一目錄必須在nginx啟動(dòng)前就已經(jīng)存在。
hls_fragment 15s;
設(shè)置hls分段長度,默認(rèn)5秒,這個(gè)跟直播延遲有比較大的影響
hls_playlist_length 20m;
設(shè)置hls播放列表長度,默認(rèn)30秒。這個(gè)跟直播緩存有關(guān)。
hls_sync time
設(shè)置hls時(shí)間戳同步閾值。默認(rèn)2ms。這個(gè)功能防止由低分辨率rtmp(1khz)轉(zhuǎn)換到高分辨率mpeg-ts(90khz)之后出現(xiàn)的噪音。
hls_continuous on|off
切換hls連續(xù)模式,默認(rèn)off。
hls_nested on|off
切換hls嵌套模式。默認(rèn)off。
hls_cleanup on|off;
切換hls清理。默認(rèn)on
accesslog日志
access_log off|path [format_name]
log_format new_format ‘$remote_addr';
access_log logs/rtmp_access.log new_format;
log_format 指定日志格式
創(chuàng)建指定的日志格式。日志格式看起來很像 nginx http 日志格式。日志格式里支持的幾個(gè)變量有:
* connection - 連接數(shù)。
* remote_addr - 客戶端地址。
* app - application 名。
* name - 上一個(gè)流名。
* args - 上一個(gè)流播放/發(fā)布參數(shù)。
* flashver - 客戶端 flash 版本。
* swfurl - 客戶端 swf url。
* tcurl - 客戶端 tcurl。
* pageurl - 客戶端頁面 url。
* command - 客戶端發(fā)送的播放/發(fā)布命令:none、play、publish、play+publish。
* bytes_sent - 發(fā)送到客戶端的字節(jié)數(shù)。
* bytes_received - 從客戶端接收到的字節(jié)數(shù)。
* time_local - 客戶端連接結(jié)束的本地時(shí)間。
* session_time - 持續(xù)連接的秒數(shù)。
* session_readable_time - 在可讀格式下的持續(xù)時(shí)間。
默認(rèn)的日志格式叫做 combined。這里是這一格式的定義:
$remote_addr [$time_local] $command "$app" "$name" "$args" - 
$bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time)
limits限制
max_connections number;
設(shè)置rtmp引擎最大連接數(shù),默認(rèn)off
application hls{
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 15s;
}

到此,關(guān)于“Nginx-rtmp怎么實(shí)現(xiàn)直播媒體實(shí)時(shí)流效果”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI