2017-08-23 15 views
2

現在、ライブとムービープレーヤーアプリケーションを開発中です。私は映画を再生するためにExoPlayerバージョン2を選んだが、それについてはあまりよく分からない。プレイヤーの画面での動画の品質を(たとえば720pや1080pなど)にするようにします。 しかし、既存の品質のリストを取得してユーザーに表示する方法はわかりません。 と以下のコードは、SimpleExoPlayerの私の実装です:ExoPlayer 2の品質セレクタ

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 : 
@Override 
public void onTimelineChanged(Timeline timeline, Object manifest) { 

} 

@Override 
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { 

} 

@Override 
public void onLoadingChanged(boolean isLoading) { 

} 

@Override 
public 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; 
    } 
} 

@Override 
public void onPlayerError(ExoPlaybackException error) { 
    // show user that something went wrong. it can be a dialog 
} 

@Override 
public void onPositionDiscontinuity() { 

} 

この問題を解決するために助けてください。 ありがとうございました。あなたが達成したい

答えて

3

すべてがExoPlayer2 demo appで閲覧可能です。より具体的には、PlayerActivityクラス。

また、トピックのこのgood articleをチェックアウトすることができます。

あなたが調べたいコアポイントは、TrackSelectionHelperと同様にトラック選択(TrackSelector経由)です。下記の重要なコードサンプルを含めることで、うまくいくことができます。しかし、最終的には、デモアプリケーションで類似したものにちょうど従うだけで、必要な場所にアクセスできます。

あなたはあなたがプレイヤーを初期化するトラックセレクタを保持し、それを使ってほぼすべてのことを行います。

以下は、デモが髪の毛を複雑にするように見えるので、あなたがしようとしていることの要点を理想的にカバーするコードブロックです。また、私はコードを実行していないが、それは十分に近いです。

// These two could be fields OR passed around 
int videoRendererIndex; 
TrackGroupArray trackGroups; 

// This is the body of the logic for see if there are even video tracks 
// It also does some field setting 
MappedTrackInfo 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/track 
selector.setSelectionOverride(rendererIndex, trackGroups, override); 

私は前述したように、これはプロセスのわずかな単純化であるが、コア部分は、この作業を取得するためにTrackSelectorSelectionOverride、およびTrack/TrackGroupsをいじりしていることです。

デモコードをそのままコピーすればうまくいくはずですが、それぞれのことを理解してユースケースに合わせて解決することをお勧めします。

私はより多くの時間を持っていた場合、私はそれをコンパイルして実行するために取得したいです。しかし、私のサンプルを手に入れることができれば、私の投稿を自由に編集することができます。

希望するもの:

+0

親愛なる@カイルありがとう、本当に助かりました –

0

私は上記のように回避します。

trackSelector.setParameters(trackSelector.getParameters() 
          .withMaxVideoBitrate(bitrate) 
          .withMaxVideoSize(width, height)); 

私はHLSのビデオでテストしてみたし、正しい方法で実行するようだ:次のように私の方法は、DefaultTrackSelectorを使用しています。私はビットレート、幅と高さをHlsManifestから読み込みます。