搜尋
首頁運維NginxNginx-rtmp怎麼實現直播媒體即時串流效果

0. 前言

  這段時間在搭建一個ipcamera專案伺服器。視訊點對點通話,客戶端會查看裝置端的音視訊即時串流。為了省流量,是透過p2p進行穿透。但是由於nat設備的原因和ipv4的枯竭。有些設備是無法進行點對點傳輸即時串流。所以需要進行伺服器轉送。這裡為了快速實現原型,同時參考現在主流的串流媒體協議。發現很多使用的是rtmp協定。

  下圖是整體設計圖,為了整合多平台,會自建rtmp串流伺服器和使用雲端廠商saas的rtmp串流服務。但是由於有時會傳輸一些非串流媒體數據,需要傳輸一些二進位文件,所以會需要自訂媒體轉發服務。

  以下是我實際專案中,用到的架構實作流程圖。

Nginx-rtmp怎麼實現直播媒體即時串流效果

 1. 客户端a无法进行p2p穿透,请求业务服务器要进行转发。
 2. 业务服务器根据客户端a,请求类型,返回对应的转发服务器地址和对应的房间号roomid/token等信息
 3. 上述请求类型,可以是请求自建rtmp流媒体服务,购买于云厂商rtmp流媒体服务或者自定义协议媒体转发服务
 4. 客户端a得到业务服务器返回的媒体服务器地址和roomid/token
 5. 通过信令服务器或者mqtt服务器,把对应的媒体服务器地址和roomid/token告诉另一端客户端b
 6. 客户端a和客户端b同时进入相同房间room,客户端a进行推流,客户端b进行拉流
 7. 其他媒体信息,如编解码格式,清晰度,播放,暂停,拍照等命令,通过上述信令或mqtt服务器进行命令控制

1. 編譯nginx

  rtmp串流伺服器,現成的開源方案有很多,有srs,red5,wowoza ,fms等,我這裡使用的是nginx的rtmp插件實現即時流轉發。

  下載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配置 nginx.conf

  基本的nginx配置。 ,這裡就不進行介紹了,需要了解的可以參考我其他博客,裡面有介紹。這裡只介紹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非同步通知回呼

   nginx-rtmp-module插件實作了針對rtmp協定的一些指令做了事件通知。這裡我透過一個簡單的springboot項目,快速搭建一個http服務來接收rtmp的回呼。

 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. 運行效果

  (1) 啟動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
Nginx-rtmp怎麼實現直播媒體即時串流效果(3) 客戶端進行推流,這裡的推流軟體,我是使用這個

