DirectX - in Xbase

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
uli_soehnel
Rookie
Rookie
Beiträge: 13
Registriert: Mi, 16. Jan 2008 10:44
Wohnort: Schwäbisch Gmünd

DirectX - in Xbase

Beitrag von uli_soehnel »

Hallo zusammen,

ich möchte versuchen, unter Xbase einen DirectX-Videoplayer zu programmieren. Hierzu habe ich mir einige Beispiele in C++ bzw. VB in der SDK-Dokumentation angesehen. Allerdings verstehe ich weder C++ noch VB richtig.

In C++ sieht das einfache Beispiel so aus:

#include <dshow.h>
void main(void)
{
IGraphBuilder *pGraph;
IMediaControl *pMediaControl;
IMediaEvent *pEvent;
CoInitialize(NULL);

// Create the filter graph manager and query for interfaces.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

// Build the graph. IMPORTANT: Change string to a file on your system.
pGraph->RenderFile(L"C:\\Example.avi", NULL);

// Run the graph.
pMediaControl->Run();

// Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);

// Clean up.
pMediaControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}


Am Anfang wird, wie ich es verstehe, ein Object mittels CoCreateInstance erstellt.

Wie kann ich das unter Xbase anstellen? Gibt es hierzu einen Dll-Aufruf?

Werden danach mit Queryinterface DLL-Funktionen aufgerufen? Oder sind das die methoden der Objekte?

Kann man auch das irgendwie in Xbase implementieren?

Bin für jegliche Anregung sehr dankbar.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: DirectX - in Xbase

Beitrag von AUGE_OHR »

hi,
uli_soehnel hat geschrieben: ich möchte versuchen, unter Xbase einen DirectX-Videoplayer
Du warst nicht auf der Devcon 2007 in Berlin ? Dort hättest du meinen
WMPlayer sehen können :)

Deine Idee mit DirektX kannst du dir mit dem AMOVIE.OCX ansehen.
Dieser basiert noch auf dem WMP v6.4.

ABER : ab VISTA kommst du nicht mehr an DirectShow() etc. ran da
das, so wie ich das sehen, durch die neuen .NET LIB gehen aber vorher
durch die DRM Prüfungen ...

Wenn du also wirklich einen Video Player selbst programmieren willst
solltest du WMP (Windows Media Player) ab v9.x verwenden. Alternative
kann du auch VLC verwenden.

p.s. in der Wissensbasis hier im Forum hab ich beschrieben wie man mit
dem WMP v6.4 arbeitet. Die Routine kannst du auch für das AMOVIE.OCX
benutzten wenn du die CLSID (z.Z. nicht zur Hand) einsetzt.
gruss by OHR
Jimmy
uli_soehnel
Rookie
Rookie
Beiträge: 13
Registriert: Mi, 16. Jan 2008 10:44
Wohnort: Schwäbisch Gmünd

Beitrag von uli_soehnel »

Hallo Jimmy,

danke für Deine Antwort. Deine entsprechenden Beiträge habe ich schon vor längerem gelesen. Ich habe auch selbst damit experimentiert, fand die Ergebnisse aber nicht gerade gut. (zumindest für unsere Anforderungen)
Die besten Player, die ich in unserer Branche gesehen habe, setzten auf DirectX auf. Auch, dass dies unter Vista eventuell nicht mehr verfügbar sein wird, ist mir zunächst egal, da unsere Anwendung zunächst und so lange es irgendwie geht auf XP prof. aufgesetzt sein wird.

Was wir benötigen, ist

1. das Wiedergeben von gerippten .VOB Dateien von einem Server
2. ultraschnelle Umschaltzeiten von Film zu Film
3. exaktes Anspringen von Szenen, die durch einen Zeitpunkt vorgegeben sind
4. Wiedergabegeschwindigkeiten von Zeitlupe bis mindestens 8-fach, und das möglichst fließend

Wir haben auch schon lange mit VLC gearbeitet und setzen diesen Player innerhalb unserer Anwendung ein, um einen Multicaststream, welcher aus 4 Filmen, die gleichzeitig in einem Fenster dargestellt werden, wiederzugeben. Wenn wir VLC für unseren Hauptplayer über ActiveX einsetzen, zeigen sich permanent Probleme, dass die Anwendung ohne einen spezifischen Fehler abbricht. Dies passiert meist dann, wenn man nacheinander einen Film stoppt und den nächsten wiedergibt. Je öfter man das macht, desto wahrscheinlicher wird ein Abbruch. Eventuell verträgt sich die ActziveX-Schnittstelle nicht so gut mit XBase.

Was für uns sehr wünschenwert wäre, ist ein variabler Cache-Wert für den Film. Beim Anspielen des Films ein sehr kleiner Cachewert von ca. 50 ms, der sich dann sehr schnell auf einen Wert von 300 ms verändert. Hierdurch erreichen wir schnelle Umschaltzeiten.

Ebenso wünschenwert wäre, von Filmen, die wahrscheinlich als nächste abgespielt werden sollen, schon vorab einen Cache aufzubauen.

Wahrscheinlich bin ich selbst zu blöde, um das alles zu realisieren, aber es wäre einen Versuch Wert gewesen. Vielleicht benötigen wir auch professionelle Unterstützung von jemandem, der damit Erfahrung hat. Manchmal muss man das Rad nicht nochmal erfinden, sondern kauft sich lieber ein fertiges Rad.

Aktuell arbeiten wir mit PowerDVD, welcher relativ schnelle Umschaltzeiten zum nächten und letzten Film der Playliste hat, da er vermutlich vorpuffert. Wenn man allerdings einen beliebigen Film der Playliste anwählt, dauert es ca. 2 Sekunden. Außerdem haben wir keine sehr gute Schnittstelle zu PowerDVD.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
uli_soehnel hat geschrieben: 1. das Wiedergeben von gerippten .VOB Dateien von einem Server
2. ultraschnelle Umschaltzeiten von Film zu Film
3. exaktes Anspringen von Szenen, die durch einen Zeitpunkt vorgegeben sind
4. Wiedergabegeschwindigkeiten von Zeitlupe bis mindestens 8-fach, und das möglichst fließend
ad 1.) VOBs sind kein Problem wenn man den richtigen Codec hat
ad 2.) naja wenn ich von einer Scene zur nächsten springe hat das noch
keiner gemerkt.
ad 3.) grundsätzlich bis zu 1/25 bzw 1/29.97 also jeder einzelne Frame
ad 4.) Zeitlupe auch kein Problem aber "echtes" Fastforward geht IMHO
nur bis 4-fach. Alles was danach kommt lässt Bilder "weg".
Ich habe für "schnelleres" vorspulen so eine Art Slide-show gemacht
uli_soehnel hat geschrieben: Wir haben auch schon lange mit VLC gearbeitet und setzen diesen Player innerhalb unserer Anwendung ein, um einen Multicaststream, welcher aus 4 Filmen, die gleichzeitig in einem Fenster dargestellt werden,
Frage : mit TON ?
Die "Tombola" der Devcon wurde mit einem Split-4-Screen versehen
was leider auf der von Alaska gelieferten DVD fehlt.
uli_soehnel hat geschrieben: wiederzugeben. Wenn wir VLC für unseren Hauptplayer über ActiveX einsetzen, zeigen sich permanent Probleme, dass die Anwendung ohne einen spezifischen Fehler abbricht. Dies passiert meist dann, wenn man nacheinander einen Film stoppt und den nächsten wiedergibt. Je öfter man das macht, desto wahrscheinlicher wird ein Abbruch. Eventuell verträgt sich die ActziveX-Schnittstelle nicht so gut mit XBase.
Das ist mit einer der Gründe warum ich leider den VLC nicht so oft
verwenden kann (obwohl ich ihn besser finde). Ich bekomme von VLC
einfach nicht die "Rückmeldungen" die man in solchen Fällen bräuchte.
uli_soehnel hat geschrieben: Was für uns sehr wünschenwert wäre, ist ein variabler Cache-Wert für den Film. Beim Anspielen des Films ein sehr kleiner Cachewert von ca. 50 ms, der sich dann sehr schnell auf einen Wert von 300 ms verändert. Hierdurch erreichen wir schnelle Umschaltzeiten.

