Publishing-stream mit librtmp in C/C++
So veröffentlichen Sie einen stream mit librtmp-Bibliothek?
Ich lese die librtmp-man-Seite und für das publishing , die RTMP_Write() verwendet wird.
Ich Tue wie dieser.
//Code
//Init RTMP code
RTMP *r;
char uri[]="rtmp://localhost:1935/live/desktop";
r= RTMP_Alloc();
RTMP_Init(r);
RTMP_SetupURL(r, (char*)uri);
RTMP_EnableWrite(r);
RTMP_Connect(r, NULL);
RTMP_ConnectStream(r,0);
Dann zu reagieren, um ping/weitere Nachrichten vom server, ich bin mit einem thread zu Antworten wie folgende:
//Thread
While (ThreadIsRunning && RTMP_IsConnected(r) && RTMP_ReadPacket(r, &packet))
{
if (RTMPPacket_IsReady(&packet))
{
if (!packet.m_nBodySize)
continue;
RTMP_ClientPacket(r, &packet); //This takes care of handling ping/other messages
RTMPPacket_Free(&packet);
}
}
Nachdem ich mit diesen am stecken wie zu verwenden RTMP_Write (), um eine Datei veröffentlichen zu Wowza media server?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In meiner eigenen Erfahrung, streaming-video-Daten an einen RTMP-server ist eigentlich ziemlich einfach, auf die librtmp Seite. Der schwierige Teil ist richtig packetize video/audio-Daten und Lesen Sie es auf dem richtigen Kurs.
Vorausgesetzt, Sie verwenden das FLV-video-Dateien, so lange wie Sie können, richtig isolieren, die jeden tag in der Datei und senden jeweils eine mit einem
RTMP_Write
nennen, die Sie gar nicht brauchen, um eingehende Pakete.Der schwierige Teil ist zu verstehen, wie FLV-Dateien vorgenommen werden.
Die offizielle Spezifikation ist hier verfügbar: http://www.adobe.com/devnet/f4v.html
Erstens, es gibt eine Kopfzeile, die aus 9 bytes. Dieser header muss nicht zum server gesendet werden, aber nur durch Lesen, um sicherzustellen, dass die Datei wirklich FLV.
Dann gibt es einen stream von tags. Jeder tag hat eine 11 Byte header, der enthält die Art des Tags (video - /audio - /Metadaten), die Länge des Körpers, und der tag ist timestamp, unter anderem.
Den tag-header beschrieben werden kann, die Nutzung dieser Struktur:
Die Länge des Körpers und der Zeitstempel werden als 24-bit-big-endian-Integer-zahlen, mit einem zusätzlichen byte zu erweitern, die Zeitstempel, 32 bit, falls nötig (das ist etwa um die 4 Stunden Marke).
Sobald Sie Sie gelesen haben, den tag-header, können Sie Lesen Sie die Körper selbst, wie Sie jetzt wissen, dass seine Länge (
body_length
).Nach, dass es eine 32-bit-big-endian-integer-Wert enthält die gesamte Länge des Tags (11 Byte +
body_length
).Schreiben Sie die tag-header + body + vorherigen tag-Größe in eine
RTMP_Write
nennen (sonst wird es nicht spielen).Auch, vorsichtig sein, um Pakete zu senden, bei der die nominelle Bildrate der Videos, sonst wird die Wiedergabe sehr leiden.
Ich geschrieben habe, eine komplette FLV-Datei demuxer als Teil meiner GPL-Projekt FLVmeta, die Sie als Referenz verwenden können.
In der Tat, RTMP_Write() zu verlangen scheint, dass Sie bereits das RTMP packet gebildet, die in buf.
So, man kann nicht einfach schieben Sie die flv-Daten gibt es - Sie müssen es separate Pakete zuerst.
Gibt es eine schöne Funktion, RTMP_ReadPacket(), aber es liest aus der Netz-Steckdose.
Ich habe das gleiche problem wie du, hoffe auch bald eine Lösung.
Edit:
Gibt es bestimmte Fehler in RTMP_Write(). Ich habe einen patch und jetzt funktioniert es. Ich werde zu veröffentlichen.