Nginx-rtmp怎麼實現直播媒體即時串流效果  (4) 行動端,我使用微信小程式裡的騰訊視訊雲  這個小程式裡面有rtmp測試

  (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鑑權方式

   一般商用的話,為了防止被其他人使用和安全性考慮,所以需要對rtmp進行鑑權處理。鑑權如果有特殊性的,可以透過修改nginx-rtmp-module的原始碼,然後進行修改,其實就是增加個auth函數,這個函數可以查詢資料庫之類的,然後決定回傳0成功還是-1表示失敗。

  除了上面說到的方式,還可以透過簡單的方式,就是上面提到的http回呼。如果http回呼回傳的http狀態碼是2xx的,表示成功。如果是回傳5xx的狀態碼,那麼表示失敗。那樣的話,伺服器就是斷開rtmp連線。

  就是在 

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

#  至於實現,這裡暫時還沒有,其實就是在springboot專案中對每個請求,判斷一下參數即可。如果後面有機會就詳細寫一下,關聯redis資料庫,實現房間號碼功能。但是可能不會寫了,因為實際上不難。就是整個流程跑通還是比較多程式碼要寫的,在部落格貼太多程式碼有點不好。部落格最主要的還是提供想法。實際實現就應該在專案中實現了。

6. 其他

######  這裡是一些設定說明和範例###
application 创建一个rtmp应用,这里有点区别于http的location
timeout 60s 
stocket超时,可以配合keepalive和ping值来实现不让服务器端长期处于监听连接客户端状态,实现快速关掉socket
ping 3m
ping_timeout 30s
rtmp ping用于检查活动连接的协议。发送一个特殊的包远程连接,在ping_timeout指定时间内期待一个回复,如果没有收到回复,连接断开
max_streams 32
设置rtmp流的最大数目,单一流数据最大限制,一般默认的32就可以了
ack_window 5000000
设置rtmp窗口的大小
chunk_size 4096
数据块大小 设置值越大cpu负载就越小
max_queue
最大队列数,一般默认即可
max_message 1m
输入数据消息的最大大小。所有输入数据消息都会保存在内存中,等待完成流媒体转发。在理论上传入的消息可以是非常大,对服务器稳定性影响较大,所以一般默认即可。
out_queue
out_cork
buflen 5s
设置默认缓冲区长度。通常客户端发送播放前rtmp set_buflen命令并重置该设置
访问控制
access
allow/deny
允许来自指定地址或者所有地址发布/播放
allow public 127.0.0.1
deny publish all;
allow play 192.168.0.0/24
deny play all;
exec命令
exce 
exec_options on;
启动一些exec指令选项,通过一些exec事件来干预整个rtmp流
可以仔细一些外部编解码功能
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,属于静态命令,不支持传递上下文参数
exec_kill_signal term;
exec_kill_signal user1;
exec_kill_signal 3;
exec_pull 
exec_push
exec_publish
指定与参数外部命令要在发布事件执行。
exec_play
指定与要在打开事件执行外部命令
exec_play_done
指定要在打开完成事件执行外部命令
exec_publish_done
exec_record_done
例子
exec_play bash -c “echo $addr $pageurl >> /tmp/clients”
exec_publish base -c “echo $addr $flashver >> /tmp/publishers”
转录
exec_record_done ffmpeg -y -i $path -acodec libmp31ame -ar 44100 -ac 1 -vcodec libx264 $dirname/$basename.mp4
live 模式
live on
切换直播模式,即一对多广播
meta on/copy/off
奇幻发送元数据到客户端 默认on
interleave on/off
切换交叉模式。在该模式下,音视频会在同一个rtmpchunk流中传输。默认为off
wait_key on|off
使视频流从一个关键帧开始,默认为off
wait_video on|off
在一个视频帧发送前禁用音频。默认off
通过wait_key/wait_video进行组合以使客户端可以收到具有所有其他数据的视频关键帧。但这样会增加连接延迟。不过可以通过编解码器中调整关键帧间隔来减少延迟。
publish_notify on
发送netstream.publish.start和netstream.publish.stop给用户,默认off
drop_idle_publisher 10s
终止指定时间内闲置(没有音频、视频)的发布连接,默认为off。注意这个仅仅对于发布模式的连接起作用(发送publish命令之后)
sync 10ms
同步音视频流。如果用户带宽不足以接收发布率,服务器会丢弃一些帧。这将导致同步问题。当时间戳差超过sync指定值,将会发送一个绝对帧来解决这个问题,默认为300ms
play_restart off
使nginx-rtmp能够在发布启动或者停止时发送netstream.play.start 和 netstrem.play.stop到每个用户。如果关闭的话,那么每个用户就只能在回放的开始结束时收到该通知了。默认为on
record 模式
record off|all|audio|video|keyframes|manual
切换录制模式,流可以被记录到flv文件
off 不录制
all 录制音频和视频
audio
video
keyframes 只录制关键视频帧
manual 不自动启动录制,使用控制接口来进行启动和停止
record_path /tmp/rec
指定录制的flv文件存放目录
record_suffix -%d-%b-%y-%t.flv
录制后缀strftime格式
record_unique on|off
是否添加时间戳到录制文件,防止文件被覆盖,默认off
record_append on|off
切换文件附加模式。开启后,录制时将新数据附加到旧文件后面。默认off
record_lock on|off
锁定文件,调用系统的fcntl
record_max_size 128k
设置录制文件的最大值
record_max_frames 2
设置每个录制文件的视频帧最大数量
record_interval 1s/15m
在这个指令指定的时间之后重启录制。默认off设置为0表示录制中无延迟。如果record_unique为off时所有的记录都会被写到同一个文件中。否则就会以时间戳区分在不同文件
record_notify on|off
奇幻当定义录制启动或者停止文件时发送netstream.record.start和netstream.record.stop状态信息onstatus到发布者。
应用
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;
}
}
创建录制块。可以在单个application中创建多个记录 。
vod媒体
play dir|http://loc 
播放指定目录或者http地址的flv或者mp4文件。注意http播放是要在整个文件下载完后才开始播放。同一个play可以播放多个视频地址(用于负载)。mp4格式要在编解码都被rtmp支持才可以播放。一般常见的就是h264/aac
application vod{
play /var/flvs;
}
application vod_http{
play http://localhost/vod;
}
play_temp_path /www
设置远程vod文件完全下载之后复制于play_temp_path之后的路径。空值的话禁用此功能。
play_local_path dir
在播放前设置远程存储vod文件路径,默认/tmp
play_local_path /tmp/videos;
paly /tmp/videos http://localhost/videos
表示播放视频,先播放本地缓存,如果没有的话,从localhost/videos下载到本地/tmp/videos后,在进行播放
relay模式
pull url [key=value]
创建pull中继。主要是从远程服务器拉取流媒体。并进行重新发布。
url语法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么将会使用本地application名,如果找不到playpath那么久用当前流名称。
参数如下(使用key=value方式)
app 明确application名
name 捆绑到relay的bending流名称。如果为空,那么会使用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推送发布流到远程服务器。
push_reconnect 1s
在断开连接后,在push重新连接钱等待的时间,默认3秒
session_relay on;
切换会话relay模式。在这种情况下关闭时relay销毁。
notify 模式
这个功能主要是提供http回调。当发送一些连接操作是,一个http请求异步发送。命令处理会被暂停挂起,知道它返回结果代码。当http返回2xx成功状态码时,rtmp会话继续。3xx状态码会使rtmp重定向到另一个从http返回头获取到的application,否则连接丢失。其他状态码,连接断开。目前用来做简单的鉴权。
on_connect url
设置http连接回调。当客户分发连接命令时。
例子:
on_connect http://localhost/my_auth;
location /on_connect{
if($arg_flashver != “my_secret_flashver”){
rewrite ^.*$ fallback?permanent;
}
}
on_play url
设置http播放回调。分发客户分发播放命令时。
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
设置on_update回调时间
notify_update_strict on|off
notify_relay_redirect on
notify_method get
设置http方法通知,默认是application/x-www-form-urlencodeed 的post内容类型。有时候可能会需要get方法,在nginx的http{}部分处理调用。在这种情况下可以使用arg_*变量去访问参数。
例如如果是method为get时
location /on_play{
if($arg_pageurl ~* localhost){
return 200;
}
return 500;
}
hls 模式
hls on|off
使application 切换hls协议直播
hls_path /tmp/hls;
设置hls播放列表和分段目录。这一目录必须在nginx启动前就已经存在。
hls_fragment 15s;
设置hls分段长度,默认5秒,这个跟直播延迟有比较大的影响
hls_playlist_length 20m;
设置hls播放列表长度,默认30秒。这个跟直播缓存有关。
hls_sync time
设置hls时间戳同步阈值。默认2ms。这个功能防止由低分辨率rtmp(1khz)转换到高分辨率mpeg-ts(90khz)之后出现的噪音。
hls_continuous on|off
切换hls连续模式,默认off。
hls_nested on|off
切换hls嵌套模式。默认off。
hls_cleanup on|off;
切换hls清理。默认on
accesslog日志
access_log off|path [format_name]
log_format new_format ‘$remote_addr';
access_log logs/rtmp_access.log new_format;
log_format 指定日志格式
创建指定的日志格式。日志格式看起来很像 nginx http 日志格式。日志格式里支持的几个变量有:
* connection - 连接数。
* remote_addr - 客户端地址。
* app - application 名。
* name - 上一个流名。
* args - 上一个流播放/发布参数。
* flashver - 客户端 flash 版本。
* swfurl - 客户端 swf url。
* tcurl - 客户端 tcurl。
* pageurl - 客户端页面 url。
* command - 客户端发送的播放/发布命令:none、play、publish、play+publish。
* bytes_sent - 发送到客户端的字节数。
* bytes_received - 从客户端接收到的字节数。
* time_local - 客户端连接结束的本地时间。
* session_time - 持续连接的秒数。
* session_readable_time - 在可读格式下的持续时间。
默认的日志格式叫做 combined。这里是这一格式的定义:
$remote_addr [$time_local] $command "$app" "$name" "$args" - 
$bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time)
limits限制
max_connections number;
设置rtmp引擎最大连接数,默认off
application hls{
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 15s;
}

