Streaming de vídeo no Android usando o ExoPlayer

Navendra Jha Blocked Unblock Seguir Seguindo 25 de fevereiro

Music / Video player é um dos primeiros aplicativos essenciais que baixamos em nosso telefone quando compramos um novo. Além disso, o aplicativo de música / vídeo já percorreu um longo caminho e agora a maior parte do conteúdo é transmitida por meio da flutuação da rede móvel, juntamente com o novo tipo de conteúdo compartilhado por pessoas, como vídeo e conteúdo em 3D.
Neste artigo, aprenderemos como superar todos esses desafios e oferecer suporte a um novo tipo de conteúdo em um aplicativo Android usando a biblioteca do ExoPlayer .

Foto de Wahid Khene no Unsplash

O artigo me aborrece, mostre-me o código

Se você quiser pular diretamente no código, verifique o seguinte repositório do GitHub com a documentação do código.

navi25 / AndroidPlay
Um player de mídia baseado em exoplayer para Android. Contribua para o desenvolvimento do navi25 / AndroidPlay criando uma conta em… github.com

Visão geral do ExoPlayer

O ExoPlayer é uma biblioteca de código aberto separada do Android Framework, mas integrada à API do Android MediaCodec e oferece suporte a recursos essenciais, como o Dynamic Adaptive Streaming sobre HTTP (DASH) , Smooth Streaming , criptografia comum que não é suportada pela API de mídia integrada do Android.

Novos Padrões e Requisitos – DASH, Smooth Streaming e Common Encryption (Opcional)

No passado, a maioria dos vídeos e áudio utilizava protocolos de streaming como RTP (Real Time Protocol) ou RTSP (Real Time Streaming Protocol), o que significa que depende da conexão persistente entre o dispositivo e o servidor que envia o vídeo / áudio. O problema com essa abordagem é que, desde seu Stateful, ele usa mais largura de banda e não tem a capacidade de alterar a fonte em tempo de execução e, portanto, é menos adequado às necessidades atuais de computação móvel.

As novas tecnologias, como o DASH by MPEG e o Smooth Streaming da Microsoft, resolvem esse problema baseando sua tecnologia em uma conexão HTTP sem estado e com um streaming de taxa de bits adaptável. A principal vantagem dessas tecnologias é que é muito mais flexível, como a fonte de vídeo pode ser alterada em tempo de execução, o vídeo pode ser transmitido de qualquer segmento do vídeo.

Confira a seguinte série de artigos do HowStuffWorks que descreveu RTS e DASH em detalhes.

Como o DASH funcionará
Você está animado empoleirado em sua cadeira favorita com o tablet na mão. O trailer do filme que você está morrendo… electronics.howstuffworks.com

Vamos começar

Add Dependencies – Build.gradle (Módulo: app)

 dependências { 
// Outras dependências

// Exoplayer
implementação "com.google.android.exoplayer: exoplayer: $ exoPlayerVersion"

// Exoplayer IMA (Interactive Media Ads)
implementation ("com.google.android.exoplayer: extension-ima: $ exoPlayerVersion") {
excluir módulo: 'support-v4'
}
}

Adicionando Layout

 <com.google.android.exoplayer2.ui.PlayerView 
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

Reproduzindo um vídeo básico

Para reproduzir um vídeo básico, precisamos seguir os seguintes passos: –

Configuração do Player View

Obtenha uma referência ao PlayerView definido no layout.

 @Override 
protected void onCreate(Bundle savedInstanceState) {

playerView = findViewById(R.id.player_view);
}

Inicialize o Player

  1. O próximo passo é inicializar nossa instância do player de vídeo. Isso requer:-
    * Renderer – Ele lida com a configuração da conexão (HTTP / local) com a fonte, a reprodução de vídeo e o manipulador.
    * Track Selector – Como o nome sugere, ele lida com a seleção de faixa e gerenciamento que será consumido pelo renderizador.
    * Load Control – Controla o buffer da mídia.
  2. Em seguida, precisamos configurar parâmetros para o jogador.
    * playWhenReady – Um parâmetro booleano que define se a reprodução deve continuar quando o PlaybackState for STATE_READY. Além disso, se o player já estiver no estado pronto, esse método pode ser usado para pausar e retomar a reprodução. Inicialize isso com True.
    *
    currentWindowIndex – Este é um valor inteiro que retorna o índice da janela atual (pense nisso como bucket de buffer) atualmente sendo reproduzido.
    *
    playbackPosition – Este é o quadro onde a reprodução está atualmente posicionada.
  3. Conectando tudo. Finalmente, vamos ligar tudo para que a nossa função initializePlayer se torne como –
 private void initializePlayer() { 
player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(), new DefaultLoadControl());

playerView.setPlayer(player);

player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
}

Construir Fonte de Mídia

O próximo passo é construir a fonte de mídia que é a fonte do nosso arquivo de mídia para o nosso player criado acima. O Exoplayer vem com muitas fábricas padrão do MediaSource, conforme mostrado no código abaixo:

Plug-in Tudo e Hit Play

Para a parte final, tudo o que precisamos fazer é adicionar uma fonte de mídia relevante ao nosso player e clicar em play.

Faça a tela cheia

 @SuppressLint ("InlinedApi") 
diversão privada hideSystemUi () {
playerView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LOW_PROFILE
ou View.SYSTEM_UI_FLAG_FULLSCREEN
ou View.SYSTEM_UI_FLAG_LAYOUT_STABLE
ou View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
ou View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
ou View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)
}

Por fim, escreveremos nossa função de reprodução, que terá um único URL ou matriz de URL como parâmetro e os reproduzirá de acordo.

 var currUri = null 
var currUriList = null
 // Reproduzir um único vídeo 
brincadeira divertida (uri: Uri?) {
if (uri == null) retornar
currUri = uri
initPlayer ()
preparePlayer (uri !!)
hideSystemUi ()
}

// Função sobrecarregada para reproduzir toda a playlist
jogo divertido (uriList: Array <Uri>?) {
if (uriList == null) retorno
currUriList = uriList
initPlayer ()
preparePlayer (uriList !!)
hideSystemUi ()
}

Lidando com o Ciclo de Vida do Jogador

Por fim, trataremos o ciclo de vida do player adequadamente para lidar com alterações de configuração e pausa e retomada de atividades.

Agora, basta chamar esses métodos de ciclo de vida no método apropriado de sua atividade, fragmento ou Observador do ciclo de vida.

TakeAway

  • O ExoPlayer pode suportar vários formatos de vídeo e áudio. (Verifique a seção BuildMediaSource)
  • Como o Exoplayer suporta streaming de taxa de bits adaptável, você pode usar essa técnica (usando a fonte de mídia DASH ou HLS) para fornecer uma melhor experiência ao usuário.
  • O ExoPlayer vem com muitos recursos úteis no topo da biblioteca MediaCodec integrada no Android e, assim, torna mais fácil desenvolver Video Players mais poderosos e impressionantes.

Codificação Feliz!