Créer une application de lecture Audio/Vidéo pour Windows Phone 8, Windows 8.1 et Windows Phone 8.1 en utilisant le Player Framework v2.0

INTRODUCTION

Cet article décrit les différentes étapes pour créer des applications Windows Phone 8, Windows 8.1 et Windows Phone 8.1 capables de jouer les formats de vidéos suivants:
- WMV, MP4, MPEG2-TS (Seulement pour Windows 8.1) pour l’étape 1,
- Smooth Streaming pour l’étape 2,
- MPEG DASH pour l’étape 3
- Smooth Streaming et MPEG DASH protégées par PlayReady pour l’étape 4.
Avec les exemples d’application fournis avec cet article l’utilisateur peut définir:
- l’URL de la vidéo,
- l’URL utilisée pour l’acquisition de la licence PlayReady,
- le « Challenge Custom Data » transmis au serveur PlayReady pour acquérir la licence PlayReady.
Si l’URL utilisée pour l’acquisition de licence n’est pas définie, l’application utilisera l’URL inclue dans l’en-tête de protection PlayReady du manifeste de la vidéo.
L’application propose par défaut une liste de vidéos pour tester les différents formats.
         image                                                              image
              Windows Phone 8                                                                           Windows Phone 8.1

                        image

                                                                           Windows 8.1
image

ETAPE 1: LECTEUR AUDIO/VIDEO (WMV, MP4, MPEG2-TS)

Les applications pour Windows Phone 8, Windows 8.1 et Windows Phone 8.1 de l’étape 1 sont capables de lire les formats suivants :
- pour Windows: WMV, MP4, MPEG2-TS
- pour Windows Phone : WMV, MP4,

Aucun SDK supplémentaire n’est nécessaire pour générer ces applications.

image

Applications Windows 8.1, Windows Phone 8.1 et Windows Phone 8.0 :

Sur la MainPage XAML insérer le MediaElement et nommer le « Player »

 <MediaElement x:Name="Player" Grid.Row="1" Grid.Column="2" Grid.RowSpan="4" Grid.ColumnSpan="1"
Stretch="Uniform" Margin="20,10,20,10" HorizontalAlignment="Center" VerticalAlignment="Center" />

Dans la méthode associée à l’événement Click sur le bouton « Play », initialiser la Source du Player avec l’url du fichier à jouer

 Player.Source = new Uri(MediaUri.Text);

Les urls associées à des fichiers WMV, MP4 et MPEG2-TS disponibles sur Microsoft Azure

 
http://livestreamingvm.cloudapp.net/vod/wmv/test1.wmv
http://livestreamingvm.cloudapp.net/vod/mp4/test1.mp4
http://livestreamingvm.cloudapp.net/vod/ts/test1.ts

ETAPE 2: LECTEUR AUDIO/VIDEO (WMV, MP4, MPEG2-TS, SMOOTH STREAMING)

Les applications pour Windows Phone 8, Windows 8.1 et Windows Phone 8.1 de l’étape 2 sont capables de lire les formats suivants :

- pour Windows: WMV, MP4, MPEG2-TS et Smooth Streaming

- pour Windows Phone : WMV, MP4 et Smooth Streaming

Les SDK supplémentaires suivants sont nécessaires pour générer ces applications :

 image

Applications Windows 8.1 et Windows Phone 8.1:

Ajouter une référence au « Microsoft Smooth Streaming Client SDK for Windows 8.1 » pour l’application Windows 8.1.

image

Ajouter une référence au « Microsoft Smooth Streaming Client SDK for Windows Phone 8.1 » pour l’application Windows Phone 8.1.

image

Sur la MainPage XAML insérer le MediaElement et nommer le « Player »

 
<MediaElement x:Name="Player" Grid.Row="1" Grid.Column="2" 
Grid.RowSpan="4" Grid.ColumnSpan="1"
Stretch="Uniform" Margin="20,10,20,10" 
HorizontalAlignment="Center" VerticalAlignment="Center" />

Créez une méthode RegisterPlugins qui associe la librairie Smooth Streaming avec l’ouverture d’url Smooth Streaming par le MediaElement. Cette méthode est appelée dans la méthode OnNavigatedTo.

 public Windows.Media.MediaExtensionManager MediaManager;
public IAdaptiveSourceManager AdaptiveSrcManager { get; private set; }
void RegisterPlugins()
{
     LogMessage("Register plugins");
     if (MediaManager == null)
                MediaManager = new Windows.Media.MediaExtensionManager();
     if (AdaptiveSrcManager == null)
                AdaptiveSrcManager = AdaptiveSourceManager.GetDefault();
     PropertySet ssps = new PropertySet();
     ssps["{A5CE1DE8-1D00-427B-ACEF-FB9A3C93DE2D}"] = AdaptiveSrcManager;


     MediaManager.RegisterByteStreamHandler("Microsoft.Media.AdaptiveStreaming.SmoothByteStreamHandler", ".ism", "text/xml", ssps);
     MediaManager.RegisterByteStreamHandler("Microsoft.Media.AdaptiveStreaming.SmoothByteStreamHandler", ".ism", "application/vnd.ms-sstr+xml", ssps);
     MediaManager.RegisterByteStreamHandler("Microsoft.Media.AdaptiveStreaming.SmoothByteStreamHandler", ".isml", "text/xml", ssps);
     MediaManager.RegisterByteStreamHandler("Microsoft.Media.AdaptiveStreaming.SmoothByteStreamHandler", ".isml", "application/vnd.ms-sstr+xml", ssps);
     MediaManager.RegisterSchemeHandler("Microsoft.Media.AdaptiveStreaming.SmoothSchemeHandler", "ms-sstr:", ssps);
} 

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    LogMessage("OnNavigatedTo");
    base.OnNavigatedTo(e);
    Application.Current.Suspending += App_Suspending;
    Application.Current.Resuming += App_Resuming;
    Player.MediaEnded += Player_MediaEnded;
    Player.MediaOpened += Player_MediaOpened;
    Player.MediaFailed += Player_MediaFailed;
