【问题标题】:Pause Mediaelement in Windowos phone 8 if user navigates to the other app or homescreen如果用户导航到其他应用程序或主屏幕,则暂停 Windowos phone 8 中的 Mediaelement
【发布时间】:2013-09-06 09:28:52
【问题描述】:

我开发了使用带有远程 url 的 MediaElement 播放视频的应用程序。一切正常,视频播放也很好。

但我面临的问题是,如果用户正在播放视频并且用户触摸了手机上的 windows 按钮。然后我的应用程序进入后台并显示主屏幕。现在在主屏幕上,用户触摸后退按钮。我的应用程序被带到前台,视频从头开始加载。无论如何我可以暂停 mediaelement 以便当用户回到我的应用程序时视频可以恢复。

还有一件事是我无法使用 MediaLauncher,因为我想在用户与媒体控件(例如播放/暂停)交互时记录一些事件。

请大家在这个场景中指导我。

谢谢。

【问题讨论】:

    标签: windows-phone-8 windows-phone


    【解决方案1】:

    您可以通过 ActivationPolicy 属性恢复您的应用程序到 DefaultTask 元素 inActivationPolicy 属性到 DefaultTask 元素在 WMAppManifest.xml 中并将值设置为“Resume”。对于此任务,您需要直接编辑应用清单,而不是使用清单编辑器。为此,请右键单击 WMAppManifest.xml,单击打开方式,然后选择 XML(文本)编辑器。

    可以为 XAML 应用、Direct3D 应用和带有 XAML 应用的 Direct3D 启用 For Resume。以下示例显示 DefaultTask 元素将如何查找 XAML 应用和 Direct3D 应用。

    <DefaultTask Name="_default" NavigationPage="MainPage.xaml" ActivationPolicy="Resume"/>
    
    <DefaultTask Name="_default" ImagePath="PhoneDirect3DApp1.exe" ImageParams=""  ActivationPolicy="Resume"/>
    

    app resume for Windows Phone 8

    app resume backstack sample

    如果这对您没有帮助,您可以像下面的代码一样手动播放并停止您的视频播放器

    XAML

    <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="0.90*"/>
                <RowDefinition Height="0.10*"/>
            </Grid.RowDefinitions>
            <SSME:SmoothStreamingMediaElement x:Name="video" Grid.Row="0" />
            <!--TitlePanel contains the name of the application and page title-->
    
            <StackPanel Orientation="Horizontal" Grid.Row="1">
    
                <Button   x:Name="PlayButton" Width="150" Click="PlayButton_Click"  Loaded="PlayButton_Loaded"/>
                <Button   x:Name="StopButton" Content="Stop" Width="100" Click="StopButton_Click" />
    
                <TextBlock x:Name="status"/>
                <TextBlock x:Name="currentBitrate"/>
    
            </StackPanel>
    
            <!--ContentPanel - place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>
        </Grid>
    

    C# 代码:

     public partial class VIdeoStraming : PhoneApplicationPage
        {
            string VideoUrl,StreamingUrl;
            public VIdeoStraming()
            {
                InitializeComponent();
            }
    
            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
                VideoUrl = this.NavigationContext.QueryString["parameter0"];
                string Manifest="/Manifest";
                StreamingUrl = VideoUrl + Manifest;                     
            }
    
            private void PlayButton_Click(object sender, RoutedEventArgs e)
            {
                //Monitor the state of the content to determine the right action to take on this button being clicked
                //and then change the text to reflect the next action
                switch (video.CurrentState)
                {
                    case SmoothStreamingMediaElementState.Playing:
                        video.Pause();
                        PlayButton.Content = "Play";
                        break;
                    case SmoothStreamingMediaElementState.Stopped:
                    case SmoothStreamingMediaElementState.Paused:
                        video.Play();
                        PlayButton.Content = "Pause";
                        break;
                }
            }
    
            private void PlayButton_Loaded(object sender, RoutedEventArgs e)
            {
                switch (video.AutoPlay)
                {
                    case false:
                        PlayButton.Content = "Play";
                        break;
                    case true:
                        PlayButton.Content = "Pause";
                        break;
                }
            }
    
            private void StopButton_Click(object sender, RoutedEventArgs e)
            {
    
                //This should simply stop the playback
    
                    video.Stop();
                    //We should also reflect the chang on the play button
                    PlayButton.Content = "Play";
    
            }
    
            private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
            {
    
                video.CurrentStateChanged += new RoutedEventHandler(video_CurrentStateChanged);
                video.PlaybackTrackChanged += new EventHandler<Microsoft.Web.Media.SmoothStreaming.TrackChangedEventArgs>(video_PlaybackTrackChanged);
                //video.SmoothStreamingSource = new Uri("http://64.120.251.114:1945/live/sharedobjects/layoutvideo/mp4:1311370468970.MP4/Manifest");
                video.SmoothStreamingSource = new Uri(StreamingUrl);
                video.ManifestReady += new EventHandler<EventArgs>(video_ManifestReady);
            }
    
            //when use in mobile device
            void video_ManifestReady(object sender, EventArgs e)
            {
                SmoothStreamingMediaElement ssme = sender as SmoothStreamingMediaElement;
    
                if (ssme == null)
                {
                    return;
                }
    
                // Select the highest band of tracks which all have the same resolution.
                // maxMobileBitrate depends on the encoding settings
                const ulong maxMobileBitrate = 1000000;
                foreach (SegmentInfo segment in ssme.ManifestInfo.Segments)
                {
                    foreach (StreamInfo streamInfo in segment.AvailableStreams)
                    {
                        if (MediaStreamType.Video == streamInfo.Type)
                        {
                            List<TrackInfo> widestBand = new List<TrackInfo>();
                            List<TrackInfo> currentBand = new List<TrackInfo>();
                            ulong lastHeight = 0;
                            ulong lastWidth = 0;
                            ulong index = 0;
    
                            foreach (TrackInfo track in streamInfo.AvailableTracks)
                            {
                                index += 1;
    
                                string strMaxWidth;
                                string strMaxHeight;
                                // If can't find width/height, choose only the top bitrate.
                                ulong ulMaxWidth = index;
                                // If can't find width/height, choose only the top bitrate.
                                ulong ulMaxHeight = index;
                                // V2 manifests require "MaxWidth", while v1 manifests used "Width".
                                if (track.Attributes.TryGetValue("MaxWidth", out strMaxWidth) ||
                                    track.Attributes.TryGetValue("Width", out strMaxWidth))
                                {
                                    ulong.TryParse(strMaxWidth, out ulMaxWidth);
                                }
    
                                if (track.Attributes.TryGetValue("MaxHeight", out strMaxHeight) ||
                                    track.Attributes.TryGetValue("Height", out strMaxHeight))
                                {
                                    ulong.TryParse(strMaxHeight, out ulMaxHeight);
                                }
    
                                if (ulMaxWidth != lastWidth ||
                                    ulMaxHeight != lastHeight)
                                {
                                    // Current band is now finished, check if it is the widest.
                                    // If same size, current band preferred over previous
                                    // widest, because it will be of higher bitrate.
                                    if (currentBand.Count >= widestBand.Count)
                                    {
                                        //  A new widest band:
                                        widestBand = currentBand;
                                        currentBand = new List<TrackInfo>();
                                    }
                                }
    
                                if (track.Bitrate > maxMobileBitrate)
                                {
                                    break;
                                }
    
                                // Current track always gets added to current band.
                                currentBand.Add(track);
                                lastWidth = ulMaxWidth;
                                lastHeight = ulMaxHeight;
                            }
    
                            if (0 == widestBand.Count &&
                                0 == currentBand.Count)
                            {
                                // Lowest bitrate band is > maxMobileBitrate.
                                widestBand.Add(streamInfo.AvailableTracks[0]);
                            }
                            else if (currentBand.Count >= widestBand.Count)
                            {
                                // Need to check the last band which was constructed.
                                Debug.Assert(currentBand.Count > 0);
                                widestBand = currentBand; // Winner by default.
                            }
    
                            Debug.Assert(widestBand.Count >= 1);
                            streamInfo.RestrictTracks(widestBand);
                        }
                    }
                }
    
            }
            void video_PlaybackTrackChanged(object sender, Microsoft.Web.Media.SmoothStreaming.TrackChangedEventArgs e)
            {
                currentBitrate.Text = e.NewTrack.Bitrate.ToString();
            }
    
            void video_CurrentStateChanged(object sender, RoutedEventArgs e)
            {
                status.Text = video.CurrentState.ToString();
            }
    
            private void imghdrleft_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                NavigationService.GoBack();
            }
    
            private void imghdrright_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                NavigationService.Navigate(new Uri("/Planet41VIew/Settings.xaml", UriKind.RelativeOrAbsolute));
            }
        }
    

    【讨论】:

    • 嗨 Manish 我做了以下代码更改 仍然无法正常工作。我应该添加以下行而不是上面的行
    • 怎么可能bcos这篇文章是由msdn给出的,我也用这个东西,它在我的应用程序中可以正常工作
    • 什么是 SSME,因为我正在使用 mediaelement。我的主要问题是当用户离开我的应用程序时如何暂停 mediaelement。我想从它离开的地方开始播放视频。
    • 我只是给你演示了如何手动摆姿势视频,SSME 就像美狄亚元素一样视频。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多