0. Vorwort
Während dieser Zeit baue ich einen IP-Kamera-Projektserver auf. Bei Video-Punkt-zu-Punkt-Anrufen sieht der Client den Audio- und Videostream in Echtzeit auf dem Gerät. Um Datenverkehr einzusparen, erfolgt die Durchdringung über P2P. Aber aus Gründen der NAT-Ausrüstung und der Erschöpfung von IPv4. Einige Geräte sind nicht in der Lage, Livestreams Punkt-zu-Punkt zu übertragen. Daher ist eine Serverweiterleitung erforderlich. Um den Prototyp schnell umzusetzen, beziehen wir uns hier auch auf die aktuellen Mainstream-Streaming-Media-Protokolle. Ich habe festgestellt, dass viele das RTMP-Protokoll verwenden.
Das Bild unten ist das Gesamtdesigndiagramm. Um mehrere Plattformen zu integrieren, werden wir unseren eigenen RTMP-Streaming-Medienserver erstellen und den RTMP-Streaming-Mediendienst des Cloud-Anbieters Saas verwenden. Da jedoch manchmal einige Nicht-Streaming-Mediendaten übertragen werden und einige Binärdateien übertragen werden müssen, ist ein benutzerdefinierter Medienweiterleitungsdienst erforderlich.
Das Folgende ist das Flussdiagramm der Architekturimplementierung, das in meinem aktuellen Projekt verwendet wird.
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. Kompilieren Sie Nginx
RTMP-Streaming-Medienserver, einschließlich SRS, Red5, Wowoza, FMS usw. Ich verwende das RTMP-Plug-In von Nginx Echtzeit-Stream-Weiterleitung.
Laden Sie das Nginx-RTMP-Modul herunter. Kompilieren Sie Nginx neu. die Einführungen haben. Hier wird nur die Definition des RTMP-Segments vorgestellt.
--prefix=/opt/nginx --with-stream --with-http_ssl_module --with-stream_ssl_module --with-debug --add-module=../nginx-rtmp-module
Das Nginx-RTMP-Module-Plugin implementiert die Ereignisbenachrichtigung für einige Befehle des RTMP-Protokolls. Hier verwende ich ein einfaches Springboot-Projekt, um schnell einen http-Dienst zum Empfangen von RTMP-Rückrufen zu erstellen.
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; } } }
Für die Streaming-Software hier verwende ich dieses
Upover-Stream-Software
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; } }
5. RTMP-Authentifizierungsmethode
Für allgemeine Zwecke Bei kommerzieller Nutzung muss RTMP authentifiziert werden, um die Nutzung durch andere zu verhindern und aus Sicherheitsgründen. Wenn die Authentifizierung speziell ist, können Sie den Quellcode des Nginx-RTMP-Moduls ändern und dann eine Authentifizierungsfunktion hinzufügen. Diese Funktion kann die Datenbank usw. abfragen und dann entscheiden, ob 0 zurückgegeben werden soll für Erfolg oder -1 für Misserfolg. Zusätzlich zu den oben genannten Methoden können Sie auch eine einfache Methode verwenden, nämlich den oben erwähnten http-Callback. Wenn der vom HTTP-Rückruf zurückgegebene HTTP-Statuscode 2xx lautet, bedeutet dies Erfolg. Wenn ein 5xx-Statuscode zurückgegeben wird, weist dies auf einen Fehler hin. In diesem Fall trennt der Server einfach die RTMP-Verbindung.Das ist es
Die Implementierung ist hier noch nicht verfügbar. Tatsächlich dient sie nur der Beurteilung der Parameter für jede Anfrage im Springboot-Projekt. Wenn ich später die Gelegenheit dazu habe, werde ich es ausführlich schreiben, es mit der Redis-Datenbank verknüpfen und die Raumnummernfunktion implementieren. Aber ich werde es wahrscheinlich nicht mehr schreiben, weil es eigentlich nicht schwierig ist. Selbst wenn der gesamte Prozess reibungslos verläuft, muss noch viel Code geschrieben werden. Es ist nicht gut, zu viel Code im Blog zu veröffentlichen. Das Wichtigste an einem Blog ist, Ideen zu liefern. Die eigentliche Umsetzung soll im Projekt umgesetzt werden. 6. Andere Hier sind einige Konfigurationsanweisungen und Beispiele Das obige ist der detaillierte Inhalt vonWie realisiert Nginx-rtmp den Echtzeit-Streaming-Effekt von Live-Medien?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=122815&name=room