#if WINDOOWS_PHONE_APP
    DisplayInformation.GetForCurrentView().OrientationChanged += OnOrientationChanged;
#endif
    RegisterPlugins();
}

Dans la méthode associée à l’événement Click sur le bouton « Play », initialiser la Source du Player avec l’url du fichier à jouer

 Player.Source = new Uri(MediaUri.Text);

Les urls associées au smooth streaming sont disponibles sur Microsoft Azure

 
http://livestreamingvm.cloudapp.net/vod/test1/test1.ism/manifest

Applications Windows Phone 8.0:

Ajouter une référence au « Microsoft.Web.Media.SmoothStreaming » pour l’application Windows Phone 8.0.

image

Sur la MainPage XAML :

- insérer le MediaElement utilisé pour jouer le contenu WMV, MP4 et nommer le « Player »

- insérer le SmoothStreamingMediaElement utilisé pour jouer le contenu Smooth Streaming et nommer le « PlayerSSME »

 <MediaElement Visibility="Visible" x:Name="Player" Grid.Row="3" 
Stretch="Uniform" Grid.Column="0" Grid.ColumnSpan="3" Margin="10,10,10,10" 
HorizontalAlignment="Center" VerticalAlignment="Center" />
<ssme:SmoothStreamingMediaElement Visibility="Collapsed" 
x:Name="PlayerSSME" Grid.Row="3" Stretch="Uniform" Grid.Column="0" 
Grid.ColumnSpan="3" Margin="10,10,10,10" HorizontalAlignment="Center" 
VerticalAlignment="Center" />

Dans la méthode associée à l’événement Click sur le bouton « Play », si l’url est une url Smooth Streaming, initialiser la Source du PlayerSSME avec l’url du fichier à jouer, sinon initialiser la Source du Player avec l’url du fichier à jouer

 if (MediaUri.Text.EndsWith("/manifest", StringComparison.CurrentCultureIgnoreCase))
    PlayerSSME.SmoothStreamingSource = new Uri(MediaUri.Text);
else 
    Player.Source = new Uri(MediaUri.Text);

Les urls associées au smooth streaming sont disponibles sur Microsoft Azure

 
http://livestreamingvm.cloudapp.net/vod/test1/test1.ism/manifest

ETAPE 3: LECTEUR AUDIO/VIDEO (WMV, MP4, MPEG2-TS, SMOOTH STREAMING, MPEG DASH)

Les applications pour Windows Phone 8, Windows 8.1 et Windows Phone 8.1 de l’étape 3 sont capables de lire les formats suivants :

- pour Windows: WMV, MP4, MPEG2-TS, Smooth Streaming et MPEG DASH

- pour Windows Phone : WMV, MP4, Smooth Streaming et MPEG DASH

Les SDK supplémentaires suivants sont nécessaires pour générer ces applications :

image

Applications Windows 8.1 et Windows Phone 8.1:

Ajouter une référence au « Microsoft Smooth Streaming Client SDK for Windows 8.1 », au « Microsoft Player Framework », au « Microsoft Player Framework Adaptive Streaming Plugin», au « Microsoft Player Framework Dash Plugin» pour l’application Windows 8.1.

image

Ajouter une référence au:

« Microsoft Smooth Streaming Client SDK for Windows Phone 8.1 »,

« Microsoft Player Framework »,

« Microsoft Player Framework Adaptive Streaming Plugin»,

« Microsoft Player Framework Dash Plugin» pour l’application Windows Phone 8.1.

image

Sur la MainPage XAML insérer le « PlayerFramework:MediaPlayer » et nommer le « Player »

 <PlayerFramework:MediaPlayer x:Name="Player" Grid.Row="1" Grid.Column="2" Grid.RowSpan="4" Grid.ColumnSpan="1" Margin="20,10,20,10"         
            IsTimelineVisible="false" IsTimeElapsedVisible="false" IsDurationVisible="false" IsTimeRemainingVisible="false« 
            IsInfoVisible="false"  IsMoreVisible="false«  IsFastForwardVisible="False" IsRewindVisible="False"
            IsSkipBackVisible="False" IsSkipAheadVisible="False"  IsSkipPreviousVisible="False"   IsReplayVisible="False"  
            IsAudioSelectionVisible="False" IsCaptionSelectionVisible="False" HorizontalAlignment="Center"  VerticalAlignment="Center"  
            IsFullScreenVisible="True" Background="Black"  />

Créez une méthode RegisterPlugins qui associe le plugin Adaptive avec le Player. Cette méthode est appelée dans la méthode OnNavigatedTo.

Créez une méthode RegisterDashPlugins qui associe le plugin DashDownloaderPlugin avec le plugin Adaptive du Player. Cette méthode est appelée avant de jouer un contenu MPEG DASH.

 
public Microsoft.PlayerFramework.Adaptive.AdaptivePlugin adaptivePlugin;
public Microsoft.Media.AdaptiveStreaming.Dash.DashDownloaderPlugin dashDownloaderPlugin;

