简体   繁体   English

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

[英]Adding media controller to ExoPlayer in android

I'm using exoplayer to play streaming video through URL and the tutorial is contained 2 buttons about play and pause video through streaming , I changed this to play automatically when the app is start but I don't know how I can add the normal media controller with all required functions in this code to view media controllers as any media player app. 我正在使用exoplayer通过URL播放流视频,并且该教程包含2个有关通过流播放和暂停视频的按钮,我将其更改为在应用启动时自动播放,但我不知道如何添加普通媒体控制器以及此代码中的所有必需功能,可以将媒体控制器视为任何媒体播放器应用程序。

My code: 我的代码:

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) {

}


}

You should refer from here ( http://google.github.io/ExoPlayer/doc/reference/ ) to add/custom media playback control. 您应该从此处( http://google.github.io/ExoPlayer/doc/reference/ )进行参考,以添加/自定义媒体播放控件。

A PlaybackControlView can be customized by setting attributes (or calling corresponding methods), overriding the view's layout file or by specifying a custom view layout file, as outlined below. 可以通过设置属性(或调用相应的方法),覆盖视图的布局文件或通过指定自定义视图布局文件来自定义PlaybackControlView,如下所述。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM