Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VideoView Stream load not buffering enough

my android app streams a video online in a VideoView. When playing a video from a file, it works fine, or even streaming live (an m3u8); It's always streaming from the same source, and when I use an external player/browser, it likewise streams fine (so I don't think this is an issue with the source, which is a variation of a file like this: https://publish.dvlabs.com/democracynow/360/dn2016-0810.mp4

The Android Monitor logs this just before the crash:

10-13 12:02:56.204 32460-32748/com.workingagenda.democracydroid D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= stagefright/1.2 (Linux;Android 6.0.1)
10-13 12:02:56.205 32460-32472/com.workingagenda.democracydroid D/MediaHTTPConnection: proxy null port 0
10-13 12:02:57.904 32460-32460/com.workingagenda.democracydroid D/MediaPlayer: getMetadata
10-13 12:02:58.438 32460-377/com.workingagenda.democracydroid W/MediaPlayer: info/warning (3, 0)

and then I get these logs when it crashes:

10-13 12:05:33.812 32460-32472/com.workingagenda.democracydroid W/MediaHTTPConnection: readAt 26869519 / 241 => java.net.ProtocolException: unexpected end of stream
10-13 12:08:32.480 32460-3546/com.workingagenda.democracydroid E/MediaPlayer: error (1, -1004)
10-13 12:08:32.480 32460-32460/com.workingagenda.democracydroid E/MediaPlayer: Error (1,-1004)
10-13 12:08:32.481 32460-32460/com.workingagenda.democracydroid D/VideoView: Error: 1,-1004

                                                                         [ 10-13 12:08:32.512  5066:  453 E/         ]
                                                                         Destroy C2D instance

                                                                         [ 10-13 12:08:32.512  5066:  453 E/         ]
                                                                         Destroy C2D instance
10-13 12:08:32.635 32460-32472/com.workingagenda.democracydroid E/MediaPlayer: error (1, -1004)
10-13 12:08:32.668 32460-32460/com.workingagenda.democracydroid E/MediaPlayer: Error (1,-1004)
10-13 12:08:32.668 32460-32460/com.workingagenda.democracydroid D/VideoView: Error: 1,-1004

To be more precise about my question:

  1. I'd like to know what this error, E/MediaPlayer: Error (1,-1004) is (as I haven't found any info on the web about it).
  2. If it is what I suspect, basically as end of file/stream error, then I am hoping to get some help buffering or otherwise loading the video in such a way to avoid this?

I've seen this question, Android Streaming with MediaPlayer: Error(1, -1004) and 3GPP video, but the answers aren't much help.

I've found a function, MediaPlayer.prepareAsync(), here https://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync(), this is automatically called when a VideoView opens a video, but this doesn't seem to work.

Edit

So the solution brought me to Google's ExoPlayer, which was pretty easy to swap in for my VideoView, and it works like a charm.

  1. Add ExoPlayer as dependency
  2. Change view in layout to SimpleExoPlayerView
  3. Initialize SimpleExoPlayer in Activity
  4. Initialize MediaSource and attach to player
  5. Remember to release() when no longer needed.

And with that, streaming works seamlessly.

like image 300
Nevermore Avatar asked Oct 13 '16 16:10

Nevermore


1 Answers

Android MediaPlayer class doesn't provide access to lower level settings such as buffer size.

Form log -1004 means: public static final int MEDIA_ERROR_IO

For me this code is work fine:

try{
    MediaController mediaController = new MediaController(this);

    Uri video = Uri.parse(url);

    mediaController.setAnchorView(videoView);
    videoView.requestFocus();
    videoView.setMediaController(mediaController);
    videoView.setVideoURI(video);

    videoView.setOnPreparedListener(new OnPreparedListener()
    {

        @Override
        public void onPrepared(MediaPlayer arg0)
        {
            videoView.start();
        }
    });
}catch (Exception e) {
    e.printStackTrace();
}

It seemed to have been something relating to the source of the stream, because some sources eventually played on the device, but the one we needed, never played.

If you can see then you know some problem with your stream by the log.

MediaHTTPConnection: readAt 26869519 / 241 => java.net.ProtocolException: unexpected end of stream

That exception is thrown by FixedLengthInputStream when the expected number of bytes (usually set in the content-length header of the response) is larger than the actual data in the response. Check that the content-length header is correct. (If you're supplying your own value for the content length, make sure it is correct.)

For more detail please see this post unexpected end of stream error

Other this one also help you, Please check this link that how to create long time buffer for MediaPlayer

like image 126
Shailesh Avatar answered Nov 06 '22 18:11

Shailesh