void RegisterDashPlugin(bool bRegister)
{
    Microsoft.PlayerFramework.Adaptive.AdaptivePlugin plugin = Player.Plugins.OfType<Microsoft.PlayerFramework.Adaptive.AdaptivePlugin>().First();
    if (plugin != null)
    {
        if (bRegister == true)
        {
            LogMessage("Register DASH plugin");
            if (dashDownloaderPlugin == null)
                dashDownloaderPlugin = new Microsoft.Media.AdaptiveStreaming.Dash.DashDownloaderPlugin();
            plugin.DownloaderPlugin = dashDownloaderPlugin;
        }
        else
        {
            LogMessage("Unregister DASH plugin");
            plugin.DownloaderPlugin = null;
        }
    }
}
void RegisterPlugins()
{
    LogMessage("Register plugins");

    if (adaptivePlugin == null)
        adaptivePlugin = new Microsoft.PlayerFramework.Adaptive.AdaptivePlugin();

    Player.Plugins.Add(adaptivePlugin);
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    LogMessage("OnNavigatedTo");
    base.OnNavigatedTo(e);
    Application.Current.Suspending += App_Suspending;
    Application.Current.Resuming += App_Resuming;
    Player.MediaEnded += Player_MediaEnded;
    Player.MediaOpened += Player_MediaOpened;
    Player.MediaFailed += Player_MediaFailed;
#if WINDOWS_PHONE_APP
    DisplayInformation.GetForCurrentView().OrientationChanged += OnOrientationChanged;
#endif
    RegisterPlugins();
}

Dans la méthode associée à l’événement Click sur le bouton « Play », initialiser la Source du Player avec l’url du fichier à jouer. S’il s’agit d’un contenu MPEG DASH, appeler la méthode RegisterDashPlugin préalablement.

 RegisterDashPlugin((MediaUri.Text.EndsWith(".mpd", StringComparison.CurrentCultureIgnoreCase) || 
                     MediaUri.Text.EndsWith("manifest(format=mpd-time-csf)", StringComparison.CurrentCultureIgnoreCase)));
Player.Source = new Uri(MediaUri.Text);

Les urls associées au MPEG DASH sont disponibles sur Microsoft Azure

 http://wams.edgesuite.net/media/SintelTrailer_Smooth_SeekDemo/sintel_trailer-1080p.ism/manifest(format=mpd-time-csf)

Applications Windows Phone 8.0:

Ajouter une référence au:

« Microsoft.Web.Media.SmoothStreaming »,

« Microsoft Player Framework »,

« Microsoft Player Framework Adaptive Streaming Plugin»,

« Microsoft Player Framework Dash Plugin» pour l’application Windows Phone 8.0.

image

Sur la MainPage XAML insérer le « PlayerFramework:MediaPlayer » et nommer le « Player »

 <PlayerFramework:MediaPlayer  Visibility="Visible" x:Name="Player"  Grid.Row="3" Grid.Column="0" 
Grid.ColumnSpan="3"  Grid.RowSpan="1"  Margin="10,10,10,10" Background="Black" Foreground="Black" 
IsAudioSelectionVisible="False" IsCaptionSelectionVisible="False"     HorizontalAlignment="Center"  VerticalAlignment="Center"  IsFullScreenVisible="False" />

Créez une méthode RegisterPlugins qui associe le plugin Adaptive avec le Player. Cette méthode est appelée dans la méthode OnNavigatedTo.

Créez une méthode RegisterDashPlugins qui associe le plugin DashDownloaderPlugin avec le plugin Adaptive du Player. Cette méthode est appelée avant de jouer un contenu MPEG DASH.

 public Microsoft.PlayerFramework.Adaptive.AdaptivePlugin adaptivePlugin;
public Microsoft.Media.AdaptiveStreaming.Dash.DashDownloaderPlugin dashDownloaderPlugin;

void RegisterDashPlugin(bool bRegister)
{
    Microsoft.PlayerFramework.Adaptive.AdaptivePlugin plugin = Player.Plugins.OfType<Microsoft.PlayerFramework.Adaptive.AdaptivePlugin>().First();
    if (plugin != null)
    {
        if (bRegister == true)
        {
            LogMessage("Register DASH plugin");
            if (dashDownloaderPlugin == null)
                dashDownloaderPlugin = new Microsoft.Media.AdaptiveStreaming.Dash.DashDownloaderPlugin();
            plugin.DownloaderPlugin = dashDownloaderPlugin;
        }
    }
}
void RegisterPlugins()
{
    LogMessage("Register plugins");
    if (adaptivePlugin == null)
        adaptivePlugin = new Microsoft.PlayerFramework.Adaptive.AdaptivePlugin();
    Player.Plugins.Add(adaptivePlugin);
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    LogMessage("OnNavigatedTo");
    base.OnNavigatedTo(e);
    PhoneApplicationService.Current.Deactivated += App_Suspending;
    PhoneApplicationService.Current.Activated += App_Resuming;
    Player.MediaEnded += Player_MediaEnded;
    Player.MediaOpened += Player_MediaOpened;
    Player.MediaFailed += Player_MediaFailed;
    RegisterPlugins();
}

Dans la méthode associée à l’événement Click sur le bouton « Play », initialiser la Source du Player à null et appeler la méthode « Close » du Player, puis initialiser la Source du Player avec l’url du fichier à jouer. S’il s’agit d’un contenu MPEG DASH, appeler la méthode RegisterDashPlugin préalablement.

 
Player.Source = null;
Player.Close();

