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.