gpt4 book ai didi

android - VideoView 流加载缓冲不足

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:09 24 4
gpt4 key购买 nike

我的 android 应用程序在 VideoView 中在线播放视频。从文件播放视频时,效果很好,甚至可以直播(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)

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

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

更准确地说我的问题:

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

我看过这个问题,Android Streaming with MediaPlayer: Error(1, -1004) and 3GPP video ,但答案并没有多大帮助。

我在此处找到一个函数 MediaPlayer.prepareAsync() https://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync() ,当 VideoView 打开视频时会自动调用它,但这似乎不起作用。

编辑

因此解决方案将我带到了 Google 的 ExoPlayer ,这很容易换成我的 VideoView,而且效果很好。

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

因此,流式传输可以无缝进行。

最佳答案

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

表单日志-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();
}

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

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

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

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

有关更多详细信息,请参阅此帖子 unexpected end of stream error

其他这个也对你有帮助,请查看这个link那如何为 MediaPlayer 创建长时间缓冲区

关于android - VideoView 流加载缓冲不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40026582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com