2017-06-26 4 views
1

Ich möchte Video streamen und dafür verwende ich ExoPlayer. Aber es gibt Fehler, die ich nicht vermeiden konnte. Ich teste das Programm auf Android 4.4.2 Gerät und es Popups der Media Player, aber nach dem Fehler auftritt. Im Folgenden meinen Code und Fehler:Was ist der Grund für 'NullPointerException' bei der Verwendung von ExoPlayer?

public class VideoStreamingFragment extends Fragment { 
SimpleExoPlayer simpleExoPlayer ; 
private MediaSessionCompat mediaSession; 

private PlaybackStateCompat.Builder mStateBuilder; 

SimpleExoPlayerView simpleExoPlayerView ; 

String videoUrl ; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.step_video,container,false) ; 

    ButterKnife.bind(getActivity(),view) ; 

    videoUrl = getArguments().getString("key") ; 

    simpleExoPlayerView = (SimpleExoPlayerView)view.findViewById(R.id.video_view); 

    return view ; 


} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 


    if(this.videoUrl!=null && !this.videoUrl.isEmpty()) 
    { 
     initializeMediaSession(); 

     initializePlayer(Uri.parse(videoUrl)); 

    } 


} 

private void initializeMediaSession() { 
    mediaSession = new MediaSessionCompat(getContext(), "VideoStreamingFragment"); 

    mediaSession.setFlags(
      MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
        MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 

    mediaSession.setMediaButtonReceiver(null); 

    mStateBuilder = new PlaybackStateCompat.Builder() 
      .setActions(
        PlaybackStateCompat.ACTION_PLAY | 
          PlaybackStateCompat.ACTION_PAUSE | 
          PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS | 
          PlaybackStateCompat.ACTION_PLAY_PAUSE); 

    mediaSession.setPlaybackState(mStateBuilder.build()); 

    mediaSession.setCallback(new MediaSessionCompat.Callback() { 
     @Override 
     public void onPlay() { 
      simpleExoPlayer.setPlayWhenReady(true); 
     } 

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

     @Override 
     public void onSkipToPrevious() { 
      simpleExoPlayer.seekTo(0); 
     } 
    }); 
    mediaSession.setActive(true); 
} 

    private void initializePlayer(Uri mediaUri) { 

    if (simpleExoPlayer == null) { 
     TrackSelector trackSelector = new DefaultTrackSelector(new Handler()); 
     LoadControl loadControl = new LoadControl() { 
      @Override 
      public void onTracksSelected(Renderer[] renderers, TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { 

      } 

      @Override 
      public void onTracksDisabled() { 

      } 

      @Override 
      public Allocator getAllocator() { 
       return null; 
      } 

      @Override 
      public boolean shouldStartPlayback(long bufferedDurationUs, boolean rebuffering) { 
       return false; 
      } 

      @Override 
      public boolean shouldContinueLoading(long bufferedDurationUs) { 
       return false; 
      } 
     }; 

     simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(getActivity(), trackSelector,loadControl); 
     simpleExoPlayerView.setPlayer(simpleExoPlayer); 
     simpleExoPlayer.addListener(new ExoPlayer.EventListener() { 
      @Override 
      public void onLoadingChanged(boolean isLoading) { 

      } 

      @Override 
      public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { 

      } 

      @Override 
      public void onTimelineChanged(Timeline timeline, Object manifest) { 

      } 

      @Override 
      public void onPlayerError(ExoPlaybackException error) { 

      } 

      @Override 
      public void onPositionDiscontinuity() { 

      } 
     }); 

     String userAgent = Util.getUserAgent(getContext(), "StepVideo"); 
     MediaSource mediaSource = new ExtractorMediaSource(mediaUri, new DefaultDataSourceFactory(
       getContext(), userAgent), new DefaultExtractorsFactory(), null, null); 
     simpleExoPlayer.prepare(mediaSource); 
     simpleExoPlayer.setPlayWhenReady(true); 
    } 
    } 

public class MediaReceiver extends BroadcastReceiver { 

     public MediaReceiver() { 

     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      MediaButtonReceiver.handleIntent(mediaSession, intent); 

     } 
} 
} 

und Fehler:

06-26 23:03:55.254 11307-11483/com.incubator.neo.bakingapp E/LoadTask: Unexpected exception loading stream 
                    java.lang.NullPointerException 
                     at com.google.android.exoplayer2.extractor.DefaultTrackOutput.<init>(DefaultTrackOutput.java:86) 
                     at com.google.android.exoplayer2.source.ExtractorMediaPeriod.track(ExtractorMediaPeriod.java:338) 
                     at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.processMoovAtom(Mp4Extractor.java:338) 
                     at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.processAtomEnded(Mp4Extractor.java:272) 
                     at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.readAtomPayload(Mp4Extractor.java:263) 
                     at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.read(Mp4Extractor.java:143) 
                     at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:575) 
                     at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:295) 
                     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
                     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                     at java.lang.Thread.run(Thread.java:841) 

06-26 23:03:55.254 11307-11482/com.incubator.neo.bakingapp W/dalvikvm: threadid=18: thread exiting with uncaught exception (group=0x416bec08) 
06-26 23:03:55.254 11307-11482/com.incubator.neo.bakingapp E/AndroidRuntime: FATAL EXCEPTION: ExoPlayerImplInternal:Handler 
                       Process: com.incubator.neo.bakingapp, PID: 11307 
                     java.lang.NullPointerException 
                      at com.google.android.exoplayer2.source.ExtractorMediaPeriod.getExtractedSamplesCount(ExtractorMediaPeriod.java:444) 
                      at com.google.android.exoplayer2.source.ExtractorMediaPeriod.onLoadError(ExtractorMediaPeriod.java:326) 
                      at com.google.android.exoplayer2.source.ExtractorMediaPeriod.onLoadError(ExtractorMediaPeriod.java:49) 
                      at com.google.android.exoplayer2.upstream.Loader$LoadTask.handleMessage(Loader.java:359) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:146) 
                      at android.os.HandlerThread.run(HandlerThread.java:61) 
                      at com.google.android.exoplayer2.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40) 
+0

Welche Version von Exoplayer verwenden Sie? Es kann helfen, Probleme im Quellcode zu verfolgen. Zum Beispiel stammt die erste NPE vom Konstruktor von DefaultTrackOutput. https://github.com/google/ExoPlayer/blob/d979469659861f7fe1d39d153b90bdff1ab479cc/library/core/src/main/java/com/google/android/exoplayer2/extractor/DefaultTrackOutput.java gibt es Call Allocator.getIndividualAllocationLength() und Du bist Erstellen einer benutzerdefinierten LoadControl-Implementierung, die null von der getAlocator-Methode zurückgibt. Dies wird verwandt sein. Funktioniert Ihr Code mit DefaultLoadControl()? –

+0

@ josef.adamcik Ich benutze Version 2.0.0. In dieser Version nimmt 'newSimpleInstance' das Argument' loadControl', wenn es in anderen Versionen nicht benötigt wird. – user202912

Antwort

0

Verwendung new DefaultLoadControl(); anstelle Ihrer benutzerdefinierten Instanz von LoadControl (die null anstelle der Allocator-Instanz zurückgibt und dies der Grund für einen Absturz ist).

Verwandte Themen