RegisterDashPlugin((MediaUri.Text.EndsWith(".mpd", StringComparison.CurrentCultureIgnoreCase) || 
                     MediaUri.Text.EndsWith("manifest(format=mpd-time-csf)", StringComparison.CurrentCultureIgnoreCase)));
Player.Source = new Uri(MediaUri.Text);

Les urls associées au MPEG DASH sont disponibles sur Microsoft Azure

 http://wams.edgesuite.net/media/SintelTrailer_Smooth_SeekDemo/sintel_trailer-1080p.ism/manifest(format=mpd-time-csf)

ETAPE 4: LECTEUR AUDIO/VIDEO (WMV, MP4, MPEG2-TS, SMOOTH STREAMING, MPEG DASH, PLAYREADY)

Les applications pour Windows Phone 8, Windows 8.1 et Windows Phone 8.1 de l’étape 4 sont capables de lire les formats suivants :

- pour Windows: WMV, MP4, MPEG2-TS, Smooth Streaming et MPEG DASH protégés ou non avec le DRM PlayReady

- pour Windows Phone : WMV, MP4, Smooth Streaming et MPEG DASH protégés ou non avec le DRM PlayReady

Les SDK supplémentaires suivants sont nécessaires pour générer ces applications :

image

Les étapes pour l’acquisition d’une licence PlayReady pour les applications de type Universal Apps (Windows 8.1 et Windows Phone 8.1) :

Avant de décrire comment le client PlayReady acquiert la licence PlayReady, quelques mots sur le mécanisme d’individualisation. Chaque client PlayReady est associé à un unique certificat et à une clé unique, l’installation de ce certificat et de cette clé s’appelle l’individualisation.

De plus avant que le client PlayReady demande une licence pour décripter le contenu, il doit d’abord déterminer si le logiciel PlayReady adéquat est installé sur l’ordinateur de l’utilisateur. Ce logiciel est appelé “individualized black box” (appelé aussi IBX) et est le composant PlayReady client nécessaire pour pouvoir jouer des contenus protégés par PlayReady. Ce composant logiciel permet à l’application cliente de demander et d’utiliser une licence PlayReady.

Le client PlayReady pour les applications du Windows Store supporte l’individualisation dynamique: le certificat, la clé, l’IBX sont télélchargés depuis le serveur d’individualisation. Dans votre application Windows Store vous pouvez implémenter une demande d’individualisation réactive ou une demande d’individualisation pro-active.

· La demande pro-active d’individualisation peut être transmise après l’installation de l’application ou quand l’utilisateur lance l’application pour la première fois.

· La demande réactive d’individualisation est automatiquement préparée par le client PlayReady quand l’application est sur le point de jouer un contenu protégé par PlayReady et si le certificat, la clé et l’IBX ne sont pas déjà installés sur l’ordinateur.

Le schéma ci-dessous décrit l’acquisition d’une licence PlayReady pour jouer un contenu protégé par PlayReady avec la transmission d’une requête réactive d’individualisation préalable: 
image

Le schéma ci-dessous décrit l’acquisition d’une licence PlayReady pour jouer un contenu protégé par PlayReady sans transmission d’une requête d’individualisation comme l’IBX est déjà installé: 
image

Le schéma ci-dessous décrit les échanges entre le client et le serveur quand l’application joue un contenu protégé par PlayReady quand l’IBX est déjà installé et la licence PlayReady déjà acquise: 
image

Applications Windows 8.1 et Windows Phone 8.1:

Ajouter une référence au:

« Microsoft Smooth Streaming Client SDK for Windows 8.1 »,

« Microsoft Player Framework »,

« Microsoft Player Framework Adaptive Streaming Plugin»,

« Microsoft Player Framework Dash Plugin»,

« Microsoft PlayReady Client SDK» pour l’application Windows 8.1.

image

Ajouter une référence au:

« Microsoft Smooth Streaming Client SDK for Windows Phone 8.1 »,

« Microsoft Player Framework »,

« Microsoft Player Framework Adaptive Streaming Plugin»,

« Microsoft Player Framework Dash Plugin»,

« Microsoft PlayReady Client SDK» pour l’application Windows Phone 8.1.

image

Sur la MainPage XAML insérer le « PlayerFramework:MediaPlayer » et nommer le « Player »

 <PlayerFramework:MediaPlayer x:Name="Player" Grid.Row="1" Grid.Column="2" Grid.RowSpan="4" Grid.ColumnSpan="1" Margin="20,10,20,10"         
            IsTimelineVisible="false" IsTimeElapsedVisible="false" IsDurationVisible="false" IsTimeRemainingVisible="false« 
            IsInfoVisible="false"  IsMoreVisible="false«  IsFastForwardVisible="False" IsRewindVisible="False"
            IsSkipBackVisible="False" IsSkipAheadVisible="False"  IsSkipPreviousVisible="False"   IsReplayVisible="False"  
            IsAudioSelectionVisible="False" IsCaptionSelectionVisible="False" HorizontalAlignment="Center"  VerticalAlignment="Center"  
            IsFullScreenVisible="True" Background="Black"  />

Créez une méthode RegisterPlugins qui associe le plugin Adaptive avec le Player, qui créé un MediaProtectionManager associé au Player et qui enregistre les événements PlayReady « ServiceRequested » et « ComponentLoadFailed »

