2017-06-28 7 views
0

Bonjour, je suis en train de changer mon implémentation DRM de Exoplayer 1.x en Exoplayer 2.x mais j'ai quelques exceptions et je ne peux pas lire la vidéo sous licence DRM. Mon gestionnaire de session drm:Exoplayer2 DRM exception shouldWaitForKeys

protected DrmSessionManager<FrameworkMediaCrypto> generateDrmSessionManager() { 
     // DRM is only supported on API 18 + in the ExoPlayer 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { 
      return null; 
     } 

     // Widevine will capture the majority of use cases however playready is supported on all AndroidTV devices 
     UUID uuid = C.WIDEVINE_UUID; 
     final String licenseURL = "http://video.aaa"; 

     HttpMediaDrmCallback drmCallback = 
       new HttpMediaDrmCallback(
         licenseURL, buildHttpDataSourceFactory(false), KEY_REQUEST_PROPERTIES); 

     try { 
      return new DefaultDrmSessionManager<>(
        uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, null, mainHandler, capabilitiesListener); 
     } catch (Exception e) { 
      Log.d(TAG, "Unable to create a DrmSessionManager due to an exception", e); 
      return null; 
     } 
    } 

J'ai la drmSession et puis quand HttpMediaDrmCallback exécute

executePost(dataSourceFactory, url, request.getData(), requestProperties); 

l'intérieur il y a l'appel qui provoque la onDrmSessionManagerError (java.lang.IllegalArgumentException) lors de l'appel:

HttpDataSource dataSource = dataSourceFactory.createDataSource(); 

à l'adresse com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.shouldWaitForKeys (MediaCodecRenderer.java:735) at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer (MediaCodecRenderer.java:676) at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render (MediaCodecRenderer.java:511) at com.google.android .exoplayer2.ExoPlayerImplInternal.doSomeWork (ExoPlayerImplInternal.java:479) à com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage (ExoPlayerImplInternal.java:308) à android.os.Handler.dispatchMessage (Handler.java:98) à android.os.Looper.loop (Looper.java:135) à android.os.HandlerThread.run (HandlerThread.java:61) Causé par: com.googl e.android.exoplayer2.drm.DrmSession $ DrmSessionException: java.lang.IllegalArgumentException at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.onError (DefaultDrmSessionManager.java:604) at com.google.android.exoplayer2.drm .DefaultDrmSessionManager.onKeysError (DefaultDrmSessionManager.java:599) à com.google.android.exoplayer2.drm.DefaultDrmSessionManager.onKeyResponse (DefaultDrmSessionManager.java:559) à 900 $ com.google.android.exoplayer2.drm.DefaultDrmSessionManager.access (DefaultDrmSessionManager.java:50) at com.google.android.exoplayer2.drm.DefaultDrmSessionManager $ PostResponseHandler.handleMessage (DefaultDrmSessionManager.java:679) à android.os.Handler.dispatchMessage (Handler.java:102) à android.os.Looper.loop (Looper.java:135) à android.os.HandlerThread.run (HandlerThread.java:61) Causé par: java.lang.IllegalArgumentException à com.google.android.exoplayer2.util.Assertions.checkNotEmpty (Assertions.java:138) à com.google.android.exoplayer2.upstream.DefaultHttpDataSource. (DefaultHttpDataSource.java:148) à com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory.createDataSourceInternal (DefaultHttpDataSourceFactory.java:81) at com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory.createDataSourc eInternal (DefaultHttpDataSourceFactory.java:22) at com.google.android.exoplayer2.upstream.HttpDataSource $ BaseFactory.createDataSource (HttpDataSource.java:176) at com.google.android.exoplayer2.drm.HttpMediaDrmCallback.executePost (HttpMediaDrmCallback. java: 139) à com.google.android.exoplayer2.drm.HttpMediaDrmCallback.executeKeyRequest (HttpMediaDrmCallback.java:134) à com.google.android.exoplayer2.drm.DefaultDrmSessionManager $ PostRequestHandler.handleMessage (DefaultDrmSessionManager.java: 702) à android.os.Handler.dispatchMessage (Handler.java:102) à android.os.Looper.loop (Looper.java:135) à android.os.HandlerThread.run (HandlerThread.java: 61)

