Die Wiedergabe von großen Dateien auf Windows Media Player während des Herunterladens

StackOverflow https://stackoverflow.com/questions/647501

  •  22-07-2019
  •  | 
  •  

Frage

Meine Frage ist, über eine Videodatei auf die Festplatte zu schreiben, die aus dem Netz heruntergeladen wird und es gleichzeitig mit dem Windows Media Player zu spielen. Die Datei ist ziemlich groß und wird eine Weile dauern, zum Download bereit. Es ist notwendig, um es zu laden, anstatt sie nur direkt auf Windows Media Player zu streamen.

Was passiert, ist, dass, während ich in die Videodatei schreiben kann und es zugleich von meinem eigenen Test-Code lesen, kann sie nicht mit dem Windows Media Player durchgeführt werden (zumindest habe ich es nicht herausgefunden). Ich weiß, dass es möglich ist, zu tun, weil Amazon Unbox Downloads es tut. Unbox können Sie WMVs spielen, während es sie heruntergeladen. Und Unbox ist in .NET geschrieben, so ...

Ich habe die „ C # Datei lesen / schreiben lesen Dateifreigabe nicht erscheint „Fragen und Antworten zum Öffnen einer Datei mit den file~~POS=TRUNC-Flags arbeiten . Aber es funktioniert nicht für mich. Process Monitor sagt, dass Media Player wird die Datei mit Fileshare Flags öffnen, aber es Fehler aus.

In dem Puffer Thread habe ich diesen Code für die Datei aus dem Netz zu lesen und in eine Datei zu schreiben (ohne Fehlerbehandlung oder andere Sachen, um es besser lesbar):

// the download thread
void StartStreaming(Stream webStream, int bufferFullByteCount)
{
    int bytesRead;
    var buffer = new byte[4096];
    var fileStream = new FileStream(MediaFile.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
    var writer = new BinaryWriter(fileStream);
    var totalBytesRead = 0;
    do
    {
        bytesRead = webStream.Read(buffer, 0, 4096);
        if (bytesRead != 0)
        {
            writer.Write(buffer, 0, (int)bytesRead);
            writer.Flush();
            totalBytesRead += bytesRead;
        }
        if (totalBytesRead >= bufferFullByteCount)
        {
            // fire an event to a different thread to tell 
            // Windows Media Player to start playing
            OnBufferingComplete(this, new BufferingCompleteEventArgs(this, MediaFile));
        }
    } while (bytesRead != 0);
}

Das scheint gut zu funktionieren. Die Datei schreibt auf die Festplatte und hat die richtigen Berechtigungen.

Aber dann here die Event-Handler in dem anderen Thread zum Abspielen des Videos zurück

    // the playback thread

private void OnBufferingComplete(object sender, BufferingCompleteEventArgs e)
{
    axWindowsMediaPlayer1.URL = e.MediaFile.FullName;
}

Windows Media Player zeigt an, dass seine Öffnen der Datei und stoppt dann nur mit einem Fehler, dass die Datei nicht geöffnet werden kann „bereits geöffnet in einem anderen Prozess.“

Ich habe alles versucht, ich mir vorstellen kann. Was vermisse ich? Wenn die Amazon Jungs dies tun können dann so kann ich, nicht wahr?

edit: Dieser Code funktioniert mit MPlayer, VLC und Media Player Classic; einfach nicht Windows Media Player oder Windows Media Center-Player. IOW, die einzigen Spieler, die ich sie brauchen, um mit zu arbeiten. igitt!

edit2: Ich ging so weit, MiniHttp zu verwenden, um das Video zu Windows Media Player zu streamen, um zu sehen, ob das würde „täuschen“ WMP in ein Video abgespielt wird, der beim Download wird. Nichts zu machen. Während WMP die Datei öffnet wartete, bis die mpeg-Datei vollständig kopiert wurde, bevor es zu spielen begann. Wie funktioniert es wissen?

EDIT3: Nach einigem Graben entdeckte ich das Problem. Ich arbeite mit MPEG2-Dateien. Das Problem ist nicht unbedingt mit dem Windows Media Player, aber mit dem Microsoft MPEG2 Directshow-Splitter, dass WMP verwendet die MPEG2-Dateien zu öffnen, die ich zur gleichen Zeit zu spielen und downloaden versuchen. Der Splitter öffnet die Dateien in nicht-Shared-Modus. Nicht so bei WMV-Dateien. WMP öffnet sie im Shared-Modus und alles funktioniert wie erwartet.

War es hilfreich?

Lösung

Ich habe beschlossen, meine eigene Frage, falls jemand zu beantworten läuft sonst in diese seltene Situation.

Die kurze Antwort lautet: Windows Media Player (zum Zeitpunkt des Schreibens) eine Datei heruntergeladen werden ermöglicht und so lange in der gleichen Zeit spielen, wie die Funktionalität von CODECS beteiligt Rendern die Datei unterstützt wird

.

Ein Zitat aus dem zuletzt auf die Frage:

Nach einiger Graben entdeckte ich das Problem. Ich arbeite mit MPEG2-Dateien. Das Problem ist nicht unbedingt mit dem Windows Media Player, aber mit dem Microsoft MPEG2 Directshow-Splitter, dass WMP verwendet die MPEG2-Dateien zu öffnen, die ich zur gleichen Zeit zu spielen und downloaden versuchen. Der Splitter öffnet die Dateien in nicht-Shared-Modus. Nicht so bei WMV-Dateien. WMP öffnet sie im Shared-Modus und alles funktioniert wie erwartet.

Andere Tipps

Wenn Sie öffnen Sie die Datei für das Schreiben sollten Sie nicht FileShare.ReadWrite verwenden. Sie sollten stattdessen FileShare.Read verwenden:

var fileStream = new FileStream(
    MediaFile.FullName, FileMode.Create, FileAccess.Write, FileShare.Read);

Wenn mplayer.exe Prozess die Datei zum Lesen öffnen sie zuerst mit FileShare.Read zu öffnen versuchen, die fehlschlagen wird, aber es wird dann mit FileShare.ReadWrite erneut versuchen, die erfolgreich sein wird.

Updated 16 März nach Kommentar von @darin:

Sie spezifizieren FileShare.ReadWrite wenn Sie die Datei schreiben, die theoretisch ein anderer Prozess zum Schreiben zu öffnen es erlaubt.

Versuchen Sie Ihren Code nur Anfrage FileShare.Read Änderung:

var fileStream 
    = new FileStream(
        MediaFile.FullName, 
        FileMode.Create, 
        FileAccess.Write, 
        FileShare.Read); // Instead of ReadWrite

MSDN :

  

FileShare.Read: Ermöglicht die nachfolgende   Öffnen der Datei zum Lesen.

     

FileShare.ReadWrite: Ermöglicht die nachfolgende   Öffnen der Datei zum Lesen oder   Schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top