mpeg-stream aus Framebuffer
-
Hallo,
ich arbeite momentan an einem c++-Projekt, das frames aus dem directX-Framebuffer ausliest, diese in Bilder umwandelt und über ein Socket an einen anderen Server verschickt. Dazu benutze ich momentan FreeImage, das die Bilder in jpegs kodiert. Allerdings würde ich das Ganze lieber als mpeg-Stream (bzw. andere Formate) streamen. Versucht habe ich es mit ffmpeg, allerdings hänge ich da am Verständnis. Hat jemand etwas derartiges schonmal gemacht? (aus einem Byte-Array einen Videostream generieren). Würde mich über jeden Tipp freuen!
By the way: ffmpeg/avcodec in c++ zu integrieren schien mir am sinnvollsten, aber das mixing von c++ und c ist nicht gerade die einfachste Variante

Grüße,
HotCoffee
-
Die ffmpeg Doku ist ein kleiner Programmierhorror, nur mal als Vorwarnung.

Aber das hier reicht dir vielleicht schon: http://stackoverflow.com/questions/2940671/how-to-encode-series-of-images-into-h264-using-x264-api-c-c
-
(aus einem Byte-Array einen Videostream generieren)
Hi, mal eine höfliche Gegenfrage:
Wieso schriebst/benutzt Du nicht einen passenden Transform/Recoderfilter und
schriebst/benutzt einen passenden SinkFilter? So muss du nur mit den Samples hantieren und ein wenig mit Mpegheader/Videoheader2..?!Sorry, falls ich Dich missverstanden habe.
-
Vielen Dank schonmal für die schnellen Antworten. Ich gehe erstmal auf den Link von cooky ein und les mich da durch. Ich melde mich sobald ich da durch bin

-
@Travor
Was für Filter meinst du? DirectShow?
-
jo die meinte ich..
-
«WM ASF Writer» kann auf jeden Fall auch über Internet „hinausstreamen“ und
«MJPEG Compressor Filter» ist auch schon vorhanden.. Die Frage lautet: wie kommen
die Bilder in Direct-X Framebuffer rein? Sind die vom Programm selber gerendet oder sind die ein Teil eines anderen Videostreams ( sprich eh DirectShow )
-
Die kommen aus der Unreal-Engine. Genauer gesagt arbeite ich im "ImageServer", der einen DirectX-Hook drin hat. Normalerweise kann er lediglich den Framebuffer auslesen und jpegs generieren. Ich erweitere ihn so, dass er es als Video streamen kann.
Mit x264 bin ich soweit noch nicht fertig. In mein Projekt habe ich die nötige Source schon implementiert, allerdings muss ich x264 erstmal auf nem (zum Glück vorhandenen) Unix-System kompilieren, um an die x264_config.h ranzukommen (glaube ich jedenfalls).
Einen Fehler im Code habe ich noch gefunden, und zwar hat laut VS x264_picture_t keinen Member "stride", der allerdings beim Post auf stackoverflow verwendet wird (für swscale von ffmpeg, um ins YUV-Format zu kommen).
Puh, ganz schön hässlich das Ganze
Aber danke für Eure Hilfe 
-
Sorry, vergesst, was ich über die config gesagt habe. Hat sich erledigt. Musste sie lediglich erstellen und ein paar defines reinpacken.
-
Ich hab so ein Wenig das Gefühl, auf Java umzusteigen. Die Daten kann ich ebensogut an einen Java-Server weiterleiten (nachdem ich die Frames verkleinert habe, ich brauche lediglich eine Auflösung von 320p), der daraus dann den Stream erstellt. In Java bin ich wesentlich fitter, und bevor ich anfange, xh264 (in C) in eine C++-DLL einzubasteln...argh.
Allerdings kostet das technisch gesehen mehr Zeit, bis der Stream letzten Endes generiert ist :SIdeen?
-
Leider nicht. Codecs/Streams zu fuss ist IMHO fast immer eine Bestrafung.
-
HotCoffee schrieb:
Ich hab so ein Wenig das Gefühl, auf Java umzusteigen. (...)
Ideen?
Nur dass ich das mit Java für eine schlechte Idee halte. Es sei denn du findest nen Video-Compressor mit fertigem Java-Binding.
Sonst musst du in Java nämlich genau das machen, was du sonst in C bzw. C++ machen müsstest, nur zusätzlich noch den ganzen nötigen JNI Code schreiben. *pfuispinne*
-
Sorry für den Delay, ich war unterwegs aufm Anathema-Konzert *yeah*

Ich leite die Daten so oder so an einen java-Masterserver (es ist ja so, dass User über eine Webseite sehen sollen was ingame geschieht, also muss der Spieler keine Ports offen haben etc - im Endeffekt soll der root-server den Stream nur weiterleiten).
Ob das in java schwerer ist, bezweifle ich, allerdings bin ich da noch am Testen.Ich unterrichte Euch über den Fortschritt
