2016-05-17 6 views
1

Laufen in ein wenig Verwirrung mit der net7mma library.Wie zeichnet man einen RTSP-Stream mit net7mma auf Platte auf?

Ich möchte einen konstanten RTSP-Stream zu einer Axis IP-Kamera erstellen und dann an einem bestimmten Punkt den RTSP-Stream auf der Festplatte aufzeichnen. Der erste sollte möglich sein, nicht sicher, ob letzterer innerhalb dieser Bibliothek oder einfach durch Aneinanderfügen von Rahmenbildern durchgeführt werden kann.

Zeit den folgenden Code versucht, den Stream zu empfangen:

 RtspClient client = new RtspClient("rtsp://axiscamera/axis-media/media.amp", RtspClient.ClientProtocolType.Http); 
     client.Credential = new System.Net.NetworkCredential("root", "password"); 
     client.AuthenticationScheme = System.Net.AuthenticationSchemes.Basic; 
     client.StartPlaying(); 
     client.Client.RtpPacketReceieved += OnPacketReceived; 

... aber stürzt spektakulär:

Ausnahme geworfen: 'Media.Common.TaggedException`1' in Medien. Rtsp.dll Das Programm '[17464] RtspTestViewer.vshost.exe' wurde mit dem Code -1073741819 (0xc0000005) 'Zugriffsverletzung' beendet.

nicht sicher, ob ich soll mit RtspSource oder RtspClient oder beide zusammen zu arbeiten. Wie soll das gemacht werden?

+0

Ich schien dich hier oder so verloren zu haben, lass mich wissen, wie ich helfen kann! – Jay

Antwort

0

Zuerst, Vielen Dank für Ihr Interesse an dem Projekt.

Die Zugriffsverletzung wahrscheinlich ist, weil es etwas ist bereits exklusives Eigentum an Port 554 nehmen, manchmal verwenden wmpnetwork.exe Port 554 das DLNA-Protokoll zu unterstützen, aber es ist schwer, ohne weitere Informationen zu sagen, können Sie netstat verwenden, um zu bestimmen, was das verwendet Port bereits.

Es ist sicherlich möglich, die einzelnen Streams zu speichern, aber die Bibliothek mischt (kombiniert) noch keine Streams in einen Container [obwohl sie fast alle Container lesen kann].

Die SessionDescription, die über SETUP abgerufen wird, wird Ihnen sagen, welche Medientracks verfügbar sind und welchen Codec sie verwenden.

Sie müssen dann empfangene Daten entpaketieren (RtpPackets/RtpFrame), um etwas Sinnvolles damit zu tun, z. Speichern Sie es auf der Festplatte oder spielen Sie es ab.

RtpPackets bilden eine RtpFrame; In den meisten Szenarien bestehen sie aus einer Anzahl von Paketen, bei denen das letzte Paket das Bit Marker gesetzt hat. Üblicherweise teilen sich alle Pakete, die einem RtpFrame entsprechen, dasselbe Feld Timestamp.

Die Basis RtpFrame Implementierung in meinem Projekt wird nur für Ereignisse verwendet, es sollte eine abgeleitete Implementierung für Ihren Codec innerhalb der RtspServer Klasse sein.

Daher würde ich das Ereignis verwenden, es wird jedes Mal ausgelöst, wenn ein RtpPacket zu einem Rahmen hinzugefügt wird. Der Parameter 'final' im Ereignis RtpFrameChanged zeigt an, ob dies das letzte Mal ist, dass das Ereignis mit der gegebenen Rahmeninstanz als Argument ausgelöst wird.

Sie können normalerweise einen Code wie folgt im OnRtpFrameChanged-Ereignis verwenden, um die Verarbeitung durchzuführen.

if(final) { /* process the frame further*/ } 

Die abgeleitete RtpFrame Implementierung ist die nützlich (von RtpPackets geht zum Decoder oder anderweitig) zu depacketize oder packetize (geht aus Daten zu RtpPackets).

Wenn Sie die UnitTests Lösung überprüfen, werden Sie sehen, wie ich die abgeleiteten Implementierungen für JPEG, H.264 und AAC (vielleicht auch ein paar andere) verwenden

Wenn Sie einen Codec, die Sie finden make nicht unterstützt ein Problem auf dem Projekt Discussion Area und wir können von dort aus gehen.

+0

Wenn ich dir hier folgen wollte, dachte ich nicht, dass ich einen separaten Decoder erstellen oder einbringen müsste; im Wesentlichen RtspSource hat ein Ereignis, das mit einem Rahmen von System.Drawing.Image ausgelöst wird - das ist großartig und holt mich den größten Teil des Weg dorthin, aber nicht klar, wie man zu diesem Punkt kommt. – Brandon

+0

Wie wollen Sie mit den Daten ohne Decoder arbeiten? Zum Beispiel mit JPEG gibt es eine Implementierung, die bereits existiert, wenn Sie einen Video-Codec und nicht ein Image verwenden, dann benötigen Sie eine Möglichkeit, eine System.Drawing.Image-Instanz für das Format zu erhalten ... – Jay

+0

Sie können optional auch die RtpTools verwenden Implementierungen, um eine RtpDump-Datei zu schreiben, die keine anderen Bibliotheken benötigt, aber ich bin mir nicht sicher, wie nützlich Sie es finden werden, da Sie immer noch einen Decoder benötigen, um die Daten anzuzeigen oder zu hören. – Jay

Verwandte Themen