以上是Nginx-rtmp怎麼實現直播媒體即時串流效果的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
NGINX單元:關鍵功能NGINX單元:關鍵功能Apr 25, 2025 am 12:17 AM

NGINXUnit是一個開源應用服務器,支持多種編程語言,提供動態配置、零停機更新和內置負載均衡等功能。 1.動態配置:無需重啟即可修改配置。 2.多語言支持:兼容Python、Go、Java、PHP等。 3.零停機更新:支持不中斷服務的應用更新。 4.內置負載均衡:可將請求分發到多個應用實例。

NGINX單元與其他應用程序服務器NGINX單元與其他應用程序服務器Apr 24, 2025 am 12:14 AM

NGINXUnit優於ApacheTomcat、Gunicorn和Node.js內置HTTP服務器,適用於多語言項目和動態配置需求。 1)支持多種編程語言,2)提供動態配置重載,3)內置負載均衡功能,適合需要高擴展性和可靠性的項目。

NGINX單元:架構及其工作原理NGINX單元:架構及其工作原理Apr 23, 2025 am 12:18 AM

NGINXUnit通過其模塊化架構和動態重配置功能提高了應用的性能和可管理性。 1)模塊化設計包括主控進程、路由器和應用進程,支持高效管理和擴展。 2)動態重配置允許在運行時無縫更新配置,適用於CI/CD環境。 3)多語言支持通過動態加載語言運行時實現,提升了開發靈活性。 4)高性能通過事件驅動模型和異步I/O實現,即使在高並發下也保持高效。 5)安全性通過隔離應用進程提高,減少應用間相互影響。

