private void Tts_Resolved(TimedTextSource sender, TimedTextSourceResolveResultEventArgs args) { var ttsUri = ttsMap[sender]; // Handle errors if (args.Error != null) { var ignoreAwaitWarning = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { LoggerControl.Log("Error resolving track " + ttsUri + " due to error " + args.Error.ErrorCode, LogViewLoggingLevel.Error); }); return; } LoggerControl.Log($"Resolved: {ttsUri}"); // Update label manually since the external SRT does not contain it var ttsUriString = ttsUri.AbsoluteUri; if (ttsUriString.Contains("_en")) { args.Tracks[0].Label = "English"; } else if (ttsUriString.Contains("_pt")) { args.Tracks[0].Label = "Portuguese"; } else if (ttsUriString.Contains("_sv")) { args.Tracks[0].Label = "Swedish"; } }
protected override void OnNavigatedTo(NavigationEventArgs e) { // Create the playback item var source = MediaSource.CreateFromUri(rootPage.CaptionedMediaUri); msLogger = new MediaSourceLogger(LoggerControl, source); var playbackItem = new MediaPlaybackItem(source); mpiLogger = new MediaPlaybackItemLogger(LoggerControl, playbackItem); // Turn on English captions by default playbackItem.TimedMetadataTracksChanged += (item, args) => { if (args.CollectionChange == CollectionChange.ItemInserted) { LoggerControl.Log($"TimedMetadataTracksChanged, Number of tracks: {item.TimedMetadataTracks.Count}"); uint changedTrackIndex = args.Index; TimedMetadataTrack changedTrack = playbackItem.TimedMetadataTracks[(int)changedTrackIndex]; if (changedTrack.Language == "en") { playbackItem.TimedMetadataTracks.SetPresentationMode(changedTrackIndex, TimedMetadataTrackPresentationMode.PlatformPresented); } } }; // Set the source to begin playback of the item this.mediaPlayerElement.Source = playbackItem; LoggerControl.Log($"Loaded: {rootPage.CaptionedMediaUri}"); }
private void AudioTracks_SelectedIndexChanged(ISingleSelectMediaTrackList sender, object args) { var audioTrackIndex = sender.SelectedIndex; LoggerControl.Log("Switched to audio track #" + (audioTrackIndex + 1) + " | Id: " + this.item.AudioTracks[audioTrackIndex].Id + " | Label: " + this.item.AudioTracks[audioTrackIndex].Label + " | Language: " + this.item.AudioTracks[audioTrackIndex].Language); }
private void PlaybackList_CurrentItemChanged(MediaPlaybackList sender, CurrentMediaPlaybackItemChangedEventArgs args) { LoggerControl.Log($"Current item changed to index: {sender.CurrentItemIndex}"); var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // Synchronize our UI with the currently-playing item. playlistView.SelectedIndex = (int)sender.CurrentItemIndex; }); }
protected override void OnNavigatedTo(NavigationEventArgs e) { this.item = new MediaPlaybackItem(MediaSource.CreateFromUri(rootPage.CaptionedMediaUri)); mpiLogger = new MediaPlaybackItemLogger(LoggerControl, item); item.AudioTracks.SelectedIndexChanged += AudioTracks_SelectedIndexChanged; this.mediaPlayerElement.Source = item; LoggerControl.Log($"Loaded: {rootPage.CaptionedMediaUri}"); }
private void PlaylistView_ItemClick(object sender, ItemClickEventArgs e) { var item = e.ClickedItem as MediaModel; LoggerControl.Log("Clicked item: " + item.Title); // Start the background task if it wasn't running playbackList.MoveTo((uint)playbackList.Items.IndexOf(item.MediaPlaybackItem)); if (MediaPlaybackState.Paused == mp.PlaybackSession.PlaybackState) { mp.Play(); } }
/// <summary> /// MediaPlayer state changed event handlers. /// Note that we can subscribe to events even if Media Player is playing media in background /// </summary> /// <param name="sender"></param> /// <param name="args"></param> /// private async void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args) { LoggerControl.Log($"Current playback state changed to: {sender.PlaybackState}"); await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { var currentState = sender.PlaybackState; // Update state label txtCurrentState.Text = currentState.ToString(); // Update controls UpdateTransportControls(currentState); }); }
protected override void OnNavigatedTo(NavigationEventArgs e) { // Create the media source and supplement with external timed text sources. var source = MediaSource.CreateFromUri(rootPage.UncaptionedMediaUri); msLogger = new MediaSourceLogger(LoggerControl, source); var ttsEnUri = new Uri("ms-appx:///Assets/Media/ElephantsDream-Clip-SRT_en.srt"); var ttsEn = TimedTextSource.CreateFromUri(ttsEnUri); ttsMap[ttsEn] = ttsEnUri; var ttsPtUri = new Uri("ms-appx:///Assets/Media/ElephantsDream-Clip-SRT_pt.srt"); var ttsPt = TimedTextSource.CreateFromUri(ttsPtUri); ttsMap[ttsPt] = ttsPtUri; var ttsSvUri = new Uri("ms-appx:///Assets/Media/ElephantsDream-Clip-SRT_sv.srt"); var ttsSv = TimedTextSource.CreateFromUri(ttsSvUri); ttsMap[ttsSv] = ttsSvUri; ttsEn.Resolved += Tts_Resolved; ttsPt.Resolved += Tts_Resolved; ttsSv.Resolved += Tts_Resolved; source.ExternalTimedTextSources.Add(ttsEn); source.ExternalTimedTextSources.Add(ttsPt); source.ExternalTimedTextSources.Add(ttsSv); // Create the playback item from the source var playbackItem = new MediaPlaybackItem(source); mpiLogger = new MediaPlaybackItemLogger(LoggerControl, playbackItem); // Present the first track playbackItem.TimedMetadataTracksChanged += (item, args) => { LoggerControl.Log($"TimedMetadataTracksChanged, Number of tracks: {item.TimedMetadataTracks.Count}"); playbackItem.TimedMetadataTracks.SetPresentationMode(0, TimedMetadataTrackPresentationMode.PlatformPresented); }; // Set the source to start playback of the item this.mediaPlayerElement.Source = playbackItem; LoggerControl.Log($"Loaded: {rootPage.UncaptionedMediaUri}"); }
private async void VideoTracks_SelectedIndexChanged(ISingleSelectMediaTrackList sender, object args) { var videoTrackIndex = sender.SelectedIndex; LoggerControl.Log("Switched to video track #" + (videoTrackIndex + 1) + " | Id: " + this.item.VideoTracks[videoTrackIndex].Id + " | Label: " + this.item.VideoTracks[videoTrackIndex].Label); // Forces a new frame to be rendered when we are paused. await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { //Make sure to call the mediaPlayerElement on the UI thread: if (mediaPlayerElement.MediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Paused) { mediaPlayerElement.MediaPlayer.StepForwardOneFrame(); } }); }
/// <summary> /// Given: /// y = m * x + b /// x = (y - b) /m /// /// Where from above: /// b = MinPosition /// m = (MaxPosition - MinPosition) / sliderFullScale /// /// We have: /// Position = (PlaybackPosition - MinPosition) * sliderFullScale / (MaxPosition - MinPosition) /// /// </summary> public double GetSliderPositionAtPlaybackPosition(TimeSpan playbackPosition, double sliderFullScale, TimeSpan MinPosition, TimeSpan MaxPosition) { if ((MaxPosition - MinPosition).Ticks == 0) { return(0); } if (playbackPosition == TimeSpan.Zero) { LoggerControl.Log("Transient playbackPosition == TimeSpan.Zero", LogViewLoggingLevel.Error); } var interpolatedPosition = (playbackPosition - MinPosition).Ticks * sliderFullScale / (MaxPosition - MinPosition).Ticks; if (interpolatedPosition < 0) { interpolatedPosition = 0; LoggerControl.Log("Transient calculatedPosition < 0", LogViewLoggingLevel.Error); } return(interpolatedPosition); }
private void Log(string message) { LoggerControl.Log(message); }
private void PlaybackSession_PlaybackRateChanged(MediaPlaybackSession sender, object args) { LoggerControl.Log($"Current playback rate changed to: {sender.PlaybackRate}"); }