简体   繁体   English

使用ExoPlayer时出现“ NullPointerException”的原因是什么?

[英]What's the reason for 'NullPointerException' in using ExoPlayer?

I want to stream video and for that I use ExoPlayer. 我想流式传输视频,为此,我使用了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. 我在Android 4.4.2设备上测试了程序,它会弹出媒体播放器,但是会出现错误。 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() ; 使用new DefaultLoadControl() ; instead of your custom instance of LoadControl (which returns null instead of Allocator instance and that is reason for crash). 而不是您的LoadControl的自定义实例(该实例返回null而不是Allocator实例,这是崩溃的原因)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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