简体   繁体   中英

What's the reason for 'NullPointerException' in using ExoPlayer?

I want to stream video and for that I use ExoPlayer. But there is error that I couldn't avoid. I test program at Android 4.4.2 device and it popups the media player,but after error occurs. Below my code and error:

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

        }
}
}

and error:

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)

Use new DefaultLoadControl() ; instead of your custom instance of LoadControl (which returns null instead of Allocator instance and that is reason for crash).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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