So senden Sie MPEGTS streams über UDP
Ich bin die Entwicklung einer Echtzeit-video-streaming-system, das zusammengesetzt ist grundsätzlich von einem server und mehreren clients.
Für jetzt, lasst uns ignorieren, wie Pakete weitergeleitet werden zwischen dem server und den clients, konzentrieren wir uns nur auf , wie der server senden kann, ein MPEGTS stream über UDP-Pakete.
Den stream codiert ist MPEGTS-format.
Was ich versuche zu tun, ist die Lektüre einige Pakete (die wichtigste Frage ist "wie viele?") und encapsulating diese in UDP-Paketen. Das Ziel (client) liest diese UDP-Pakete und leiten Sie zu VLC, die in der Lage ist zu spielen, MPEGTS-Netzwerk-streams durch das Lesen von UDP-Paketen.
Wenn ich senden nur video-Paketen, funktioniert alles einwandfrei, anstelle, wenn ich versuche, Kapseln in der gleichen UDP-Paket, beide, einige video-Pakete und einige audio-Pakete, VLC ist nicht in der Lage zu entschlüsseln und Abspielen des Streams.
Ich habe irgendwo gelesen, dass jedes UDP-Paket sollte enthalten 7 TS-Pakete, aber leider auch wenn ich die Einhaltung dieser Regel, wird VLC nicht decodieren des Streams korrekt.
Hier ist ein Beispiel-code von meinem Programm: http://pastebin.com/evMi6FkY
Wie sollte ich die Kapseln MPEGTS-Pakete in UDP-Pakete?
Dank!
@
in der url, obwohl die url nicht über einen Benutzernamen/Passwort. Having said, die, als nicht mehr als 8 188-byte ts-Pakete passen in ein udp-Paket, können Sie nicht mehr. (weniger ist kein problem). Und ein udp-Paket sollte mit dem start des ts-Pakets, D. H. das erste byte sollte 0x47. Verwenden Sie wireshark, um die Daten zu verifizieren.Hast du dein problem lösen? Ich habe video-streaming mit dvblast, senden Sie Pakete, die über UDP, und Sie erhalten mit ffmpeg. Sogar so einstellen, dass UDP-Paketgrößen zu 1316; Aber ich bekomme Fehler: "PES packet size mismatch" regelmäßig und Ausgabe von video ist schrecklich.
InformationsquelleAutor pAkY88 | 2012-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist: "wir ignorieren, wie Pakete weitergeleitet werden zwischen dem server und den clients".
UDP erfordert, dass Sie sich mit allen Fragen der Netzwerk-transport einschließlich Flusssteuerung, Fehlererkennung und Wiederherstellung, path maximum transmit unit-Größe, packetization, Pufferung, Serialisierung, de-Duplizierung, etc.
Selbst wenn Sie brechen Sie Ihre Daten in Pakete genau die richtige Größe und senden Sie Sie an der richtigen rate, einige werden noch verloren gehen, dupliziert werden, oder geliefert werden. Der code muss mit all diesen Bedingungen, ansonsten können Sie nicht Vertrauen, dass das, was Sie erhalten, ist, was Sie gesendet.
In diesem speziellen Fall würde ich vermuten, dass deine Pakete zu groß geworden, was Fragmentierung und eine hohe drop-rate. Generell ist es am besten, nicht mehr als ungefähr 1400 bytes pro Paket. Aber falsche Reihenfolge, Verlust, Duplizierung sind alle möglich, und alle werden ist wahrscheinlicher, als Sie versuchen, das senden von größeren Datenmengen.
Disclaimer: ich arbeite für ein Unternehmen, das produziert kommerzielle UDP-data-transport-software.
Pakete können und werden verloren auf der lokalen Maschine, wenn Sie gesendet werden, zu schnell, zu groß sind, wenn eine lokale firewall läuft, oder wenn das OS fühlt sich an wie es. UDP ist nie zuverlässig, es sei denn, Sie machen es zuverlässig. Für die Verkapselung, müssen Sie eine header-zumindest identifizieren Sequenzierung der Pakete, so dass Sie Puffer-und re-order und/oder zu erkennen, Verlust. Halten Sie die Größe um nicht mehr als 1408 Byte, inklusive header. Wenn andere Pakete enthalten kann, verschiedene Kombinationen von Daten, fügen Sie beschreibende Informationen zu Ihrem Kopf. Nehmen Sie nichts für selbstverständlich.
-1, deine Antwort gilt für Allgemeine transfer von udp. Aber diese Frage ist über MPEG-TS. MPEG-TS wird in Situationen verwendet, in denen die Kommunikation ist one-way und überträgt nicht möglich sind, wie Satelliten-Kommunikations-oder multicast-udp. Packet loss ist keine große Sache hier. Es ist eine einfache Prüfsumme in ein TS-Paket, Fehler zu erkennen. Dann können wir Sie einfach verwerfen die Daten und re-sync.
Also, was schlagen Sie vor, anstelle von UDP für video-übertragung?! Wenn RTP, ich mache Echtzeit-video-streaming unter Android, so gibt es keine RTP-Player (den ich noch nicht gefunden).
Es gibt 3 Breite Auswahlmöglichkeiten für video-transport: schreiben Sie Ihren eigenen TCP-schreiben Sie Ihren eigenen UDP, oder verwenden Sie ein toolkit wie RTP (die in der Regel baut auf UDP). Aber Aufnahme und Wiedergabe sind zwei getrennte Themen aus transport -, wenn Sie Gebäude von Grund auf neu. Proprietären toolkits (wie QuickTime oder WMP) dazu neigen, kombinieren Sie alle drei, und versuchen, Sie zu zwingen, Ihre software von Ende-zu-Ende. Obwohl Sie können verwenden, RTP, bieten Sie nicht die APIs, in Sie zu erhalten. Einfachste Vorgehensweise: suchen Sie eine end-to-end-Paket, das Sie mit Leben können / leisten.
InformationsquelleAutor Seth Noble
Können Sie versuchen, https://github.com/KwikFlixTV/kwik-udp-send
Es nutzt ts oder FIFO-Dateien und senden konstant bitrate streamen.
Liste der wichtigsten features:
Senden-ts-Datei(en) als ts-udp-stream
Wenn es keine Dateien zu senden, es sendet null-Pakete
Arbeitet mit real-time-Prozess/threads Prioritäten, um die Stabilität des Streams
Arbeiten mit FIFO-Dateien
Lesen von Dateien in einem cache-Puffer mit einer Anhäufung teilweise zur Stabilität des Streams
InformationsquelleAutor pashamesh