使用NGINX單元:部署和管理應用程序使用NGINX單元:部署和管理應用程序Apr 22, 2025 am 12:06 AM

NGINXUnit可用於部署和管理多種語言的應用。 1)安裝NGINXUnit。 2)配置它以運行不同類型的應用,如Python和PHP。 3)利用其動態配置功能進行應用管理。通過這些步驟,你可以高效地部署和管理應用,提升項目效率。

NGINX與Apache:Web服務器的比較分析NGINX與Apache:Web服務器的比較分析Apr 21, 2025 am 12:08 AM

NGINX更适合处理高并发连接,而Apache更适合需要复杂配置和模块扩展的场景。1.NGINX以高性能和低资源消耗著称,适合高并发。2.Apache以稳定性和丰富的模块扩展闻名,适合复杂配置需求。

NGINX單元的優勢:靈活性和性能NGINX單元的優勢:靈活性和性能Apr 20, 2025 am 12:07 AM

NGINXUnit通過其動態配置和高性能架構提升應用的靈活性和性能。 1.動態配置允許在不重啟服務器的情況下調整應用配置。 2.高性能體現在事件驅動和非阻塞架構以及多進程模型上,能夠高效處理並發連接和利用多核CPU。

NGINX與Apache:性能,可伸縮性和效率NGINX與Apache:性能,可伸縮性和效率Apr 19, 2025 am 12:05 AM

NGINX和Apache都是強大的Web服務器,各自在性能、可擴展性和效率上有獨特的優勢和不足。 1)NGINX在處理靜態內容和反向代理時表現出色,適合高並發場景。 2)Apache在處理動態內容時表現更好,適合需要豐富模塊支持的項目。選擇服務器應根據項目需求和場景來決定。

終極攤牌:nginx vs. apache終極攤牌:nginx vs. apacheApr 18, 2025 am 12:02 AM

NGINX適合處理高並發請求,Apache適合需要復雜配置和功能擴展的場景。 1.NGINX採用事件驅動、非阻塞架構,適用於高並發環境。 2.Apache採用進程或線程模型,提供豐富的模塊生態系統,適合複雜配置需求。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。