
我目前正在开发一个实时和电影播放器应用程序.我选择了ExoPlayer版本2来播放电影,我对此并不了解.我想让用户在播放器屏幕上选择电影的质量,例如720p或1080p等.
但我不知道如何获得现有质量列表并将其显示给用户.
以下代码是我对SimpleExoPlayer的实现:
private voID initPlayer(String path){ Handler handler = new Handler(); // 1. Create a default TrackSelector BanDWIDthMeter banDWIDthMeter = new DefaultBanDWIDthMeter(); TrackSelection.Factory vIDeoTrackSelectionFactory = new AdaptiveVIDeoTrackSelection.Factory(banDWIDthMeter); TrackSelector trackSelector = new DefaultTrackSelector(vIDeoTrackSelectionFactory); // 2. Create a default LoadControl LoadControl loadControl = new DefaultLoadControl(); // 3. Create the player player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl); SimpleExoPlayerVIEw playerVIEw = (SimpleExoPlayerVIEw) findVIEwByID(R.ID.player_vIEw); playerVIEw.setPlayer(player); playerVIEw.setKeepScreenOn(true); // Produces DataSource instances through which media data is loaded. DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "ExoPlayer")); // This is the MediaSource representing the media to be played. MediaSource vIDeoSource = new HlsMediaSource(Uri.parse(path), dataSourceFactory,handler, null); // Prepare the player with the source. player.addListener(this); player.prepare(vIDeoSource); playerVIEw.requestFocus(); player.setPlayWhenReady(true); // to play vIDeo when ready. Use false to pause a vIDeo}// ExoPlayer Listener Methods :@OverrIDepublic voID onTimelineChanged(Timeline timeline, Object manifest) {}@OverrIDepublic voID onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {}@OverrIDepublic voID onl oadingChanged(boolean isLoading) {}@OverrIDepublic voID onPlayerStateChanged(boolean playWhenReady, int playbackState) { switch (playbackState) { case ExoPlayer.STATE_BUFFERING: //You can use progress dialog to show user that vIDeo is preparing or buffering so please wait progressbar.setVisibility(VIEw.VISIBLE); break; case ExoPlayer.STATE_IDLE: //IDle state break; case ExoPlayer.STATE_READY: // dismiss your dialog here because our vIDeo is ready to play Now progressbar.setVisibility(GONE); //Toast.makeText(getApplicationContext(),String.valueOf(player.getCurrentTrackSelections().get(0).getSelectedFormat().bitrate),Toast.LENGTH_SHORT).show(); break; case ExoPlayer.STATE_ENDED: // do your processing after ending of vIDeo break; }}@OverrIDepublic voID onPlayerError(ExoPlaybackException error) { // show user that something went wrong. it can be a dialog}@OverrIDepublic voID onpositiondiscontinuity() {}请帮忙解决这个问题.
非常感谢.
解决方法:
您想要实现的一切都可以在ExoPlayer2 demo app中查看.更具体地说,可以在PlayerActivity课程中查看.
您还可以查看此主题的good article.
您要查看的核心点是轨道选择(通过TrackSelector)以及TrackSelectionHelper.我将在下面列出重要的代码示例,希望这些示例足以让您前进.但最终只需按照演示应用程序中的类似内容即可获得您需要的位置.
您将保持启动播放器的音轨选择器,并将其用于几乎所有内容.
下面只是一段代码,理想地涵盖了你想要做的事情的要点,因为演示似乎使头发过于复杂.我也没有运行代码,但它足够接近.
// These two Could be fIElds OR passed aroundint vIDeoRendererIndex;TrackGroupArray trackGroups;// This is the body of the logic for see if there are even vIDeo tracks// It also does some fIEld settingMappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();for (int i = 0; i < mappedTrackInfo.length; i++) { TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(i); if (trackGroups.length != 0) { switch (player.getRendererType(i)) { case C.TRACK_TYPE_VIDEO: vIDeoRendererIndex = i; return true; } }}// This next part is actually about getting the List. It doesn't include// some additional logic they put in for adaptive tracks (DASH/HLS/SS),// but you can look at the sample for that (TrackSelectionHelper#buildVIEw())// Below you'd be building up items in a List. This just does// vIEws directly, but you Could just have a List of track names (with indexes)for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) { TrackGroup group = trackGroups.get(groupIndex); for (int trackIndex = 0; trackIndex < group.length; trackIndex++) { if (trackIndex == 0) { // Beginning of a new set, the demo app adds a divIDer } CheckedTextVIEw trackVIEw = ...; // The TextVIEw to show in the List // The below points to a util which extracts the quality from the TrackGroup trackVIEw.setText(DemoUtil.buildTrackname(group.getFormat(trackIndex)));}// Assuming you tagged the vIEw with the groupIndex and trackIndex, you// can build your overrIDe with that info.Pair<Integer, Integer> tag = (Pair<Integer, Integer>) vIEw.getTag();int groupIndex = tag.first;int trackIndex = tag.second;// This is the overrIDe you'd use for something that isn't adaptive.overrIDe = new SelectionOverrIDe(FIXED_FACTORY, groupIndex, trackIndex);// Otherwise they call their helper for adaptives, which roughly does:int[] tracks = getTracksAdding(overrIDe, trackIndex);TrackSelection.Factory factory = tracks.length == 1 ? FIXED_FACTORY : adaptiveTrackSelectionFactory;overrIDe = new SelectionOverrIDe(factory, groupIndex, tracks);// Then we actually set our overrIDe on the selector to switch the quality/trackselector.setSelectionOverrIDe(rendererIndex, trackGroups, overrIDe);正如我上面提到的,这是对过程的略微过度简化,但核心部分是你正在搞乱TrackSelector,SelectionOverrIDe和Track / TrackGroups以使其工作.
您可以想象地逐字复制演示代码并且它应该可以工作,但我强烈建议您花时间了解每个部分正在做什么,并根据您的用例定制解决方案.
如果我有更多的时间,我会把它编译并运行.但是,如果你可以获得我的样本,那么随时编辑我的帖子.
希望有帮助:)
总结以上是内存溢出为你收集整理的android – ExoPlayer 2的质量选择器全部内容,希望文章能够帮你解决android – ExoPlayer 2的质量选择器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)