2017-10-17 97 views
0

我是Android的初學者,使用ExoPlayer時遇到問題。使用MP3格式的時候,但問題出現使用MP4或試圖播放視頻Exoplayer它並沒有表現出任何的事情,當我ExoPlayer效果很好視頻無法在exoPlayer中工作

這裏是我的活動

本次活動我initiallize mediaSession和初始化媒體播放器的exoplayer

package com.example.abdelmagied.bakingapp; 

import android.app.NotificationManager; 
import android.net.Uri; 
import android.support.v4.media.session.MediaSessionCompat; 
import android.support.v4.media.session.PlaybackStateCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.Toast; 

import com.example.abdelmagied.bakingapp.recipeContents.steps; 
import com.google.android.exoplayer2.DefaultLoadControl; 
import com.google.android.exoplayer2.ExoPlaybackException; 
import com.google.android.exoplayer2.ExoPlayer; 
import com.google.android.exoplayer2.ExoPlayerFactory; 
import com.google.android.exoplayer2.LoadControl; 
import com.google.android.exoplayer2.SimpleExoPlayer; 
import com.google.android.exoplayer2.Timeline; 
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; 
import com.google.android.exoplayer2.source.ExtractorMediaSource; 
import com.google.android.exoplayer2.source.MediaSource; 
import com.google.android.exoplayer2.source.TrackGroupArray; 
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; 
import com.google.android.exoplayer2.trackselection.TrackSelectionArray; 
import com.google.android.exoplayer2.trackselection.TrackSelector; 
import com.google.android.exoplayer2.ui.SimpleExoPlayerView; 
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; 
import com.google.android.exoplayer2.util.Util; 

public class stepDetailActivity extends AppCompatActivity implements ExoPlayer.EventListener { 
    private SimpleExoPlayer mExoPlayer; 
    private SimpleExoPlayerView mPlayerView; 
    private static MediaSessionCompat mMediaSession; 
    private PlaybackStateCompat.Builder mStateBuilder; 
    private NotificationManager mNotificationManager; 
    private static final String TAG = stepDetailActivity.class.getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_step_detail); 

     steps myrecipes = (steps) getIntent().getParcelableExtra("stepDetails"); 

     mPlayerView = (SimpleExoPlayerView) findViewById(R.id.player); 
     initializeMediaSession(); 
     initializePlayer(Uri.parse("https://d17h27t6h515a5.cloudfront.net/topher/2017/April/58ffd9cb_4-press-crumbs-in-pie-plate-creampie/4-press-crumbs-in-pie-plate-creampie.mp4")); 

    } 
    private void initializePlayer(Uri mediaUri) { 
     if (mExoPlayer == null) { 
      // Create an instance of the ExoPlayer. 
      TrackSelector trackSelector = new DefaultTrackSelector(); 
      LoadControl loadControl = new DefaultLoadControl(); 
      mExoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl); 
      mPlayerView.setPlayer(mExoPlayer); 

      // Set the ExoPlayer.EventListener to this activity. 
      mExoPlayer.addListener(this); 

      // Prepare the MediaSource. 
      String userAgent = Util.getUserAgent(this, "Bakingapp"); 
      MediaSource mediaSource = new ExtractorMediaSource(mediaUri, new DefaultDataSourceFactory(
        this, userAgent), new DefaultExtractorsFactory(), null, null); 
      mExoPlayer.prepare(mediaSource); 
      mExoPlayer.setPlayWhenReady(true); 

     } 
    } 

    /** 
    * Initializes the Media Session to be enabled with media buttons, transport controls, callbacks 
    * and media controller. 
    */ 
    private void initializeMediaSession() { 

     // Create a MediaSessionCompat. 
     mMediaSession = new MediaSessionCompat(this, TAG); 

     // Enable callbacks from MediaButtons and TransportControls. 
     mMediaSession.setFlags(
       MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
         MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 

     // Do not let MediaButtons restart the player when the app is not visible. 
     mMediaSession.setMediaButtonReceiver(null); 

     // Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player. 
     mStateBuilder = new PlaybackStateCompat.Builder() 
       .setActions(
         PlaybackStateCompat.ACTION_PLAY | 
           PlaybackStateCompat.ACTION_PAUSE | 
           PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS | 
           PlaybackStateCompat.ACTION_PLAY_PAUSE); 

     mMediaSession.setPlaybackState(mStateBuilder.build()); 


     // MySessionCallback has methods that handle callbacks from a media controller. 
     mMediaSession.setCallback(new MySessionCallback()); 

     // Start the Media Session since the activity is active. 
     mMediaSession.setActive(true); 

    } 

    @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) { 
     if((playbackState == ExoPlayer.STATE_READY) && playWhenReady){ 
      mStateBuilder.setState(PlaybackStateCompat.STATE_PLAYING, 
        mExoPlayer.getCurrentPosition(), 1f); 
     } else if((playbackState == ExoPlayer.STATE_READY)){ 
      mStateBuilder.setState(PlaybackStateCompat.STATE_PAUSED, 
        mExoPlayer.getCurrentPosition(), 1f); 
     } 
     mMediaSession.setPlaybackState(mStateBuilder.build()); 
    } 

    @Override 
    public void onPlayerError(ExoPlaybackException error) { 

    } 

    @Override 
    public void onPositionDiscontinuity() { 

    } 

    /** 
    * Media Session Callbacks, where all external clients control the player. 
    */ 
    private class MySessionCallback extends MediaSessionCompat.Callback { 
     @Override 
     public void onPlay() { 
      mExoPlayer.setPlayWhenReady(true); 
     } 

     @Override 
     public void onPause() { 
      mExoPlayer.setPlayWhenReady(false); 
     } 

     @Override 
     public void onSkipToPrevious() { 
      mExoPlayer.seekTo(0); 
     } 
    } 
} 

這裏是爲exoplayer的XML佈局

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.abdelmagied.bakingapp.stepDetailActivity"> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 
    <com.google.android.exoplayer2.ui.SimpleExoPlayerView 
     android:id="@+id/player" 
     android:layout_width="match_parent" 
     android:layout_height="300dp" 
     > 
    </com.google.android.exoplayer2.ui.SimpleExoPlayerView> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 


    </ScrollView> 
</LinearLayout> 
</RelativeLayout> 

回答

0

的ExtractorMediaSource應爲MP4

String userAgent = Util.getUserAgent(this, "Bakingapp"); 
    MediaSource mediaSource = new ExtractorMediaSource(uri, defaultDataSourceFactory,new 
      DefaultExtractorsFactory(), null, null); 
    mExoPlayer.prepare(mediaSource); 
    mExoPlayer.setPlayWhenReady(true); 
工作