Integração com o ExoPlayer

Este documento fornece uma visão geral da integração de filas e DRM suporte.

Melhorias de DRM

A demonstração do Cast do ExoPlayer foi atualizada para utilizar uma forma estruturada de transmitir a configuração de DRM usando MediaInfo do ExoPlayer para um aplicativo receptor. Exemplo do Google Cast também usa um receptor de demonstração que inclui o mesmo código nesta visão geral, permitindo para testar o suporte ao DRM. No entanto, se você quiser transmitir conteúdo protegido por DRM conteúdo, crie e hospede seu próprio Receptor da Web.

Antes de começar, recomendamos que você se familiarize documentação sobre o suporte ao DRM em Google Cast e o ExoPlayer. Essa visão geral mostra como para conectar a configuração DRM do ExoPlayer a um receptor da Web. Para informações sobre como utilizar o DRM no ExoPlayer, consulte o Site do ExoPlayer (em inglês).

Fornecer a configuração de DRM

O app de demonstração do ExoPlayer contém um exemplo de código que mostra como fornecer DRM. como parte de um MediaItem. As quatro opções que você pode configurar são:

  • Cabeçalhos: um dicionário de cabeçalhos aplicado à solicitação HTTPS para recuperar a licença de DRM.
  • URL da licença: o URL usado para adquirir a licença.
  • Sistema de proteção: o esquema de proteção DRM usado para proteger o conteúdo, por exemplo, Widevine.

A configuração de DRM fornecida ao ExoPlayer é enviada ao receptor aplicativo como uma propriedade em customData no MediaInformation como parte de uma solicitação de carregamento. Por padrão, essa propriedade é chamada exoPlayerConfig, que corresponde à definição a seguir.

/**
 * Extended configuration settings for ExoPlayer.
 */
ExoPlayerConfig class {
   constructor() {
    /**
     * Dictionary of headers to apply to the license request.
     * @type {!Object|undefined}
     */
    this.headers;

    /**
     * The URL for your DRM server.
     * @type {string|undefined}
     */
    this.licenseUrl;

    /**
     * Preferred protection system to use for decrypting content.
     * @type {!cast.framework.ContentProtection|undefined}
     */
    this.protectionSystem;

    /**
     * Indicates whether CORS Access-Control requests should be made using
     * credentials such as cookies or authorization headers.
     *
     * If withCredentials is set to true then Access-Control-Allow-Origin cannot
     * be set to '*'.
     * @type {boolean|undefined}
     */
    this.withCredentials;
  }
}

Configuração inicial

Dependendo da solução de DRM usada, talvez seja necessário configurar um licenseRequestHandler. e um mediaPlaybackInfoHandler. O licenseRequestHandler permite personalizar como o CAF solicita uma licença do seu servidor de chave de licença. A O mediaPlaybackInfoHandler permite modificar o PlaybackConfig em cada item de mídia se, por exemplo, cada conteúdo precisar usar uma tag um URL de servidor de licenças diferente.

Para capturar uma cópia do ExoPlayerConfig de cada objeto de solicitação de carregamento, crie um interceptador de solicitação de carregamento no aplicativo do SDK do receptor da Web.

A primeira etapa é registrar seus gerenciadores antes de iniciar a transmissão para o aplicativo.

const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();

playbackConfig.licenseRequestHandler =
    licenseRequestHandler;
context.getPlayerManager().setMediaPlaybackInfoHandler(
    mediaPlaybackInfoHandler);
context.getPlayerManager().setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    loadInterceptor);

// starts the Cast application
context.start({playbackConfig: playbackConfig});

Interceptador de solicitação de carregamento

O interceptador da solicitação de carregamento é um callback que permite visualizar e modificar um Solicitação de carregamento de transmissão antes que o CAF tente carregar um item de mídia. Importante, é chamado antes do manipulador de solicitação de licença e do gerenciador de informações de reprodução de mídia.

O interceptador da solicitação de carregamento recebe um LoadRequestData. que contém a configuração do Exo Player que foi enviada pelo seu app. Você pode salve este objeto como uma variável global para usar em seu manipulador de solicitação de licença e gerenciador de informações de reprodução de mídia.

loadInterceptor(loadRequestData) {
    // not every load request will have a customData object
    if (loadRequestData.media && loadRequestData.media.customData &&
            loadRequestData.media.customData['exoPlayerConfig']) {
        // exoPlayerConfig is a global variable here
        exoPlayerConfig =
                loadRequestData.media.customData['exoPlayerConfig'];
    }

    // you must return the loadRequestData object
    return loadRequestData;
}

Gerenciador de solicitações de licença

O gerenciador de solicitações de licença permite personalizar a solicitação HTTPS da Web O receptor faz para seu servidor de licenças. O gerenciador recebe um NetworkRequestInfo , que pode ser usado para adicionar cabeçalhos HTTP, incluir cookies ou até mesmo modifique o URL. O manipulador deve retornar esse objeto.

Por exemplo, se precisar adicionar cabeçalhos personalizados à solicitação de licença, poderia criar um gerenciador de solicitações de licença semelhante a este:

licenseRequestHandler(networkRequestInfo) {
    if (!exoPlayerConfig) {
        return networkRequestInfo;
    }

    networkRequestInfo.headers =
            exoPlayerConfig.headers ? exoPlayerConfig.headers : undefined;

    return networkRequestInfo;
}

Gerenciador de informações de reprodução de mídia

Com o gerenciador de informações de reprodução de mídia, é possível fazer mudanças na reprodução para cada item de mídia. O gerenciador recebe um LoadRequestData e um PlaybackConfig, você deve retornar uma configuração de reprodução. O gerenciador de informações de reprodução de mídia será chamado antes que cada item transmitido seja carregado. Se você tiver URLs de licença por conteúdo, para mudá-los e o sistema de proteção antes da carga.

mediaPlaybackInfoHandler(loadRequest, playbackConfig) {
    if (!exoPlayerConfig) {
        return;
    }

    playbackConfig.licenseUrl = exoPlayerConfig.licenseUrl ?
            exoPlayerConfig.licenseUrl :
            undefined;
    playbackConfig.protectionSystem = exoPlayerConfig.protectionSystem ?
            exoPlayerConfig.protectionSystem :
            undefined;

    return playbackConfig;
}

Outros recursos

Cada implementação de DRM é personalizada, e o código é fornecido como demonstração . Consulte o provedor de DRM para verificar se você implementou o DRM nos aplicativos ExoPlayer e Cast.

O site do ExoPlayer (em inglês) apresenta documentação atualizada. e comunicados. Problemas com o ExoPlayer e a integração dele com o Cast podem ser relatado no GitHub do ExoPlayer (em inglês) repositório de dados.