Je ne sais pas pourquoi il se bloque, comme dans mon Exoplayer 1.x mise en œuvre fonctionnait bien.

Répondre

1

L'exception est causée par la chaîne de userAgent étant nulle ou zéro longueur ici:

public DefaultHttpDataSource(String userAgent, Predicate<String> contentTypePredicate, 
     TransferListener<? super DefaultHttpDataSource> listener, int connectTimeoutMillis, 
     int readTimeoutMillis, boolean allowCrossProtocolRedirects, 
     RequestProperties defaultRequestProperties) { 
    this.userAgent = Assertions.checkNotEmpty(userAgent); <---- Exception is here 
    this.contentTypePredicate = contentTypePredicate; 
    this.listener = listener; 
    this.requestProperties = new RequestProperties(); 
    this.connectTimeoutMillis = connectTimeoutMillis; 
    this.readTimeoutMillis = readTimeoutMillis; 
    this.allowCrossProtocolRedirects = allowCrossProtocolRedirects; 
    this.defaultRequestProperties = defaultRequestProperties; 
    } 

Le userAgent est une combinaison du nom de l'application et la version de la bibliothèque ExoPlayer:

/** 
    * Returns a user agent string based on the given application name and the library version. 
    * 
    * @param context A valid context of the calling application. 
    * @param applicationName String that will be prefix'ed to the generated user agent. 
    * @return A user agent string generated using the applicationName and the library version. 
    */ 
    public static String getUserAgent(Context context, String applicationName) { 
    String versionName; 
    try { 
     String packageName = context.getPackageName(); 
     PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); 
     versionName = info.versionName; 
    } catch (NameNotFoundException e) { 
     versionName = "?"; 
    } 
    return applicationName + "/" + versionName + " (Linux;Android " + Build.VERSION.RELEASE 
     + ") " + ExoPlayerLibraryInfo.VERSION_SLASHY; 
    } 

Vous pouvez voir des exemples d'utilisation et de définition dans l'application de démonstration: https://github.com/google/ExoPlayer/tree/release-v2/demo

Vous trouverez également des informations sur la configuration de MediaPlaye. r dans la documentation (https://google.github.io/ExoPlayer/guide.html) qui comprend cet exemple montrant l'userAgent étant fixé:

// Measures bandwidth during playback. Can be null if not required. 
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); 
// Produces DataSource instances through which media data is loaded. 
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, 
    Util.getUserAgent(context, "yourApplicationName"), bandwidthMeter); 
// Produces Extractor instances for parsing the media data. 
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); 
// This is the MediaSource representing the media to be played. 
MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri, 
    dataSourceFactory, extractorsFactory, null, null); 
// Prepare the player with the source. 
player.prepare(videoSource); 
+0

ne semble pas être le causes..currently J'installe l'agent utilisateur correctement. – Billyjoker

+1

@Billyjoker - si vous jetez un coup d'oeil à la Stacktrace, vous pouvez voir l'exception lancée par: java.lang.IllegalArgumentException sur com.google.android.exoplayer2.util.Assertions.checkNotEmpty (Assertions.java:138) at com .google.android.exoplayer2.upstream.DefaultHttpDataSource '. Il se peut que vous l'ayez défini mais qu'il soit réinitialisé ou annulé avant que vous l'utilisiez, ou que la mauvaise variable soit transmise par erreur. – Mick

+0

Vous aviez raison !! Le problème était que j'ai créé DefaultHttpDataSourceFactory avec mon agent utilisateur avec une valeur vide, mais lorsque j'ai créé DefaultDataSourceFactory, l'agent utilisateur avait raison, mais il a levé l'exception shouldWaitForKeys. Donc, j'ai rempli l'agent utilisateur vide et fonctionne comme un charme !! Merci beaucoup – Billyjoker