Maison  >  Article  >  Opération et maintenance  >  Comment Nginx-rtmp réalise-t-il l'effet de diffusion en temps réel des médias en direct ?

Comment Nginx-rtmp réalise-t-il l'effet de diffusion en temps réel des médias en direct ?

王林
王林avant
2023-05-12 20:43:12928parcourir

0. Préface

Pendant ce temps, je construis un serveur de projet ipcamera. Pour les appels vidéo point à point, le client verra le flux audio et vidéo en temps réel sur l'appareil. Afin d’économiser du trafic, la pénétration se fait via le p2p. Mais pour des raisons d'équipement NAT et de l'épuisement de l'ipv4. Certains appareils ne sont pas en mesure de transmettre des flux en direct point à point. Une redirection de serveur est donc requise. Ici, afin de mettre en œuvre rapidement le prototype, nous nous référons également aux protocoles de streaming multimédia actuels. J'ai trouvé que beaucoup utilisent le protocole rtmp.

 L'image ci-dessous est le schéma de conception global. Afin d'intégrer plusieurs plates-formes, nous allons construire notre propre serveur multimédia de streaming rtmp et utiliser le service multimédia de streaming rtmp du fournisseur de cloud saas. Cependant, comme certaines données multimédias non diffusées en continu sont parfois transmises et que certains fichiers binaires doivent être transmis, un service de transfert multimédia personnalisé est requis.

 Ce qui suit est l'organigramme de mise en œuvre de l'architecture utilisé dans mon projet actuel.

Comment Nginx-rtmp réalise-t-il leffet de diffusion en temps réel des médias en direct ?

 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. Compilez nginx

 rtmp streaming media server Il existe de nombreuses solutions open source prêtes à l'emploi, notamment srs, red5, wowoza, fms, etc. J'utilise le plug-in rtmp de nginx pour implémenter. transfert de flux en temps réel.

  Téléchargez nginx-rtmp-module

Recompilez nginx

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

2. Configurez nginx.conf

La configuration de base de nginx ne sera pas présentée ici Si vous avez besoin d'en savoir plus, vous pouvez vous référer à mes autres blogs, qui ont des introductions. Seule la définition du segment rtmp est introduite ici.

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. Rappel de notification asynchrone http

Le plug-in nginx-rtmp-module implémente la notification d'événements pour certaines commandes du protocole rtmp. Ici, j'utilise un simple projet Springboot pour créer rapidement un service http afin de recevoir des rappels 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. Effet opérationnel

                                 back through in in inst . Pour le logiciel de streaming ici, j'utilise ceci

                            back through in in inst .                            Méthode d'authentification rtmp

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
Comment Nginx-rtmp réalise-t-il leffet de diffusion en temps réel des médias en direct ?

5.

 Pour le général utilisation commerciale, afin d'éviter qu'il ne soit utilisé par d'autres et pour des raisons de sécurité, rtmp doit être authentifié. Si l'authentification est spéciale, vous pouvez modifier le code source de nginx-rtmp-module puis le modifier. En fait, cela signifie ajouter une fonction auth. Cette fonction peut interroger la base de données et ainsi de suite, puis décider de renvoyer 0. pour le succès ou -1 pour l'échec. Comment Nginx-rtmp réalise-t-il leffet de diffusion en temps réel des médias en direct ?

En plus des méthodes mentionnées ci-dessus, vous pouvez également utiliser une méthode simple, qui est le rappel http mentionné ci-dessus. Si le code d'état http renvoyé par le rappel http est 2xx, cela signifie un succès. Si un code d'état 5xx est renvoyé, cela indique un échec. Dans ce cas, le serveur déconnecte simplement la connexion rtmp.

  C'est tout

  Quant à l'implémentation, elle n'est pas encore disponible ici. En fait, il s'agit simplement de juger les paramètres de chaque requête dans le projet springboot. Si j'en ai l'occasion plus tard, je l'écrirai en détail, l'associerai à la base de données redis et implémenterai la fonction de numéro de chambre. Mais je ne l’écrirai probablement plus, car ce n’est en fait pas difficile. Même si l’ensemble du processus se déroule sans problème, il reste encore beaucoup de code à écrire. Il n’est pas bon de publier trop de code sur le blog. La chose la plus importante dans un blog est de proposer des idées. La mise en œuvre réelle doit être mise en œuvre dans le projet.

6. Autres

  Voici quelques instructions de configuration et exemplesrtmp://rtmp.wunaozai.com/rtmp_live/room?username=username&password=password

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)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer