Video abspielen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von KaskadekingDE.

    Nein. Schlicht und ergreifend nein. Es ist ein uralter, total eingeschränkter, schlecht designter und kaum verwendbarer Dreck.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Deine gesamte Aussage von vorhin und die falsche Aussage von gerade eben. Aber wahrscheinlich liegst du als alter Multimedia-(und allem anderen)Experte richtig.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Aber ich habe meine Aussagen doch belegt!
    Ich verlinke ja auf einen solchen portablen Mediaplayer, der auf allen Windowsen ohne Zusatzinstallation lauffähig ist.
    Wie also kannst du das verneinen?

    Allenfalls könntest du meine annere Teil-Aussage verneinen, dass mci das einzige ist, was solch kann.
    Dazu müsstest du aber eine annere Multimedia-Technologie anführen, mit der ebenfalls ein Mediaplayer gecodet werden kann, der ohne Zusatzinstallation auf allen Windowsen lauffähig ist.
    Kannst du eine solche Technologie anführen?
    Als Ausgabetarget wird ein Win32Window benötigt, in WPF fällt MCI damit also schonmal aus (und ja, hier ist WPF gefordert, falls das keinem aufgefallen ist).
    Eigentlich ist die ganze API selbst ein Nachteil, denn von objektorientiertem Programmieren, wie man es unter DirectX vorfindet, kann hier nicht die Rede sein. Stattdessen werden die Befehle in Stringform gesendet, das denkbar schlechteste API-Design überhaupt, selbst aus Sicht von C. In Folge dessen ist die Performance nicht unbedingt das gelbe vom Ei, schnelles Spulen z.B. verursacht auch auf meinem mehr oder weniger guten PC Laggs. Dazu kommt, dass seit Windows Vista und der Einführung des DWM MCI keine gute Bildqualität mehr liefert, denn skaliert wird nicht mehr bikubisch sondern mittels Nearest Neighbour.
    Noch suche ich immer noch nach der besten Lösung ;) Ich hab jetzt nur temporär eine Lösung gefunden die aber auch nicht so schön ist.

    Für das MediaFoundation hab ich noch keine .NET Beispiele gefunden. Wenn die Performance von MCI wirklich nicht so gut ist dann warte ich lieber ab.
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Wie ich das kann? Ganz einfach. Das Teil funktioniert zwar in deinem minimalistischem Beispiel. Fliegt dir jedoch schneller um die Ohren als du kucken kannst. Vom äußerst eingeschränkten funktionsumfang mal abgesehen. Alternativen? Alles was nach der Jahrtausendwende geschrieben wurde. Zum Beispiel mediafoundation, directshow, dmo,... oder etwas höheres über wasapi usw.
    Und wenn man nur eine simple wiedergabe braucht reicht auch die mediaplayer klasse welche zum einen mehr kann und zum anderen wesentlich sauberer programmiert ist. Alles besser als der uralte verbuggte mist.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Wie gesagt: Alle deine Alternativen müssen extra installiert werden, während mci OnBoard ist.
    Ich will jetzt auch garnet mci als iwas dolles anpreisen, nur es ohne jede inhaltliche Begründung als "Dreck" zu verunglimpfen geht mir gegen den Strich (dasses alt ist, ist keine inhaltliche Begründung, alt ist nicht automatisch "Dreck").
    Gugge Artentus' Post - so stelle ich mir eine Argumentation vor, wenn man von was abraten möchte.
    Der Media-Player sei besser programmiert - konntest du den Code einsehen?
    Meinen mci-Wrapper hab ich jdfs. v.a. deshalb geschrieben, weil der mediaplayer so monströs viel Resource frisst.
    Also Artentus hat ganz recht mit den bescheuerten String-Befehlen der mci-Schnittstelle: das muss man wrappern, wenn man OOP proggt - und der Wrapper ist dann OOP.
    Ob OOP oder nicht ist ja erstmal nicht so Schlimm, aber mit Strings zu arbeiten ist/war schon immer der Falsche weg für Scnittstellen u.ä.
    Die MediaFoundation ist glaub ich seit Vista vorinstalliert. Nur der Entwickler muss etwas nachinstallieren(was eher die Norm ist). DirectX 8.0 dürfte seit XP drauf sein und somit steht auch DirectShow zur Verfügung. Hier müssen nur die Wrapper mitgeliefert werden(was einfach wieder .Net spezifisch ist).
    Wasapi ebenfalls Vista. DMO hab ich jetzt keine Ahnung und hab ich auch noch nie benutzt.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Von der Verwendung her ist mciSendString absolut vermurkst.

    Artentus schrieb:

    denn von objektorientiertem Programmieren, wie man es unter DirectX vorfindet

    DirectX ist fast ähnlich schlimm aufgebaut bzw. allgemein COM. Aber Strings zu senden ist noch deutlich schlimmer. Mit API's zu werkeln die Fensterhandle betreffen sollte man in WPF lassen, da ist fast alles an API schon verbaut. Wär auch irgendwie blöd in ner Anwendung die mit DX gerendert wird etwas anderes als DX zum Video rendern zu nutzen. DirectX ist also OnBoard.

    ErfinderDesRades schrieb:

    (dasses alt ist, ist keine inhaltliche Begründung, alt ist nicht automatisch "Dreck").

    Sehe ich auch so. Zu 90% ist sogar Älteres deutlich besser.

    ErfinderDesRades schrieb:

    Wie gesagt: Alle deine Alternativen müssen extra installiert werden, während mci OnBoard ist.

    Falsch. Du musst rein gar nichts "extra installieren". Und wie gesagt. Eine Media-API die string basiert, buggy und rein überhaupt nicht erweiterbar ist und den Benutzer in den Möglichkeiten kaum noch mehr einschränken könnte... naja. Was soll ich sagen? Zudem nochmal... es geht um WPF.
    Zu der Aussagen, dass alt nicht automatisch Dreck ist -> stimmt. Bei etwas das jedoch sowas von hoffnungslos veraltet ist, trifft diese Aussage sehr wohl zu. Und mci ist veraltet. Und auch wenn du dich bei rein gar allem als Experte fühlst so kann ich dir garantieren, dass dir mci im null komma nix um die Ohren fliegt und dich zudem dermaßen einschränkt, dass du es mit WPF gar nicht verwenden kannst. Außerdem fehlt dir meiner Meinung nach (um es mal auf den Punkt zu bringen) einfach eine Argumentationsbasis. Wie willst du über Vor- und Nachteile von Technologien diskutieren ohne diese zu kennen noch irgendwelche relevanten Erfahrungswerte vorweisen zu können (nein, deine zahlreichen Kreationen zu allem Möglichen zähle ich nicht zwingend zu Erfahrungwerten). PS: Mediafoundation muss auch der Entwickler nix installieren.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „thefiloe“ ()

    Könnt ihr auch mal wieder auf das Thema zurück kommen? ;)

    Ich hab das hier gefunden: rolandk.de/wp/2014/01/einfache…ndows-media-foundation-2/
    Aber das Problem ist dass da ein Steuerelement was ich nicht in WPF verwenden kann. Ich hab schon ein WindowsFormsHost jedoch muss ich auf ein Objekt von dort zugreifen.

    Die Klasse die im WindowsFormHost verwendet wird:

    Spoiler anzeigen

    C#-Quellcode

    1. public partial class MediaPlayer : UserControl
    2. {
    3. public MediaPlayer()
    4. {
    5. InitializeComponent();
    6. MFMediaPlayer mf_player = new MFMediaPlayer(); // MFMediaPlayer erbt von System.ComponentModel.Component und IDisposable
    7. }
    8. }



    Der Code der verwendet werden soll:

    Spoiler anzeigen

    C#-Quellcode

    1. private async void play_music_file_Click(object sender, EventArgs e)
    2. {
    3. // ...
    4. string sourceVideoFile = ofd.FileName;
    5. await xxx.OpenAndShowVideoFileAsync(sourceVideoFile);
    6. }



    Wie kann ich nun von MediaPlayer auf mf_player zugreifen?
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Ich habs jetzt so hinbekommen. Ist das richtig so? (Außer den Variablen-Namen)

    C#-Quellcode

    1. public class m_MediaPlayer
    2. {
    3. public MFMediaPlayer mediaPlayer = new MFMediaPlayer();
    4. public m_MediaPlayer(MFMediaPlayer mediaPlayer)
    5. {
    6. this.mediaPlayer = mediaPlayer;
    7. }
    8. }


    MainWindows.xaml.cs:

    C#-Quellcode

    1. MFMediaPlayer my_player = new MFMediaPlayer();
    2. MediaPlayer mp_targetControl = new MediaPlayer();
    3. public MainWindow()
    4. {
    5. InitializeComponent();
    6. Loaded += MainWindows_Loaded;
    7. Closing += MainWindow_Closing;
    8. WFH_Player.Child = mp_targetControl;
    9. }
    10. private async void cmd_music_play_Click(object sender, RoutedEventArgs e)
    11. {
    12. m_MediaPlayer test = new m_MediaPlayer(my_player);
    13. test.mediaPlayer.TargetControl = mp_targetControl;
    14. await test.mediaPlayer.OpenAndShowVideoFileAsync(currentMusicFile);
    15. }

    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Nein das ist nicht richtig. Das mag zwar funktionieren aber ich kann einfach nicht sagen, dass das richtig ist. Die Klasse "m_MediaPlayer" ist komplett überflüssig. Der Name der Klasse ist fast das schlimmste das ich je gesehen habe. Dazu ein "public" Feld in der Klasse mit zudem auch falschen Namen. Namensgebung von cmd_music_play_Click Methode lässt mich ebenfalls zusammenzucken. Der Inhalt der Methode macht rein gar keinen Sinn. Weshalb sollte man die MFMediaPlayer Klasse sinnlos kapseln?
    Von der Tatsache, dass du das hässliche Codebehind anstatt ViewModel Bindings verwendest sehe ich mal ab.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Die Klasse "m_MediaPlayer" ist komplett überflüssig. Der Name der Klasse ist fast das schlimmste das ich je gesehen habe

    Gut hab ich entfernt. Wie hätte ich es denn nennen sollen?

    thefiloe schrieb:

    Namensgebung von cmd_music_play_Click Methode lässt mich ebenfalls zusammenzucken

    Ich weiß das es sowas wie Nameing Guidelines gibt aber du musst ja damit nicht mit meinen Namensgebungen auskommen, oder?

    thefiloe schrieb:

    Von der Tatsache, dass du das hässliche Codebehind anstatt ViewModel Bindings verwendest sehe ich mal ab.


    Und welcher Eigenschaft soll ich dieses Binding dann zuweisen?
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Die Guidelines findest du hier: msdn.microsoft.com/en-us/library/ms229042.aspx
    Ein ViewModel wird für normal der DataContext Eigenschaft zugewiesen und ersetzt das komplette Codebehind (MainWindow.xaml.cs bleibt bis auf den Konstruktor leer).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    So hab mich jetzt ein bisschen in MVVM reingelesen. Leider sind die Beispiele die ich gefunden habe schlecht bzw. gar nicht kommentiert oder es werden Klassen verwendet die nirgendswo im Tutorial definiert sind ?(

    Gibt es ein halbwegs gutes Tutorial welches du mir empfehlen kannst oder muss ich selber weitersuchen?
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