미디어 휴지 만들기, 예약 및 관리

이 문서에서는 미디어 재생 앱에 대한 미디어 중단을 만들고 예약하고 관리하는 방법을 보여 줍니다. 미디어 중단은 일반적으로 미디어 콘텐츠에 오디오 또는 비디오 광고를 삽입하는 데 사용됩니다. Windows 10 버전 1607부터 MediaBreakManager 클래스를 사용하여 MediaPlayer로 재생하는 모든 MediaPlaybackItem에 미디어 중단을 빠르고 쉽게 추가할 수 있습니다.

하나 이상의 미디어 중단을 예약한 후 시스템은 재생 중에 지정된 시간에 미디어 콘텐츠를 자동으로 재생합니다. 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입니다. 목록의 Items 컬렉션에서 MediaPlaybackItem 개체를 하나 이상 추가하여 미디어 중단의 재생 목록에 포함합니다.

마지막으로 기본 콘텐츠 재생 항목의 BreakSchedule 속성을 사용하여 미디어 중단을 예약합니다. 일정 개체의 PrerollBreak 속성에 할당하여 중단을 미리 등록 중단으로 지정합니다.

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로 설정하여 자동으로 재생을 시작합니다. MediaPlayerSource 속성을 기본 콘텐츠 재생 항목으로 설정합니다. 필수는 아니지만 MediaPlayerMediaPlayerElement에 할당하여 XAML 페이지에서 미디어를 렌더링할 수 있습니다. MediaPlayer 사용에 대한 자세한 내용은 MediaPlayer를 사용하여 오디오 및 비디오 재생을 참조하세요 .

_mediaPlayer = new MediaPlayer();
_mediaPlayer.AutoPlay = true;
_mediaPlayer.Source = moviePlaybackItem;
mediaPlayerElement.SetMediaPlayer(_mediaPlayer);

PostrollBreak 속성에 MediaBreak개체를 할당한다는 점을 제외하고, 사전 등록 중단과 동일한 기술을 사용하여 기본 콘텐츠가 포함된 MediaPlaybackItem 재생이 완료된 후 재생되는 포스트롤 중단을 추가합니다.

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;

기본 콘텐츠의 재생 내에서 지정된 시간에 재생되는 하나 이상의 미드롤 중단을 예약할 수도 있습니다. 다음 예제에서는 TimeSpan 개체를 허용하는 생성자 오버로드를 사용하여 MediaBreak를 만듭니다. 이 오버로드는 중단이 재생될 때 기본 미디어 항목의 재생 내 시간을 지정합니다. 다시 말하지만 MediaBreakInsertionMethod.Interrupt는 중단이 재생되는 동안 기본 콘텐츠의 재생이 일시 중지됨을 나타내도록 지정됩니다. 미드롤 중단은 InsertMidrollBreak를 호출하여 일정에 추가됩니다. MidrollBreaks 속성에 액세스하여 일정에서 현재 midroll 중단의 읽기 전용 목록을 가져올 수 있습니다.

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);

표시된 다음 midroll break 예제는 MediaBreakInsertionMethod.Replace 삽입 메서드를 사용합니다. 즉, 중단이 재생되는 동안 시스템에서 기본 콘텐츠를 계속 처리합니다. 이 옵션은 일반적으로 라이브 스트리밍 미디어 앱에서 사용되며, 광고 재생 중 콘텐츠가 일시 중지되고 라이브 스트림에 뒤처지지 않도록 합니다.

이 예제에서는 두 개의 TimeSpan 매개 변수를 허용하는 MediaPlaybackItem 생성자의 오버로드도 사용합니다. 첫 번째 매개 변수는 재생이 시작되는 미디어 중단 항목 내의 시작점을 지정합니다. 두 번째 매개 변수는 미디어 중단 항목이 재생되는 기간을 지정합니다. 따라서 다음 예제에서는 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);

미디어 중단 건너뛰기

이 문서의 앞에서 멘션 MediaPlaybackItemCanSkip 속성을 설정하여 사용자가 기본 제공 컨트롤을 사용하여 콘텐츠를 건너뛰지 못하도록 할 수 있습니다. 그러나 언제든지 코드에서 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;

BreakStarted는 미디어 중단이 시작될 때 발생합니다. 미디어 중단 콘텐츠가 재생 중임을 사용자에게 알리도록 UI를 업데이트할 수 있습니다. 이 예제에서는 처리기에 전달된 MediaBreakStartedEventArgs를 사용하여 시작된 미디어 중단에 대한 참조를 가져옵니다. 그런 다음 CurrentItemIndex 속성을 사용하여 미디어 중단 재생 목록에서 재생 중인 미디어 항목을 확인합니다. 그런 다음 UI가 업데이트되어 사용자에게 현재 광고 인덱스와 휴식 시간에 다시 기본 광고 수를 표시합니다. UI에 대한 업데이트는 UI 스레드에서 이루어져야 하므로 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는 중단에 포함된 모든 미디어 항목의 재생이 완료되거나 모두 건너뛰었을 때 발생합니다. 이 이벤트에 대한 처리기를 사용하여 UI를 업데이트하여 미디어 중단 콘텐츠가 더 이상 재생되지 않음을 나타낼 수 있습니다.

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 이벤트는 사용자가 CanSkip이 true인 항목을 재생하는 동안 기본 제공 UI에서 Next 단추를 누르거나 SkipCurrentBreak를 호출하여 코드에서 중단을 건너뛸 때 발생합니다.

다음 예제에서는 MediaPlayerSource 속성을 사용하여 기본 콘텐츠에 대한 미디어 항목에 대한 참조를 가져옵니다. 건너뛴 미디어 중단은 이 항목의 중단 일정에 속합니다. 다음으로 건너뛴 미디어 중단이 일정의 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);
    }
}

BreaksSeekedOver는 기본 미디어 항목의 재생 위치가 하나 이상의 미디어 중단에 예약된 시간을 지났을 때 발생합니다. 다음 예제에서는 두 개 이상의 미디어 중단이 검색되었는지, 재생 위치가 앞으로 이동되었는지, 10분 이내에 앞으로 이동되었는지 확인하는 검사. 그렇다면 이벤트 인수에 의해 노출된 SeekedOverBreaks 컬렉션에서 가져온 첫 번째 중단은 MediaPlayer.BreakManagerPlayBreak 메서드 호출과 함께 즉시 재생됩니다.

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도 있습니다. 재생 세션에서 얻을 수 있는 정보에는 현재 재생 상태, 재생 또는 일시 중지, 콘텐츠 내의 현재 재생 위치가 포함됩니다. 미디어 중단 콘텐츠의 가로 세로 비율이 기본 콘텐츠와 다른 경우 NaturalVideoWidthNaturalVideoHeight 속성과 NaturalVideoSizeChanged를 사용하여 비디오 UI를 조정할 수 있습니다. 또한 앱의 성능에 대한 중요한 원격 분석을 제공할 수 있는 BufferingStarted, BufferingEnded, 및 DownloadProgressChanged와 같은 이벤트를 수신할 수 있습니다.

다음은 BufferingProgressChanged 이벤트에 대한 처리기를 등록하는 예제입니다. 이벤트 처리기에서 현재 버퍼링 진행률을 표시하도록 UI를 업데이트합니다.

_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);
}