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.
Windows Phone 8 Windows Phone 8.1
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.
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
https://livestreamingvm.cloudapp.net/vod/wmv/test1.wmv
https://livestreamingvm.cloudapp.net/vod/mp4/test1.mp4
https://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 :
Windows 8.0 (not required for this application)
Smooth Streaming Client SDK for Windows 8.0:
https://visualstudiogallery.msdn.microsoft.com/04423d13-3b3e-4741-a01c-1ae29e84fea6
Windows 8.1
Smooth Streaming Client SDK for Windows 8.1:
https://visualstudiogallery.msdn.microsoft.com/0170c67c-c183-4fee-8dd4-c2b44d710d40
Windows Phone 8.0
Smooth Streaming Client 2.5 SDK for Silverlight and Windows Phone 8 applications:
https://www.microsoft.com/en-us/download/details.aspx?id=42080
Windows Phone 8.1
Smooth Streaming Client SDK for Windows Phone 8.1:
https://visualstudiogallery.msdn.microsoft.com/b837ddf3-6884-436e-aeb7-35c6151a8933
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.
Ajouter une référence au « Microsoft Smooth Streaming Client SDK for Windows Phone 8.1 » pour l’application Windows Phone 8.1.
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
https://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.
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
https://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 :
Windows 8.0 (not required for this application)
Smooth Streaming Client SDK for Windows 8.0:
https://visualstudiogallery.msdn.microsoft.com/04423d13-3b3e-4741-a01c-1ae29e84fea6
Windows 8.1
Smooth Streaming Client SDK for Windows 8.1:
https://visualstudiogallery.msdn.microsoft.com/0170c67c-c183-4fee-8dd4-c2b44d710d40
Windows Phone 8.0
Smooth Streaming Client 2.5 SDK for Silverlight and Windows Phone 8 applications:
https://www.microsoft.com/en-us/download/details.aspx?id=42080
Windows Phone 8.1
Smooth Streaming Client SDK for Windows Phone 8.1:
https://visualstudiogallery.msdn.microsoft.com/b837ddf3-6884-436e-aeb7-35c6151a8933
Windows Phone 8.0, Windows Phone 8.1 et Windows 8.1
Player Framework for Windows and Windows Phone V2.0:
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.
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.
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
https://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.
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
https://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 :
Windows 8.0 (not required for this application)
Smooth Streaming Client SDK for Windows 8.0:
https://visualstudiogallery.msdn.microsoft.com/04423d13-3b3e-4741-a01c-1ae29e84fea6
Windows 8.1
Smooth Streaming Client SDK for Windows 8.1:
https://visualstudiogallery.msdn.microsoft.com/0170c67c-c183-4fee-8dd4-c2b44d710d40
Windows Phone 8.0
Smooth Streaming Client 2.5 SDK for Silverlight and Windows Phone 8 applications:
https://www.microsoft.com/en-us/download/details.aspx?id=42080
Windows Phone 8.1
Smooth Streaming Client SDK for Windows Phone 8.1:
https://visualstudiogallery.msdn.microsoft.com/b837ddf3-6884-436e-aeb7-35c6151a8933
Windows Phone 8.0, Windows Phone 8.1 et Windows 8.1
Player Framework for Windows and Windows Phone V2.0:
Windows 8.0 (not required for this application)
PlayReady Client SDK for Windows 8.0:
https://visualstudiogallery.msdn.microsoft.com/e02ccac7-f3eb-4b53-b11a-c657d5631483
Windows 8.1
PlayReady Client SDK for Windows 8.1:
https://visualstudiogallery.msdn.microsoft.com/59be4d26-7f00-463e-9d61-2803c36b576b
Windows Phone 8.1
PlayReady Client SDK for Windows Phone 8.1:
https://visualstudiogallery.msdn.microsoft.com/477225f7-cb03-4fe6-8c5b-bfc76db7c09f
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:
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é:
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:
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.
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.
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
https://playready.directtaps.net/smoothstreaming/SSWSS720H264PR/SuperSpeedway_720.ism/Manifest
https://wams.edgesuite.net/media/SintelTrailer_Smooth_from_WAME_CENC/NoSubSampleAdjustment/sintel_trailer-1080p.ism/manifest(format=mpd-time-csf)
https://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
https://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:
https://playready.directtaps.net/pr/svc/rightsmanager.asmx
En utilisant l’URL suivante pour l’acquisition de licence:
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.
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
https://playready.directtaps.net/smoothstreaming/SSWSS720H264PR/SuperSpeedway_720.ism/Manifest
https://wams.edgesuite.net/media/SintelTrailer_Smooth_from_WAME_CENC/NoSubSampleAdjustment/sintel_trailer-1080p.ism/manifest(format=mpd-time-csf)
https://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 :
Smooth Streaming Client SDK for Windows 8.1:
https://visualstudiogallery.msdn.microsoft.com/0170c67c-c183-4fee-8dd4-c2b44d710d40
Smooth Streaming Client 2.5 SDK for Silverlight and Windows Phone 8 applications:
https://www.microsoft.com/en-us/download/details.aspx?id=42080
Smooth Streaming Client SDK for Windows Phone 8.1:
https://visualstudiogallery.msdn.microsoft.com/b837ddf3-6884-436e-aeb7-35c6151a8933
Player Framework for Windows and Windows Phone V2.0:
PlayReady Client SDK for Windows 8.1:
https://visualstudiogallery.msdn.microsoft.com/59be4d26-7f00-463e-9d61-2803c36b576b
PlayReady Client SDK for Windows Phone 8.1:
https://visualstudiogallery.msdn.microsoft.com/477225f7-cb03-4fe6-8c5b-bfc76db7c09f
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