Progressiva

O ExoPlayer pode reproduzir streams nos seguintes formatos de contêiner: Os formatos de amostra de áudio e vídeo contidos também precisam ser compatíveis. Consulte a seção Formatos de amostra para mais detalhes. Para saber mais sobre o suporte a contêineres e formatos de imagem, consulte Imagens.

Formato do contêiner Compatível Comentários
MP4 SIM
M4A SIM
FMP4 SIM
WebM SIM
Matroska SIM
MP3 SIM Alguns fluxos só podem ser pesquisados usando a busca de taxa de bits constante**
Ogg SIM Contendo Vorbis, Opus e FLAC
WAV SIM
MPEG-TS SIM
MPEG-PS SIM
FLV SIM Não é possível buscar*
ADTS (AAC) SIM Só é possível buscar usando taxa de bits constante**
FLAC SIM Usando a biblioteca FLAC ou o extrator FLAC na biblioteca ExoPlayer***
AMR SIM Só é possível buscar usando taxa de bits constante**

* A busca não é compatível porque o contêiner não fornece metadados (por exemplo, um índice de amostra) para permitir que um player de mídia faça uma busca de maneira eficiente. Se a busca for necessária, sugerimos usar um formato de contêiner mais adequado.

** Esses extratores têm flags FLAG_ENABLE_CONSTANT_BITRATE_SEEKING para ativar a busca aproximada usando uma taxa de bits constante. Essa funcionalidade não é ativada por padrão. A maneira mais simples de ativar essa funcionalidade para todos os extratores que a oferecem é usar DefaultExtractorsFactory.setConstantBitrateSeekingEnabled, conforme descrito aqui.

*** O extrator da biblioteca FLAC gera áudio bruto, que pode ser processado pelo framework em todos os níveis de API. O extrator FLAC da biblioteca ExoPlayer gera frames de áudio FLAC e, portanto, depende de um decodificador FLAC. Por exemplo, um decodificador MediaCodec que processa FLAC (necessário a partir do nível 27 da API) ou a biblioteca FFmpeg com o FLAC ativado. O DefaultExtractorsFactory usa o extrator de extensão se o aplicativo foi criado com a biblioteca FLAC. Caso contrário, ele usa o extrator da biblioteca ExoPlayer.

Usar MediaItem

Para reproduzir um stream progressivo, crie um MediaItem com o URI da mídia e transmita para o player.

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(progressiveUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(progressiveUri));
// Prepare the player.
player.prepare();

Como usar ProgressiveMediaSource

Para mais opções de personalização, crie um ProgressiveMediaSource e transmita diretamente para o player em vez de um MediaItem.

Kotlin

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a progressive media source pointing to a stream uri.
val mediaSource: MediaSource =
  ProgressiveMediaSource.Factory(dataSourceFactory)
    .createMediaSource(MediaItem.fromUri(progressiveUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a progressive media source pointing to a stream uri.
MediaSource mediaSource =
    new ProgressiveMediaSource.Factory(dataSourceFactory)
        .createMediaSource(MediaItem.fromUri(progressiveUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

Personalizar a reprodução

O ExoPlayer oferece várias maneiras de personalizar a experiência de reprodução de acordo com as necessidades do seu app. Consulte a página de personalização para ver exemplos.