Cette méthode est appelée dans la méthode OnNavigatedTo.

Créez une méthode RegisterDashPlugins qui associe le plugin DashDownloaderPlugin avec le plugin Adaptive du Player. Cette méthode est appelée avant de jouer un contenu MPEG DASH.

 public Microsoft.PlayerFramework.Adaptive.AdaptivePlugin adaptivePlugin;
public Microsoft.Media.AdaptiveStreaming.Dash.DashDownloaderPlugin dashDownloaderPlugin;

void RegisterDashPlugin(bool bRegister)
{
    Microsoft.PlayerFramework.Adaptive.AdaptivePlugin plugin = Player.Plugins.OfType<Microsoft.PlayerFramework.Adaptive.AdaptivePlugin>().First();
    if (plugin != null)
    {
        if (bRegister == true)
        {
            LogMessage("Register DASH plugin");
            if (dashDownloaderPlugin == null)
                dashDownloaderPlugin = new Microsoft.Media.AdaptiveStreaming.Dash.DashDownloaderPlugin();
            plugin.DownloaderPlugin = dashDownloaderPlugin;
        }
        else
        {
            LogMessage("Unregister DASH plugin");
            plugin.DownloaderPlugin = null;
        }
    }
}
void RegisterPlugins()
{
    LogMessage("Register plugins");

    if (adaptivePlugin == null)
        adaptivePlugin = new Microsoft.PlayerFramework.Adaptive.AdaptivePlugin();

    Player.Plugins.Add(adaptivePlugin);

    // PlayReady
    // Init PlayReady Protection Manager
    var protectionManager = new MediaProtectionManager();
    Windows.Foundation.Collections.PropertySet cpSystems = new Windows.Foundation.Collections.PropertySet();
    cpSystems.Add("{F4637010-03C3-42CD-B932-B48ADF3A6A54}", "Microsoft.Media.PlayReadyClient.PlayReadyWinRTTrustedInput"); //Playready
    protectionManager.Properties.Add("Windows.Media.Protection.MediaProtectionSystemIdMapping", cpSystems);
    protectionManager.Properties.Add("Windows.Media.Protection.MediaProtectionSystemId", "{F4637010-03C3-42CD-B932-B48ADF3A6A54}");
    this.Player.ProtectionManager = protectionManager;
    
    // PlayReady Events registration
    Player.ProtectionManager.ComponentLoadFailed += ProtectionManager_ComponentLoadFailed;
    Player.ProtectionManager.ServiceRequested += ProtectionManager_ServiceRequested;
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    LogMessage("OnNavigatedTo");
    base.OnNavigatedTo(e);
    Application.Current.Suspending += App_Suspending;
    Application.Current.Resuming += App_Resuming;
    Player.MediaEnded += Player_MediaEnded;
    Player.MediaOpened += Player_MediaOpened;
    Player.MediaFailed += Player_MediaFailed;
#if WINDOWS_PHONE_APP
    DisplayInformation.GetForCurrentView().OrientationChanged += OnOrientationChanged;
#endif
    RegisterPlugins();
}

Pour supporter PlayReady l’application doit appeler le serveur de licence pour acquérir la licence PlayReady associé au contenu à jouer par le Player. Il faut pour cela inclure le fichier CommonLicenseRequest.cs dans le projet. Ce fichier contient le code source de la classe commune utilisant HttpClient pour l’acquisition de la licence PlayReady.

La méthode ProtectionManager_ServiceRequested est appelée à chaque demande d’acquisition de licence ou à chaque demande d’invidualisation. S’il s’agit d’une demande d’individualisation la méthode ReactiveIndivRequest est appelée. S’il s’agit d’une demande d’acquisition de licence la méthode LicenseAcquisitionRequest est appelée.    

Si l’URL utilisée pour l’acquisition de licence PlayReady n’est pas précisée par l’utilisateur, l’application utilisera l’URL définie dans l’entête de protection PlayReady du manifeste de la vidéo, la méthode LicenseAcquisitionRequest appelle licenseRequest.BeginServiceRequest. Si l’URL utilisée pour l’acquisition de licence PlayReady est précisée par l’utilisateur, la méthode LicenseAcquisitionRequest crée un challenge PlayReady en utilisant la valeur du champ ChallengeCustomData et appelle la méthode licenseAcquisition.AcquireLicense en utilisant l’URL définie par l’utilisateur.

 private const int MSPR_E_CONTENT_ENABLING_ACTION_REQUIRED = -2147174251;
private string PlayReadyLicenseUrl;
private string PlayReadyChallengeCustomData;

