PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfaches Echtzeit Video Encoding und Streaming in C++


Vertex
2010-06-01, 14:22:28
Hallo!

Ich habe folgendes Problem: Ich habe ein Applikation in der ich sagen wir mal laufend ändernde Bitmaps habe, welche ich zu einem Webclient in Echtzeit als Videostream schicken möchte. Also zb so wie Online das zb mit ihrem aus Computerspielen generierten "Frames" machen könnte (wie auch immer das genau bei denen abläuft).

Nun mal etwas konkreter... Aktuelle Bitmaps in einer Applikation darzustellen ist kein Problem, diese entsprechend in einen videostream zu bekommen und für eine Weiterleitung zu sorgen wiederum schon.

Mal angenommen ich habe einen fertigen Videostream, den ich zb mittels einem der Realtime Protokolle an einen Streaming server senden kann, so übernimmt mir dieser zumindest mehr oder weniger die Auslieferung an einen Webclient. Also kommt eine Anfrage an den Streaming server, so muss dieser nur jedesmal eine Instanz bzw. einen Channel von meiner Software anfordern und bekommt dann per Realtime Protokoll den fertigen Videostream, welcher an den Client geschickt wird.

Bleibt als Aufgabe (um dies es mir hier hauptsächlich geht) einen Videostream aus "Bitmaps/Frames" zu erzeugen und diesen über ein entsprechendes Realtime Protkoll zu verschicken. Meine Schwierigkeit liegt nun darin sowas in eine kommerzielle Applikation zu integrieren. Ich habe bereits umhergeguckt, allerdings nicht wirklich brauchbares gefunden. Die ganzen gpl libs und VideoLAN sind da meines Erachtens wegen kommerzieller Applikation nicht zu gebrauchen (oder irre ich mich da und es ist soweit trennbar, dass es doch irgendwie verwendbar wäre?). Codec mäßig hab ich mich ein wenig informiert und würde das natürlich so gern wie möglich irgendwie offloaden in der Hoffnung irgendwie der ganzen Lizensierungsgeschichte aus dem Weg zu gehen.

Im Prinzip wäre es mir natürlich am liebsten wenn ich eine Library hätte, der ich einfach nur meine Bitmaps übergebe und die dann alles entsprechend umwandelt, encoded,... und an einen Streaming Server schickt. Oder aber der Streamingserver selbst würde das encoding übernehmen, allerdings hab ich davon noch keine angetroffen.

Falls relevant: Gearbeitet wird mit Microsoft Visual C++ native .

Danke,
Vertex

Marscel
2010-06-01, 20:41:15
Wenn du Libs unter LGPL nimmst (libavformat sollte darunter fallen), darfst du dein Programm nur nicht statisch dagegen linken. Dann kann es auch proprietär sein. Mit Thoera z.B. sollte (aber das weiß ja offiziell noch niemand richtig) es da auch keine weiteren patentrechtlichen Schwierigkeiten geben, und sonst vllt VP8.

Zweitens, ich krieg hier VLC als Transcoder zum laufen.

Vertex
2010-06-02, 11:16:52
Wenn du Libs unter LGPL nimmst (libavformat sollte darunter fallen), darfst du dein Programm nur nicht statisch dagegen linken. Dann kann es auch proprietär sein. Mit Thoera z.B. sollte (aber das weiß ja offiziell noch niemand richtig) es da auch keine weiteren patentrechtlichen Schwierigkeiten geben, und sonst vllt VP8.

Zweitens, ich krieg hier VLC als Transcoder zum laufen.Danke für die Info.

Bezüglich VLC als Transcoder, kannst du mir da mehr Infos geben? Also meinst du, dass du VLC (GUI/CMD) verwendest um was zu transcoden, oder VLC zb über die vlclib in ein programm eingebunden hast und in diesem echtzeittranscoding machst (Falls letzteres könntest du dazu mehr Infos schreiben?).

Danke,
Vertex

Marscel
2010-06-02, 12:55:38
Nachher mehr, bin gerade im Büro. Ich habs gestern erstmal ganz simpel mit der GUI probiert, wählst du X als Input aus (Datei, Gerät, Netzwerkstream...) und schusterst dir Format Y als Output zusammen (vieles dabei). Jetzt nimmst du dir einen Player, verbindest mit dem Streaming-Server und erhälst ein Video im Format Y.

Je nach dem, wie viel Transcoding Aufwand dabei ist, zieht es natürlich ordentlich CPU-Power, das Video in Echtzeit zu codieren (habe mein DVB-T in WMV transcodiert auf nem AMD XP 3000+). Wenn der Transcoder auf derselben Maschine läuft, wie dein Progamm/Spiel, könnte es langsam werden. Wenn das ne Netzarchitektur werden soll, siehst natürlich anders aus.

Grundsätzlich hat VLC ja mehrere Interfaces: GUI, Shell/Kommandozeile, Telnet und vielleicht noch mehr - musst du mal in die Doku schauen. Ich weiß gar nicht, ob die Streaming-Funktionalität in irgendeiner Lib vorliegt oder das Programm den I/O handelt (psst, OpenSource...), kann ich nachher nochmal gucken.