2016-04-21 22 views
1

Mein Programm sollte ein Video abspielen, wenn der Benutzer die 'Play'-Taste drückt. Während dies normalerweise geschieht, wird beim ersten Drücken des "Play" -Knopfes nichts passieren.'MediaElement.SetSource()' wird nicht konsistent aktualisiert

ich auf den folgenden Code verfolgt habe diese Fehler zurück, die mein Media ‚VideoPlayer-‘ setzt:

public void playVideo_Tapped(object sender, TappedRoutedEventArgs e) 
{ 
    setUpVideo(); 
    VideoPlayer.Play(); 
} 

public async void setUpVideo() 
{ 
    if(vm == null) return; 
    StorageFile videoFile = vm.videoFile; 

    if (videoFile == null || !videoFile.ContentType.Equals("video/mp4")) return; 

    using (IRandomAccessStream fileStream = await videoFile.OpenAsync(FileAccessMode.Read)) 
    { 
     VideoPlayer.SetSource(fileStream, videoFile.ContentType); 
    } 
} 

Der Täter scheint am Ende die ‚SetSource()‘ Methode. Die einzige Variable, die sich vom ersten Klick von "Play" zum nächsten ändert, ist die Variable "VideoPlayer.PlayToSource", die von null auf einen realen Wert geändert wird.

(Als Randbemerkung, die Variable ‚VideoPlayer.CurrentState‘ ändert sich auch von ‚Geschlossen‘ auf ‚Öffnen‘, sondern setzt sich auf ‚geschlossen‘ vor dem zweiten Klick. Nur ‚PlayToSource‘ ändert die Funktionalität.)

ich dachte, dass ich, indem sie diese in meinem ersten Verfahren eine schnelle Lösung tun könnte:

setUpVideo(); 
    setUpVideo(); 
    VideoPlayer.Play(); 

Nicht groß Code, aber es sollte die Dinge richtig stellen, nicht wahr? Nee! Dies verursacht eine NullReferenceException. Beim zweiten Aufruf von 'setUpVideo()' finde ich, dass 'PlayToSource' immer noch einen Wert hat und 'VideoPlayer.CurrentState' immernoch auf 'Öffnen' eingestellt ist, was irgendwie die NullReferenceException auslöst.

Ich erwarte die Lösung eines der folgenden Dinge zu sein:

1.) ‚VideoPlayer.PlayToSource‘ auf dem ersten Klick vor ‚SetSource‘ aufrufen.

2.) Setzen Sie in der Schnelleinstellung "VideoPlayer.CurrentState" zwischen den Aufrufen auf "Geschlossen" zurück.

3.) Eine andere Sache, die imitiert, was der erste Klick tut.

Natürlich beinhalten beide meine Ideen, eine schreibgeschützte Variable zu ändern. Wo bleibe ich stecken. Ich werde den XAML-Code für eine gute Maßnahme umfassen, aber ich bin zuversichtlich, dass es die Methode ‚SetSource‘ ist, dass die Wurzel meiner Probleme ist:

<Grid x:Name="VideoViewerParentGrid" Background="DarkGreen" Height="{Binding VideoViewerParentGridHeight }" Width="{Binding VideoViewerParentGridWidth}"> 
    <MediaElement x:Name="VideoPlayer" HorizontalAlignment="Center" VerticalAlignment="Bottom" Stretch="Uniform" 
        Visibility="{Binding VideoVisibility, Converter={StaticResource visibilityConverter}}"/> 
    <Button Style="{StaticResource BackButtonStyle}" Tapped="VideoViewerClose_Tapped" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    <Button Name="Play_Button" Content="Play Video" FontSize="26" Tapped="playVideo_Tapped" 
      VerticalAlignment="Top" HorizontalAlignment="Left" Height="60" Width="180" Margin="0,80,0,0"/> 
</Grid> 

---- ---- UPDATE

Etwas mehr Stochern hat ergeben, dass 'VideoPlayer.CurrentState' beim ersten Klick niemals den Status 'Playing' erreicht, sondern von 'Opening' wieder zurück zu 'Closed' geht. Bei nachfolgenden Klicks wird dies nicht ausgeführt, solange das Programm ausgeführt wird. Untersucht immer noch die Ursache dafür.

Antwort

0

Kurzversion, dieses Problem durch eine Änderung dieses Problem behoben ist:

using (IRandomAccessStream fileStream = await videoFile.OpenAsync(FileAccessMode.Read)) 
{ 
    VideoPlayer.SetSource(fileStream, videoFile.ContentType); 
} 

... um dies:

IRandomAccessStream fileStream = await videoFile.OpenAsync(FileAccessMode.Read); 
VideoPlayer.SetSource(fileStream, videoFile.ContentType); 

Längere Version, mein Code versagte wegen des Fehlers "mf_media_engine_err_src_not_supported hresult - 0xc00d36c4", der mein MediaElement geschlossen hat, anstatt es abzuspielen. Dies geschah, weil, wenn ich den 'using' -Block des Codes verließ, der 'IRandomAccessStream' mitten in meinem Lesen der Datei schließen würde.Ich bin nicht 100% ig klar, warum es nach dem ersten Durchlauf des Codes durch die ganze Sache kommt, aber zumindest funktioniert es jetzt zuverlässig.

Ich habe auch Kredit zu geben, wem Ehre gebührt, und ich fand diese Antwort hier: Windows 8 app - MediaElement not playing ".wmv" files

0

Sie vermissen das Schlüsselwort "erwarten". Tun Sie dies: -

await setUpVideo(); 
+0

ich es zugegeben, aber leider überhaupt keine Veränderung gibt es, wie es funktioniert. –