/// <summary>
/// Invoked when the Protection Manager can't load some components
/// </summary>
void ProtectionManager_ComponentLoadFailed(MediaProtectionManager sender, ComponentLoadFailedEventArgs e)
{
    LogMessage("ProtectionManager ComponentLoadFailed");
    e.Completion.Complete(false);
}
/// <summary>
/// Invoked to acquire the PlayReady License
/// </summary>
async void LicenseAcquisitionRequest(PlayReadyLicenseAcquisitionServiceRequest licenseRequest, MediaProtectionServiceCompletion CompletionNotifier, string Url, string ChallengeCustomData)
{
    bool bResult = false;
    string ExceptionMessage = string.Empty;

    try
    {
        if (!string.IsNullOrEmpty(Url))
        {
            LogMessage("ProtectionManager PlayReady Manual License Acquisition Service Request in progress - URL: " + Url);

            if (!string.IsNullOrEmpty(ChallengeCustomData))
            {
                System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
                byte[] b = encoding.GetBytes(ChallengeCustomData);
                licenseRequest.ChallengeCustomData = Convert.ToBase64String(b, 0, b.Length);
            }

            PlayReadySoapMessage soapMessage = licenseRequest.GenerateManualEnablingChallenge();

            byte[] messageBytes = soapMessage.GetMessageBody();
            HttpContent httpContent = new ByteArrayContent(messageBytes);

            IPropertySet propertySetHeaders = soapMessage.MessageHeaders;
            foreach (string strHeaderName in propertySetHeaders.Keys)
            {
                string strHeaderValue = propertySetHeaders[strHeaderName].ToString();

                // The Add method throws an ArgumentException try to set protected headers like "Content-Type"
                // so set it via "ContentType" property
                if (strHeaderName.Equals("Content-Type", StringComparison.OrdinalIgnoreCase))
                    httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse(strHeaderValue);
                else
                    httpContent.Headers.Add(strHeaderName.ToString(), strHeaderValue);
            }
            CommonLicenseRequest licenseAcquision = new CommonLicenseRequest();
            HttpContent responseHttpContent = await licenseAcquision.AcquireLicense(new Uri(Url), httpContent);
            if (responseHttpContent != null)
            {
                Exception exResult = licenseRequest.ProcessManualEnablingResponse(await responseHttpContent.ReadAsByteArrayAsync());
                if (exResult != null)
                {
                    throw exResult;
                }
                bResult = true;
            }
            else
                ExceptionMessage = licenseAcquision.GetLastErrorMessage();
        }
        else
        {
            LogMessage("ProtectionManager PlayReady License Acquisition Service Request in progress - URL: " + licenseRequest.Uri.ToString());
            await licenseRequest.BeginServiceRequest();
            bResult = true;
        }
    }
    catch (Exception e)
    {
        ExceptionMessage = e.Message;
    }

    if (bResult == true)
        LogMessage(!string.IsNullOrEmpty(Url) ? "ProtectionManager Manual PlayReady License Acquisition Service Request successful" :
            "ProtectionManager PlayReady License Acquisition Service Request successful");
    else
        LogMessage(!string.IsNullOrEmpty(Url) ? "ProtectionManager Manual PlayReady License Acquisition Service Request failed: " + ExceptionMessage :
            "ProtectionManager PlayReady License Acquisition Service Request failed: " + ExceptionMessage);
    CompletionNotifier.Complete(bResult);
}
/// <summary>
/// Proactive Individualization Request 
/// </summary>
async void ProActiveIndivRequest()
{
    PlayReadyIndividualizationServiceRequest indivRequest = new PlayReadyIndividualizationServiceRequest();
    LogMessage("ProtectionManager PlayReady ProActive Individualization Service Request in progress...");
    bool bResultIndiv = await ReactiveIndivRequest(indivRequest, null);
    if (bResultIndiv == true)
        LogMessage("ProtectionManager PlayReady ProActive Individualization Service Request successful");
    else
        LogMessage("ProtectionManager PlayReady ProActive Individualization Service Request failed");

}
/// <summary>
/// Invoked to send the Individualization Request 
/// </summary>
async Task<bool> ReactiveIndivRequest(PlayReadyIndividualizationServiceRequest IndivRequest, MediaProtectionServiceCompletion CompletionNotifier)
{
    bool bResult = false;
    Exception exception = null;
    LogMessage("ProtectionManager PlayReady Individualization Service Request in progress...");
    try
    {
        await IndivRequest.BeginServiceRequest();
    }
    catch (Exception ex)
    {
        exception = ex;
    }
    finally
    {
        if (exception == null)
        {
            bResult = true;
        }
        else
        {
            COMException comException = exception as COMException;
            if (comException != null && comException.HResult == MSPR_E_CONTENT_ENABLING_ACTION_REQUIRED)
            {
                IndivRequest.NextServiceRequest();
            }
        }
    }
    if (bResult == true)
        LogMessage("ProtectionManager PlayReady Individualization Service Request successful");
    else
        LogMessage("ProtectionManager PlayReady Individualization Service Request failed");
    if (CompletionNotifier != null) CompletionNotifier.Complete(bResult);
    return bResult;

}
/// <summary>
/// Invoked to send a PlayReady request (Individualization or License request)
/// </summary>
async void ProtectionManager_ServiceRequested(MediaProtectionManager sender, ServiceRequestedEventArgs srEvent)
{
    LogMessage("ProtectionManager ServiceRequested");
    if (srEvent.Request is PlayReadyIndividualizationServiceRequest)
    {
        PlayReadyIndividualizationServiceRequest IndivRequest = srEvent.Request as PlayReadyIndividualizationServiceRequest;
        bool bResultIndiv = await ReactiveIndivRequest(IndivRequest, srEvent.Completion);
    }
    else if (srEvent.Request is PlayReadyLicenseAcquisitionServiceRequest)
    {
        PlayReadyLicenseAcquisitionServiceRequest licenseRequest = srEvent.Request as PlayReadyLicenseAcquisitionServiceRequest;
        LicenseAcquisitionRequest(licenseRequest, srEvent.Completion, PlayReadyLicenseUrl, PlayReadyChallengeCustomData);
    }
}