Ebenso wünschenwert wäre, von Filmen, die wahrscheinlich als nächste abgespielt werden sollen, schon vorab einen Cache aufzubauen.
sowas ähnliches hatte ich auch für die Cutter Lösung vorgesehen, aber
das geht nicht (weder WMP noch VLC) weil die eben immer nur 1 Datei
laden und ausgeben können.
uli_soehnel hat geschrieben: Aktuell arbeiten wir mit PowerDVD, welcher relativ schnelle Umschaltzeiten zum nächten und letzten Film der Playliste hat, da er vermutlich vorpuffert. Wenn man allerdings einen beliebigen Film der Playliste anwählt, dauert es ca. 2 Sekunden. Außerdem haben wir keine sehr gute Schnittstelle zu PowerDVD.
wie ihr das überhaupt macht ist mir immer noch nicht ganz klar, vor allem
wie ihr es schafft 2 oder mehr "Player" gleichzeitig laufen zu lassen.

Die von mir angedeutete Split-4-Screen Lösung wurde mittel AVISynth
realisiert. Hierzu ist es jedoch erforderlich zunächt die VOB Dateien zu
analysieren und dann ein Script zu Schreiben (wird bei mir generiet).
Das Script übergebe ich dann direkt an WMP v6.4 (Directshow) oder
mache mit "MakeAVS" einen AVI Container der dann von so ziemlich
jeden Player "gefressen" wird.
gruss by OHR
Jimmy
uli_soehnel
Rookie
Rookie
Beiträge: 13
Registriert: Mi, 16. Jan 2008 10:44
Wohnort: Schwäbisch Gmünd

Beitrag von uli_soehnel »

Hallo Jimmy,

danke für Deine ausführliche Antwort.
Zwischenzeitlich haben wir es mal zurückgestellt einen eigenen Player zu schreiben. Dafür bin ich wahrscheinlich zu blöde.

Nochmal zu PowerDVD. Wir verwenden gleichzeitig nur 1 Instanz von PowerDVD, nicht mehrere. Was wir aber gleichzeitig zu PowerDVD verwenden, ist ein VLC-Fenster über Activex, welches unseren Multicaststream darstellt. (Wir können den Multicast mit oder ohne Ton erzeugen. Mit macht aber keinen Sinn.) Wenn Du den Source hierzu benötigst, schreib mir ein private Mail.

Nochmal zu PowerDVD. Es ist eigentlich recht einfach, PowerDVD auch ohne offengelegte Schnittstelle zu steuern. Wir verwenden hauptsächlich die Buchstabenkommandos, welche wir über sendmessage an das PowerDVD Fenster senden. Informationen, die wir von PowerDVD benötigen, also aktuell gespielter Titel, aktuelle Position etc. lesen wir aus den PowerDVD-Fenstern aus.
PowerDVD ist fpr unsere Belange immer noch der mit Abstand beste Player, vor allem extrem schnell und ein super Bild beim spulen. Das einzige Handicap ist das langsame Umschalten zu irgendeinem Film innerhalb der Playliste. Das liegt aber einzig und allein daran, dass PowerDVD nach Eingabe einer Ziffer über die Tastatur wartet, ob eine weitere Ziffer eingegeben wird.

Hierzu suchen wir momentan einen Crack, der unter Umständen im disassemblierten Assemblercode die Wartezeit findet und ändern kann. Aber ich weiss nicht so genau, wo ich solche Leute finden kann.

Wenn Du irgendwelche Infos zur Steuerung von PowerDVD benötigst, melde Dich einfach.

Gruß Uli
Antworten