0

ユーザーがページを移動しても音楽が止まらないように、アプリケーション レベルでバックグラウンド ミュージックを実行するアプリがあります。ただし、VideoBrush も使用します。ソースを設定するときに VideoBrush がクラッシュするため、2 つを同時に実行することはできません。

ユーザーが 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.
        }
    }
4

2 に答える 2

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

古い質問ですが、これが誰かの助けになることを願っています...それを理解するのに数回の試行が必要でした。

于 2013-12-19T18:33:58.280 に答える