Dans la méthode associée à l’événement Click sur le bouton « Play », initialiser PlayReadyLicenseUrl avec l’Url du serveur PlayReady (si celui-ci est défini), initialiser PlayReadyChallengeCustomData avec les données nécessaires pour la génération du challenge PlayReady (si celles-ci sont définies), initialiser la Source du Player avec l’url du fichier à jouer. S’il s’agit d’un contenu MPEG DASH, appeler la méthode RegisterDashPlugin préalablement.

 PlayReadyLicenseUrl = PlayReadyUri.Text;
PlayReadyChallengeCustomData = CustomData.Text;
RegisterDashPlugin((MediaUri.Text.EndsWith(".mpd", StringComparison.CurrentCultureIgnoreCase) || 
                     MediaUri.Text.EndsWith("manifest(format=mpd-time-csf)", StringComparison.CurrentCultureIgnoreCase)));
Player.Source = new Uri(MediaUri.Text);

Les urls associées aux contenus Smooth Streaming et MPEG DASH protégés par PlayReady sont disponibles sur Microsoft Azure

 
http://playready.directtaps.net/smoothstreaming/SSWSS720H264PR/SuperSpeedway_720.ism/Manifest
http://wams.edgesuite.net/media/SintelTrailer_Smooth_from_WAME_CENC/NoSubSampleAdjustment/sintel_trailer-1080p.ism/manifest(format=mpd-time-csf)
http://wams.edgesuite.net/media/Tears_of_Steel_Smooth_1080p_Protected2/tears_of_steel_1080p.ism/manifest(format=mpd-time-csf)

Par défaut, le contenu Smooth Streaming suivant

http://playready.directtaps.net/smoothstreaming/SSWSS720H264PR/SuperSpeedway_720.ism/Manifest utilisé pour les tests PlayReady est associé à l’URL suivante, la licence retournée par le serveur PlayReady sera persistante:

http://playready.directtaps.net/pr/svc/rightsmanager.asmx

En utilisant l’URL suivante pour l’acquisition de licence:

http://playready.directtaps.net/pr/svc/rightsmanager.asmx?PlayRight=1&UseSimpleNonPersistentLicense=1

Cette URL renverra une licence non persistante. A chaque tentative de lecture du contenu smooth streaming, une requête sera transmise au serveur PlayReady.

Enfin, par défaut, le challenge custom data est vide, vous devez modifier ce champ si le serveur PlayReady attend un challenge custom data spécifique.

Applications Windows Phone 8.0:

Ajouter une référence au:

« Microsoft.Web.Media.SmoothStreaming »,

« Microsoft Player Framework »,

« Microsoft Player Framework Adaptive Streaming Plugin»,

« Microsoft Player Framework Dash Plugin» pour l’application Windows Phone 8.0.

image              image

Librairie Http Client: Les exemples d’application PlayReady fournis avec cet article sont basés sur Player Framework V2.0 et l’acquisition des licences PlayReady est basée sur la classe HttpClient pour les deux plates-formes Windows et Windows Phone.  
HttpClient fait partie intégrante de NET Framework 4.5 et des applications Windows Store et fournit aux développeurs la possibilité d’écrire très facilement des applications se connectant à des services Internet incluant les services basés sur des APIs REST. HttpClient est également disponible pour les développeurs Windows Phone 8.0 si vous installez le package Nuget : « Microsoft http Client Libraries »

Sur la MainPage XAML insérer le « PlayerFramework:MediaPlayer » et nommer le « Player »

 <PlayerFramework:MediaPlayer  Visibility="Visible" x:Name="Player"  Grid.Row="3" Grid.Column="0" 
Grid.ColumnSpan="3"  Grid.RowSpan="1"  Margin="10,10,10,10" Background="Black" Foreground="Black" 
IsAudioSelectionVisible="False" IsCaptionSelectionVisible="False"     HorizontalAlignment="Center"  VerticalAlignment="Center"  IsFullScreenVisible="False" />

Créez une méthode RegisterPlugins qui associe le plugin Adaptive avec le Player et initialise LicenseAcquirer du Media Element du Player. Cette méthode est appelée dans la méthode OnNavigatedTo.

Créez une méthode RegisterDashPlugins qui associe le plugin DashDownloaderPlugin avec le plugin Adaptive du Player. Cette méthode est appelée avant de jouer un contenu MPEG DASH.

 
public Microsoft.PlayerFramework.Adaptive.AdaptivePlugin adaptivePlugin;
public Microsoft.Media.AdaptiveStreaming.Dash.DashDownloaderPlugin dashDownloaderPlugin;

void RegisterDashPlugin(bool bRegister)
{
    Microsoft.PlayerFramework.Adaptive.AdaptivePlugin plugin = Player.Plugins.OfType<Microsoft.PlayerFramework.Adaptive.AdaptivePlugin>().First();
    if (plugin != null)
    {
        if (bRegister == true)
        {
            LogMessage("Register DASH plugin");
            if (dashDownloaderPlugin == null)
                dashDownloaderPlugin = new Microsoft.Media.AdaptiveStreaming.Dash.DashDownloaderPlugin();
            plugin.DownloaderPlugin = dashDownloaderPlugin;
        }
    }
}
void RegisterPlugins()
{
    LogMessage("Register plugins");
    if (adaptivePlugin == null)
        adaptivePlugin = new Microsoft.PlayerFramework.Adaptive.AdaptivePlugin();
    Player.Plugins.Add(adaptivePlugin);

    // PlayReady
    // Init PlayReady 
    adaptivePlugin.MediaElement.LicenseAcquirer = new WindowsPhoneLicenseAcquisition(null);
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    LogMessage("OnNavigatedTo");
    base.OnNavigatedTo(e);
    PhoneApplicationService.Current.Deactivated += App_Suspending;
    PhoneApplicationService.Current.Activated += App_Resuming;
    Player.MediaEnded += Player_MediaEnded;
    Player.MediaOpened += Player_MediaOpened;
    Player.MediaFailed += Player_MediaFailed;
    RegisterPlugins();
}

