在android中将媒体控制器添加到ExoPlayer

时间:2016-10-07 13:05:33

标签: java android android-studio exoplayer

我正在使用exoplayer通过URL播放流媒体视频,教程中包含2个关于播放的按钮,并通过流媒体暂停视频,我将其更改为在应用启动时自动播放,但我不知道如何添加具有此代码中所有必需功能的普通媒体控制器,可将媒体控制器视为任何媒体播放器应用程序。

我的代码:

public class mainactivity extends AppCompatActivity implements ManifestFetcher.ManifestCallback<HlsPlaylist>,
    ExoPlayer.Listener,HlsSampleSource.EventListener, AudioManager.OnAudioFocusChangeListener {

private SurfaceView surface;
private ExoPlayer player;
private PlayerControl playerControl;
private String video_url;
private Handler mainHandler;
private AudioManager am;
private String userAgent;
private ManifestFetcher<HlsPlaylist> playlistFetcher;
private static final int BUFFER_SEGMENT_SIZE = 64 * 1024;
private static final int MAIN_BUFFER_SEGMENTS = 254;
public static final int TYPE_VIDEO = 0;
private TrackRenderer videoRenderer;
private MediaCodecAudioTrackRenderer audioRenderer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mainactivity);
    surface = (SurfaceView) findViewById(R.id.surface_view); // we import surface

    player = ExoPlayer.Factory.newInstance(2);
    playerControl = new PlayerControl(player); // we init player
    video_url = "urlhere.m3u8" +
            ""; //video url
    am = (AudioManager) this.getApplicationContext().getSystemService(Context.AUDIO_SERVICE); // for requesting audio
    mainHandler = new Handler(); //handler required for hls
    userAgent = Util.getUserAgent(this, "MainActivity"); //useragent required for hls
    HlsPlaylistParser parser = new HlsPlaylistParser(); // init HlsPlaylistParser
    playlistFetcher = new ManifestFetcher<>(video_url, new DefaultUriDataSource(this, userAgent),
            parser); // url goes here, useragent and parser
    playlistFetcher.singleLoad(mainHandler.getLooper(), this); //with 'this' we'll implement ManifestFetcher.ManifestCallback<HlsPlaylist>
    //listener with it will come two functions
}
//inside onSingleManifest we'll code to play hls
@Override
public void onSingleManifest(HlsPlaylist manifest) {
    LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE));
    DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    PtsTimestampAdjusterProvider timestampAdjusterProvider = new PtsTimestampAdjusterProvider();
    boolean haveSubtitles = false;
    boolean haveAudios = false;
    if (manifest instanceof HlsMasterPlaylist) {
        HlsMasterPlaylist masterPlaylist = (HlsMasterPlaylist) manifest;
        haveSubtitles = !masterPlaylist.subtitles.isEmpty();

    }
    // Build the video/id3 renderers.
    DataSource dataSource = new DefaultUriDataSource(this, bandwidthMeter, userAgent);
    HlsChunkSource chunkSource = new HlsChunkSource(true /* isMaster */, dataSource, manifest,
            DefaultHlsTrackSelector.newDefaultInstance(this), bandwidthMeter,
            timestampAdjusterProvider, HlsChunkSource.ADAPTIVE_MODE_SPLICE);
    HlsSampleSource sampleSource = new HlsSampleSource(chunkSource, loadControl,
            MAIN_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, this, TYPE_VIDEO);
    MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(this, sampleSource,
            MediaCodecSelector.DEFAULT, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT);
    MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource,
            MediaCodecSelector.DEFAULT);
    this.videoRenderer = videoRenderer;
    this.audioRenderer = audioRenderer;
    pushSurface(false); // here we pushsurface
    player.prepare(videoRenderer,audioRenderer); //prepare
    player.addListener(this); //add listener for the text field
    if (requestFocus())
        player.setPlayWhenReady(true);
}
public boolean requestFocus() {
    return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
            am.requestAudioFocus(mainactivity.this, AudioManager.STREAM_MUSIC,
                    AudioManager.AUDIOFOCUS_GAIN);
}
private void pushSurface(boolean blockForSurfacePush) {
    if (videoRenderer == null) {return;}
    if (blockForSurfacePush) {
        player.blockingSendMessage(
                videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface.getHolder().getSurface());
    } else {
        player.sendMessage(
                videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface.getHolder().getSurface());
    }
}

@Override
public void onSingleManifestError(IOException e) {

}



@Override
public void onPlayWhenReadyCommitted() {

}

@Override
public void onPlayerError(ExoPlaybackException error) {

}

@Override
public void onLoadStarted(int sourceId, long length, int type, int trigger, Format format, long mediaStartTimeMs, long mediaEndTimeMs) {

}

@Override
public void onLoadCompleted(int sourceId, long bytesLoaded, int type, int trigger, Format format, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs) {

}

@Override
public void onLoadCanceled(int sourceId, long bytesLoaded) {

}

@Override
public void onLoadError(int sourceId, IOException e) {

}

@Override
public void onUpstreamDiscarded(int sourceId, long mediaStartTimeMs, long mediaEndTimeMs) {

}

@Override
public void onDownstreamFormatChanged(int sourceId, Format format, int trigger, long mediaTimeMs) {

}

@Override
public void onAudioFocusChange(int focusChange) {

}


}

1 个答案:

答案 0 :(得分:0)

您应该从这里(http://google.github.io/ExoPlayer/doc/reference/)参考添加/自定义媒体播放控件。

  

可以通过设置属性(或调用相应的方法),覆盖视图的布局文件或指定自定义视图布局文件来自定义PlaybackControlView,如下所述。

相关问题