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)
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()? –
@ 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