Pour supporter PlayReady l’application doit appeler le serveur de licence pour acquérir la licence PlayReady associé au contenu à jouer par le Player. Il faut pour cela inclure les fichiers CommonLicenseRequest.cs et WindowsPhoneLicenseAcquisition.cs dans le projet. Le fichier CommonLicenseRequest.cs contient le code source de la classe commune utilisant HttpClient pour l’acquisition de la licence PlayReady. Le fichier WindowsPhoneLicenseAcquisition.cs contient le code source de la classe WindowsPhoneLicenseAcquisition dérivée de la classe PlayReady LicenseAcquirer utilisée pour l’acquisition de licence PlayReady.

Dans la méthode associée à l’événement Click sur le bouton « Play »,

- initialiser PlayReadyLicenseUrl avec l’Url du serveur PlayReady (si celui-ci est défini),

- initialiser PlayReadyChallengeCustomData avec les données nécessaires pour la génération du challenge PlayReady (si celles-ci sont définies),

- initialiser la Source du Player à null et

- appeler la méthode « Close » du Player

- Si PlayReadyChallengeCustomData est renseigné, initialiser LicenseAcquirer.ChallengeCustomData du Media Element associé au Player.

- Si PlayReadyLicenseUrl est renseigné, initialiser LicenseAcquirer.LicenseServerUriOverride du Media Element associé au Player.

- appeler la méthode RegisterDashPlugin

- puis initialiser la Source du Player avec l’url du fichier à jouer.

 PlayReadyLicenseUrl = PlayReadyUri.Text;
     PlayReadyChallengeCustomData = CustomData.Text;

     // Reset the source and close the player
     Player.Source = null;
     Player.Close();

     Microsoft.PlayerFramework.Adaptive.AdaptivePlugin ap = Player.Plugins.OfType<Microsoft.PlayerFramework.Adaptive.AdaptivePlugin>().FirstOrDefault();
     if (ap != null)
     {
         if (!string.IsNullOrEmpty(PlayReadyChallengeCustomData))
         {
             System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
             byte[] b = encoding.GetBytes(PlayReadyChallengeCustomData);
             ap.MediaElement.LicenseAcquirer.ChallengeCustomData = Convert.ToBase64String(b, 0, b.Length);
         }
         if (!string.IsNullOrEmpty(PlayReadyLicenseUrl))
             ap.MediaElement.LicenseAcquirer.LicenseServerUriOverride = new Uri(PlayReadyLicenseUrl, UriKind.Absolute);
         else
             ap.MediaElement.LicenseAcquirer.LicenseServerUriOverride = null;
     }
 
       Player.Visibility = System.Windows.Visibility.Visible;
       PlayerSSME.Visibility = System.Windows.Visibility.Collapsed;

     /// if MPEG DASH Uri Register Dash Plugin 
     RegisterDashPlugin((MediaUri.Text.EndsWith(".mpd", StringComparison.CurrentCultureIgnoreCase) || MediaUri.Text.EndsWith("manifest(format=mpd-time-csf)", StringComparison.CurrentCultureIgnoreCase)));

     Player.Source = new Uri(MediaUri.Text);
Player.Source = null;
Player.Close();

RegisterDashPlugin((MediaUri.Text.EndsWith(".mpd", StringComparison.CurrentCultureIgnoreCase) || 
                     MediaUri.Text.EndsWith("manifest(format=mpd-time-csf)", StringComparison.CurrentCultureIgnoreCase)));
Player.Source = new Uri(MediaUri.Text);

Les urls associées au contenu Smooth Streaming et MPEG DASH protégés par PlayReady sont disponibles sur Microsoft Azure

 
http://playready.directtaps.net/smoothstreaming/SSWSS720H264PR/SuperSpeedway_720.ism/Manifest
http://wams.edgesuite.net/media/SintelTrailer_Smooth_from_WAME_CENC/NoSubSampleAdjustment/sintel_trailer-1080p.ism/manifest(format=mpd-time-csf)
http://wams.edgesuite.net/media/Tears_of_Steel_Smooth_1080p_Protected2/tears_of_steel_1080p.ism/manifest(format=mpd-time-csf)

GENERATION DES APPLICATIONS

Pour générer les exemples d’application pour Windows Phone 8.0, Windows Phone 8.1 et Windows 8.1 vous devez disposer d’un ordinateur sous Windows 8.1, du Visual Studio 2013 Update 2 avec le Windows Phone 8.1 SDK et des SDKs supplémentaires :

TELECHARGEMENT DES PROJETS

Téléchargement:                  C# (15.7 MB)

Pre-requis:                           Windows Phone 8, Windows 8.1, Windows Phone 8.1, Visual Studio 2013 Update 2

Dernière modification:         5/28/2014

Licence:                                MS-LPL

Technologies:                       PlayReady, WMV, MP4, MPEG2-TS, Smooth Streaming, MPEG DASH, 
                                             Player Framework, C#, XAML

Thème:                                  PlayReady Smooth Streaming MPEG DASH Player for Windows Phone and Windows Store