VideoView Stream加载不够缓冲

Nev*_*ore 5 android stream android-mediaplayer android-videoview

我的Android应用程序在线播放视频VideoView.从文件播放视频时,它可以正常工作,甚至可以直播(a m3u8); 它总是来自同一个源,当我使用外部播放器/浏览器时,它同样流畅(所以我不认为这是源的问题,这是这样的文件的变体:https:/ /publish.dvlabs.com/democracynow/360/dn2016-0810.mp4

Android Monitor在崩溃之前记录这个:

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)
Run Code Online (Sandbox Code Playgroud)

然后我崩溃时得到这些日志:

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
Run Code Online (Sandbox Code Playgroud)

更准确地说我的问题:

  1. 我想知道这个错误E/MediaPlayer: Error (1,-1004)是什么(因为我没有在网上找到任何关于它的信息).
  2. 如果这是我怀疑的,基本上是文件/流错误的结束,那么我希望得到一些帮助缓冲或以其他方式加载视频以避免这种情况?

我已经看到了这个问题,Android Streaming with MediaPlayer:Error(1,-1004)和3GPP视频,但答案并没有太大帮助.

我找到了一个函数,MediaPlayer.prepareAsync()这里是https://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync(),当VideoView打开一个视频时会自动调用,但这似乎没有工作.

编辑

因此,解决方案将我带到了Google的ExoPlayer,这很容易换成我的VideoView,它就像一个魅力.

  1. 添加ExoPlayer作为依赖项
  2. 将布局中的视图更改为 SimpleExoPlayerView
  3. SimpleExoPlayer在活动中初始化
  4. 初始化MediaSource并附加到播放器
  5. 记得release()不再需要的时候.

有了它,流媒体无缝地工作.

Sha*_*esh 1

Android MediaPlayer 类不提供对较低级别设置(例如缓冲区大小)的访问。

表单log -1004的意思是:public static final int MEDIA_ERROR_IO

对我来说这段代码工作正常:

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();
}
Run Code Online (Sandbox Code Playgroud)

这似乎与流的来源有关,因为某些来源最终在设备上播放,但我们需要的来源从未播放过。

如果您可以看到,那么您可以通过日志知道您的流存在一些问题。

MediaHTTPConnection: readAt 26869519 / 241 => java.net.ProtocolException: unexpected end of stream
Run Code Online (Sandbox Code Playgroud)

当预期字节数(通常在响应的内容长度标头中设置)大于响应中的实际数据时,FixedLengthInputStream 会引发该异常。检查内容长度标头是否正确。(如果您提供自己的内容长度值,请确保其正确。)

有关更多详细信息,请参阅这篇文章意外的流结束错误

其他这个也对您有帮助,请检查此链接如何为 MediaPlayer 创建长时间缓冲区