Создание, планирование и управление разрывами мультимедиа
В этой статье показано, как создавать, планировать и управлять разрывами мультимедиа в приложении воспроизведения мультимедиа. Разрывы мультимедиа обычно используются для вставки аудио- или видеообъявления в содержимое мультимедиа. Начиная с Windows 10 версии 1607, вы можете использовать класс MediaBreakManager для быстрого и легкого добавления разрывов мультимедиа в любой MediaPlaybackItem, который вы играете с MediaPlayer.
После планирования одного или нескольких разрывов мультимедиа система автоматически воспроизводит содержимое мультимедиа в указанное время во время воспроизведения. MediaBreakManager предоставляет события, позволяющие приложению реагировать на момент начала, окончания или завершения разрыва мультимедиа, а также при пропуске пользователем. Вы также можете получить доступ к MediaPlaybackSession для разрывов мультимедиа для отслеживания событий, таких как скачивание и буферизация обновлений хода выполнения.
Планирование разрывов мультимедиа
Каждый объект MediaPlaybackItem имеет собственный объект MediaBreakSchedule , используемый для настройки разрывов мультимедиа, которые будут воспроизводиться при воспроизведении элемента. Первым шагом для использования разрывов мультимедиа в приложении является создание MediaPlaybackItem для основного содержимого воспроизведения.
MediaPlaybackItem moviePlaybackItem =
new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/movie.mkv")));
Дополнительные сведения о работе с MediaPlaybackItem, MediaPlaybackList и другими основными API воспроизведения мультимедиа см. в разделе "Элементы мультимедиа", списки воспроизведения и треки.
В следующем примере показано, как добавить предварительный перерыв в MediaPlaybackItem, что означает, что система будет воспроизводить разрыв мультимедиа перед воспроизведением элемента воспроизведения, к которому принадлежит разрыв. Сначала создается экземпляр нового объекта MediaBreak . В этом примере конструктор вызывается с помощью MediaBreakInsertionMethod.Interrupt, что означает, что основное содержимое будет приостановлено во время воспроизведения содержимого разрыва.
Затем создается новый MediaPlaybackItem для содержимого, которое будет воспроизводиться во время перерыва, например объявление. Свойство CanSkip этого элемента воспроизведения имеет значение false. Это означает, что пользователь не сможет пропустить элемент с помощью встроенных элементов управления мультимедиа. Приложение по-прежнему может пропустить добавление программным способом, вызвав SkipCurrentBreak.
СвойствоPlaybackList для разбиения мультимедиа — это mediaPlaybackList, который позволяет воспроизводить несколько элементов мультимедиа в качестве списка воспроизведения. Добавьте один или несколько объектов MediaPlaybackItem из коллекции элементов списка, чтобы включить их в список воспроизведения разрывов мультимедиа.
Наконец, запланируйте разрыв мультимедиа с помощью свойства BreakSchedule основного элемента воспроизведения содержимого. Укажите перерыв для предварительной подготовки, назначив его свойству PrerollBreak объекта schedule.
MediaBreak preRollMediaBreak = new MediaBreak(MediaBreakInsertionMethod.Interrupt);
MediaPlaybackItem prerollAd =
new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/preroll_ad.mp4")));
prerollAd.CanSkip = false;
preRollMediaBreak.PlaybackList.Items.Add(prerollAd);
moviePlaybackItem.BreakSchedule.PrerollBreak = preRollMediaBreak;
Теперь вы можете воспроизвести основной элемент мультимедиа, и созданный разрыв мультимедиа будет воспроизводиться до основного содержимого. Создайте новый объект MediaPlayer и при необходимости задайте для свойства AutoPlay значение true, чтобы запустить воспроизведение автоматически. Задайте свойству Source объекта MediaPlayer основной элемент воспроизведения содержимого. Это не обязательно, но вы можете назначить MediaPlayer MediaPlayerElement для отрисовки мультимедиа на странице XAML. Дополнительные сведения об использовании MediaPlayer см. в статье "Воспроизведение звука и видео" с помощью MediaPlayer.
_mediaPlayer = new MediaPlayer();
_mediaPlayer.AutoPlay = true;
_mediaPlayer.Source = moviePlaybackItem;
mediaPlayerElement.SetMediaPlayer(_mediaPlayer);
Добавьте перерыв postroll, который воспроизводится после MediaPlaybackItem, содержащего основное содержимое, завершает воспроизведение, используя тот же метод, что и преролл-перерыв, за исключением того, что вы назначаете объект MediaBreak свойству PostrollBreak.
MediaBreak postrollMediaBreak = new MediaBreak(MediaBreakInsertionMethod.Interrupt);
MediaPlaybackItem postRollAd =
new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/postroll_ad.mp4")));
postrollMediaBreak.PlaybackList.Items.Add(postRollAd);
moviePlaybackItem.BreakSchedule.PostrollBreak = postrollMediaBreak;
Вы также можете запланировать один или несколько перерывов среднего роля, которые играют в определенное время в течение воспроизведения основного содержимого. В следующем примере MediaBreak создается с перегрузкой конструктора, которая принимает объект TimeSpan, который указывает время воспроизведения основного элемента мультимедиа при воспроизведении разрыва. Опять же, mediaBreakInsertionMethod.Interrupt указывает, что воспроизведение основного содержимого будет приостановлено во время воспроизведения перерыва. Промежуточный перерыв добавляется в расписание путем вызова InsertMidrollBreak. Вы можете получить список только для чтения текущих перерывов середины в расписании, доступ к свойству MidrollBreaks .
MediaBreak midrollMediaBreak = new MediaBreak(MediaBreakInsertionMethod.Interrupt, TimeSpan.FromMinutes(10));
midrollMediaBreak.PlaybackList.Items.Add(
new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/midroll_ad_1.mp4"))));
midrollMediaBreak.PlaybackList.Items.Add(
new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/midroll_ad_2.mp4"))));
moviePlaybackItem.BreakSchedule.InsertMidrollBreak(midrollMediaBreak);
В следующем примере перерыва в середине показано использование метода вставки MediaBreakInsertionMethod.Replace , что означает, что система продолжит обработку основного содержимого во время воспроизведения перерыва. Этот параметр обычно используется приложениями потоковой передачи мультимедиа, в которых содержимое не будет приостановлено и отстает от трансляции во время воспроизведения рекламы.
В этом примере также используется перегрузка конструктора MediaPlaybackItem, который принимает два параметра TimeSpan. Первый параметр указывает начальную точку в элементе разрыва мультимедиа, где начнется воспроизведение. Второй параметр указывает длительность воспроизведения элемента разрыва мультимедиа. Таким образом, в следующем примере MediaBreak начнет воспроизводиться через 20 минут в основное содержимое. При воспроизведении элемент мультимедиа начнется 30 секунд с начала элемента мультимедиа перерыва и будет воспроизводиться в течение 15 секунд до возобновления воспроизведения основного содержимого мультимедиа.
midrollMediaBreak = new MediaBreak(MediaBreakInsertionMethod.Replace, TimeSpan.FromMinutes(20));
MediaPlaybackItem ad =
new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://www.fabrikam.com/midroll_ad_3.mp4")),
TimeSpan.FromSeconds(30),
TimeSpan.FromSeconds(15));
ad.CanSkip = false;
midrollMediaBreak.PlaybackList.Items.Add(ad);
Пропуск разрывов мультимедиа
Как упоминалось ранее в этой статье, свойство CanSkip MediaPlaybackItem можно задать, чтобы предотвратить пропуск содержимого со встроенными элементами управления. Однако вы можете вызвать SkipCurrentBreak из кода в любое время, чтобы пропустить текущий перерыв.
private void SkipButton_Click(object sender, RoutedEventArgs e) => _mediaPlayer.BreakManager.SkipCurrentBreak();
Обработка событий MediaBreak
Существует несколько событий, связанных с разрывами мультимедиа, которые можно зарегистрировать для принятия действий на основе изменения состояния разрывов мультимедиа.
_mediaPlayer.BreakManager.BreakStarted += BreakManager_BreakStarted;
_mediaPlayer.BreakManager.BreakEnded += BreakManager_BreakEnded;
_mediaPlayer.BreakManager.BreakSkipped += BreakManager_BreakSkipped;
_mediaPlayer.BreakManager.BreaksSeekedOver += BreakManager_BreaksSeekedOver;
При запуске разрыва мультимедиа возникает прерывание работы. Возможно, вы хотите обновить пользовательский интерфейс, чтобы сообщить пользователю, что содержимое разрыва мультимедиа воспроизводится. В этом примере используется MediaBreakStartedEventArgs , переданный в обработчик, чтобы получить ссылку на запущенный разрыв мультимедиа. Затем свойство CurrentItemIndex используется для определения элемента мультимедиа в списке воспроизведения разрывов мультимедиа. Затем пользовательский интерфейс обновляется, чтобы показать пользователю текущий индекс рекламы и количество объявлений, оставшихся в перерыве. Помните, что обновления пользовательского интерфейса должны выполняться в потоке пользовательского интерфейса, поэтому вызов должен выполняться внутри вызова RunAsync.
private async void BreakManager_BreakStarted(MediaBreakManager sender, MediaBreakStartedEventArgs args)
{
MediaBreak currentBreak = sender.CurrentBreak;
var currentIndex = currentBreak.PlaybackList.CurrentItemIndex;
var itemCount = currentBreak.PlaybackList.Items.Count;
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
statusTextBlock.Text = $"Playing ad {currentIndex + 1} of {itemCount}");
}
BreakEnded возникает, когда все элементы мультимедиа в перерыве закончили воспроизведение или были пропущены. Обработчик этого события можно использовать для обновления пользовательского интерфейса, чтобы указать, что содержимое разрыва мультимедиа больше не воспроизводится.
private async void BreakManager_BreakEnded(MediaBreakManager sender, MediaBreakEndedEventArgs args)
{
// Update UI to show that the MediaBreak is no longer playing
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => statusTextBlock.Text = "");
args.MediaBreak.CanStart = false;
}
Событие BreakSkipped возникает, когда пользователь нажимает кнопку Next в встроенном пользовательском интерфейсе во время воспроизведения элемента, для которого CanSkip имеет значение true, или при пропуске перерыва в коде путем вызова SkipCurrentBreak.
В следующем примере свойство Source объекта MediaPlayer используется для получения ссылки на элемент мультимедиа для основного содержимого. Пропущенный разрыв мультимедиа относится к расписанию перерыва этого элемента. Затем код проверяет, совпадает ли разрыв мультимедиа, пропущенный, как и в случае разрыва носителя, заданного свойством PrerollBreak расписания. Если это так, это означает, что предварительный перерыв был перерыв, который был пропущен, и в этом случае новый промежуточный перерыв создается и планируется играть 10 минут в основное содержимое.
private async void BreakManager_BreakSkipped(MediaBreakManager sender, MediaBreakSkippedEventArgs args)
{
// Update UI to show that the MediaBreak is no longer playing
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => statusTextBlock.Text = "");
MediaPlaybackItem currentItem = _mediaPlayer.Source as MediaPlaybackItem;
if(!(currentItem.BreakSchedule.PrerollBreak is null)
&& currentItem.BreakSchedule.PrerollBreak == args.MediaBreak)
{
MediaBreak mediaBreak = new MediaBreak(MediaBreakInsertionMethod.Interrupt, TimeSpan.FromMinutes(10));
mediaBreak.PlaybackList.Items.Add(await GetAdPlaybackItem());
currentItem.BreakSchedule.InsertMidrollBreak(mediaBreak);
}
}
РазрывыSeekedOver возникают, когда положение воспроизведения основного элемента мультимедиа проходит по расписанию для одного или нескольких разрывов мультимедиа. В следующем примере проверяется, был ли выполнен поиск нескольких разрывов мультимедиа, если положение воспроизведения было перемещено вперед, и если оно было перемещено менее 10 минут. Если да, первый разрыв, полученный из коллекции SeekedOverBreaks, предоставляемой событиями args, выполняется немедленно с вызовом метода PlayBreak объекта MediaPlayer.BreakManager.
private void BreakManager_BreaksSeekedOver(MediaBreakManager sender, MediaBreakSeekedOverEventArgs args)
{
if(args.SeekedOverBreaks.Count > 1
&& args.NewPosition.TotalMinutes > args.OldPosition.TotalMinutes
&& args.NewPosition.TotalMinutes - args.OldPosition.TotalMinutes < 10.0)
_mediaPlayer.BreakManager.PlayBreak(args.SeekedOverBreaks[0]);
}
Доступ к текущему сеансу воспроизведения
Объект MediaPlaybackSession использует класс MediaPlayer для предоставления данных и событий, связанных с текущим воспроизведением содержимого мультимедиа. MediaBreakManager также имеет средство MediaPlaybackSession, которое можно получить для получения данных и событий, связанных с содержимым разбиения мультимедиа, которое воспроизводится. Сведения, полученные из сеанса воспроизведения, включают текущее состояние воспроизведения, воспроизведение или приостановку, а также текущую позицию воспроизведения в содержимом. Свойства NaturalVideoWidth и NaturalVideoHeight и NaturalVideoHeight и NaturalVideoSizeChanged можно использовать для настройки пользовательского интерфейса видео, если содержимое разрыва мультимедиа имеет другое соотношение пропорций, чем основное содержимое. Вы также можете получать такие события, как BufferingStarted, BufferingEnded и DownloadProgressChanged, которые могут предоставлять ценные данные телеметрии о производительности приложения.
В следующем примере регистрируется обработчик события BufferingProgressChanged; в обработчике событий он обновляет пользовательский интерфейс, чтобы показать текущий ход буферизации.
_mediaPlayer.BreakManager.PlaybackSession.BufferingProgressChanged += PlaybackSession_BufferingProgressChanged;
private async void PlaybackSession_BufferingProgressChanged(MediaPlaybackSession sender, object args)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
bufferingProgressBar.Value = sender.BufferingProgress);
}
См. также
- Воспроизведение мультимедиа
- Воспроизведение аудио и видео с помощью MediaPlayer
- Ручное управление элементами управления транспортировкой системных носителей