如何使用ExoPlayer

时间:2015-10-27 09:27:59

标签: android exoplayer

我想在我的应用中使用 ExoPlayer 。你能告诉我哪个是最简单的例子吗?我试图做https://github.com/google/ExoPlayer/,但这对我来说并不容易。我尝试导入library作为模块,然后收到bintray-release错误。

2 个答案:

答案 0 :(得分:4)

如主Readme.md中所述,您可以像对待任何其他依赖项一样导入ExoPlayer:

在您的应用中build.gradle> dependencies添加:

compile 'com.google.android.exoplayer:exoplayer:rX.X.X'

截至2015年10月27日,当前版本为r1.5.1。请参阅here

答案 1 :(得分:2)

老问题但由于ExoPlayer教程太少,我写了这篇文章。我最近将使用Android默认媒体播放器的应用转换为ExoPlayer。性能提升惊人,适用于更广泛的设备。然而,它有点复杂。

此示例专门用于播放http音频流,但通过试验,您可以轻松地将其调整为其他任何内容。此示例使用ExoPlayer的最新v1.xx,目前为v1.5.11:

首先,将它放在build.gradle(Module:app)文件的" dependencies"下:

compile 'com.google.android.exoplayer:exoplayer:r1.5.11'

此外,您的班级应该实施ExoPlayer.Listener

...implements ExoPlayer.Listener

现在,这里是播放http音频流的相关代码:

    private static final int RENDERER_COUNT = 1; //since we want to render simple audio
    private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; // for http mp3 audio stream use these values
    private static final int BUFFER_SEGMENT_COUNT = 256; // for http mp3 audio steam use these values
    private ExoPlayer exoPlayer;

// for http mp3 audio stream, use these values
    int minBufferMs = 1000;
    int minRebufferMs = 5000;

    // Prepare ExoPlayer
    exoPlayer = ExoPlayer.Factory.newInstance(RENDERER_COUNT, minBufferMs, minRebufferMs);

    // String with the url of the stream to play
    String stream_location = "http://audio_stream_url";        
    // Convert String URL to Uri
    Uri streamUri = Uri.parse(stream_location);

    // Settings for ExoPlayer
    Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
    String userAgent = Util.getUserAgent(ChicagoPoliceRadioService.this, "ExoPlayer_Test");
    DataSource dataSource = new DefaultUriDataSource(ChicagoPoliceRadioService.this, null, userAgent);
    ExtractorSampleSource sampleSource = new ExtractorSampleSource(
            streamUri, dataSource, allocator, BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT);
    MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource, MediaCodecSelector.DEFAULT);

    // Attach listener we implemented in this class to this ExoPlayer instance
    exoPlayer.addListener(this);

    // Prepare ExoPlayer
    exoPlayer.prepare(audioRenderer);

    // Set full volume
    exoPlayer.sendMessage(audioRenderer, MediaCodecAudioTrackRenderer.MSG_SET_VOLUME, 1f);

    // Play!
    exoPlayer.setPlayWhenReady(true);

有三种回调方法:

 @Override
 public void onPlayWhenReadyCommitted() {

    // No idea what would go here, I left it empty

}

// Called when ExoPlayer state changes
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

    // If playbackState equals STATE_READY (4), that means ExoPlayer is set to
    // play and there are no errors
    if (playbackState == ExoPlayer.STATE_READY) {
        // ExoPlayer prepared and ready, no error
        // Put code here, same as "onPrepared()"
       }
}

// Called on ExoPlayer error
@Override
public void onPlayerError(ExoPlaybackException error) {
    // ExoPlayer error occurred
    // Put your error code here
}

当你完成比赛时,按照惯例做准备:

if (exoPlayer != null) {
                exoPlayer.stop();
                exoPlayer.release();
            }

注意:我仍然不能100%确定所有ExoPlayer设置的详细信息。我从未尝试过播放视频。请注意,这是针对ExoPlayer的1.5.x版本,2.0发生了很大变化,我仍然没有想到它。我强烈推荐这个代码给任何拥有从网络传输音频的应用程序,因为性能提升是令人难以置信的,对于我的应用程序,它修复了三星手机的问题,在停止之前只播放大约30秒的音频。