wp7,一旦停止,Global MediaElement将不会重启

时间:2013-04-09 00:45:59

标签: c# silverlight windows-phone-7 xaml windows-8

我有一个在应用程序级别运行背景音乐的应用程序,这样当用户浏览页面时音乐不会停止。但是,我也使用了VideoBrush。正如我发现的那样,我不能让两者同时运行,因为VideoBrush在设置源时会崩溃。

我发现如果我在用户尝试使用VideoBrush时将MediaElement的源设置为null,那么一切正常。当然音乐会停止,这让我很懊恼,但没有错误发生。

但是,当用户点击VideoBrush时,我试图让音乐重新开始(开始很好)无济于事。简而言之,我无法重新启动音乐。

这是我的代码:

的App.xaml

    <Application.Resources>

        <MediaElement x:Key="GlobalMedia" Source="minutelongsong.mp3"
         MediaEnded="MediaElement_MediaEnded" Visibility="Collapsed" />

    </Application.Resources>

App.xaml.cs

    public static MediaElement GlobalMediaElement
    {
        get { return Current.Resources["GlobalMedia"] as MediaElement; }
    }

    private void Application_Launching(object sender, LaunchingEventArgs e)
    {
        var AppMediaElement = App.GlobalMediaElement;
        AppMediaElement.Position = TimeSpan.Zero;
        AppMediaElement.Play();
    }

    private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
    {
        var AppMediaElement = App.GlobalMediaElement;
        AppMediaElement.Position = TimeSpan.Zero;
        AppMediaElement.Play();
    }

现在正在使用VideoBrush的页面。

MainPage.xaml中

    <Canvas x:Name="viewfinderCanvas" Width="480" Height="800" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed">
        <Canvas.Background>
            <VideoBrush x:Name="videoBrush" Stretch="Fill">
                <VideoBrush.RelativeTransform>
                    <CompositeTransform x:Name="previewTransform"
                        CenterX=".5"
                        CenterY=".5" />
                </VideoBrush.RelativeTransform>
            </VideoBrush>
        </Canvas.Background>
    </Canvas>

MainPage.xaml.cs中

    private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {

        var AppMediaElement = App.GlobalMediaElement;
        AppMediaElement.Pause();
        AppMediaElement.Stop();
        AppMediaElement.Source = null; //set it to null to allow the cam to be set.


        if ((PhotoCamera.IsCameraTypeSupported(CameraType.Primary)))
        {
           viewfinderCanvas.Visibility = Visibility.Visible;
           cam = new PhotoCamera(CameraType.Primary);
           if (Orientation == PageOrientation.PortraitUp || Orientation == PageOrientation.PortraitDown || Orientation == PageOrientation.Portrait)
           {

               videoBrush.RelativeTransform = new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 90 };
           }

           videoBrush.SetSource(cam);
        }

当用户通过点击屏幕按钮退出相机VideoBrush时,将触发此代码。它配置了凸轮,并且如果用户允许音乐,则尝试再次播放音乐。 但即使使用此代码,音乐也无法播放。

    private void zoomout_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (cam != null)
        {
            cam.Dispose();
        }

        viewfinderCanvas.Visibility = Visibility.Collapsed;

        if (allowingamemusic == true)
        {
            var AppMediaElement = App.Current.Resources["GlobalMedia"] as MediaElement;
            AppMediaElement.Source = new Uri("minutelongsong.mp3", UriKind.RelativeOrAbsolute);
            AppMediaElement.Position = TimeSpan.Zero;
            AppMediaElement.Play(); //despite this here, it will not play. No error thrown.
        }
    }

2 个答案:

答案 0 :(得分:1)

我在手机应用程序的同一页面中捕捉图像和音频之间来回切换。

您非常接近,但您还必须将videoBrush源设置为其他内容,否则它将不会释放资源。

因此,当您想要使用MediaElement时,请首先像这样处理相机:

cam.Dispose();
viewfinderBrush.SetSource(new MediaElement()); //so it will let go of cam
cam = null;
//now set source for MediaElemet and do whatever

当您再次使用相机时:

mediaElement.Stop();
mediaElement.Source = null; //or else setting the source for the video brush will fail
//now set source for videoBrush and do whatever

老问题,但希望这会对某人有所帮助......我花了几次尝试才弄明白。

答案 1 :(得分:0)

在昨晚写完这篇文章,并在今天早上测试之后,我看到可能发生了什么,但是一旦它停止,我仍然没有重播音乐的问题。

MediaElement.MediaFailed是整个时间被调用的。我发现它正在调用:AG_E_NETWORK_ERROR。当Zune运行且我的设备USB连接到同一台计算机时,抛出此错误。

有人建议我将我的应用程序部署到手机上,关闭zune,然后断开USB连接。我试过这个,一旦我试着重播它,音乐仍然没有播放。这也发生在模拟器上。

仍在抛出相同的AG_E_NETWORK_ERROR。

从那时起,我已经放弃了这个,因为我花了几个小时没有找到如何实现这一点。所以,我已经使用了MediaPlayer类,并将使用它。

------如果有人解决了这个问题,我会给你一个正确答案的复选标记。