Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用VideoView从服务器流式传输视频,错误(1,-2147483648),文件较大(抱歉,无法播放此视频)_Java_Android_Streaming_Video Streaming_Android Videoview - Fatal编程技术网

Java 使用VideoView从服务器流式传输视频,错误(1,-2147483648),文件较大(抱歉,无法播放此视频)

Java 使用VideoView从服务器流式传输视频,错误(1,-2147483648),文件较大(抱歉,无法播放此视频),java,android,streaming,video-streaming,android-videoview,Java,Android,Streaming,Video Streaming,Android Videoview,正如标题所说,我正在尝试使用VideoView将视频流到我的应用程序中。对于较小的视频,它可以完全正常工作,但对于较大的视频,它拒绝播放(“抱歉,此视频无法播放”弹出窗口,并且我的服务器接收到ClientAbortException) 我假设它现在的工作方式是将整个文件下载到内存或其他地方,然后尝试一次加载所有文件(这对设备来说可能太难处理了?)。我已经在我的服务器上实现了分块流功能(解析范围头等),但是我想我也需要在客户端实现相同的功能。这可以用视频视图来完成吗 以下是我的服务器代码(它可以与

正如标题所说,我正在尝试使用VideoView将视频流到我的应用程序中。对于较小的视频,它可以完全正常工作,但对于较大的视频,它拒绝播放(“抱歉,此视频无法播放”弹出窗口,并且我的服务器接收到ClientAbortException)

我假设它现在的工作方式是将整个文件下载到内存或其他地方,然后尝试一次加载所有文件(这对设备来说可能太难处理了?)。我已经在我的服务器上实现了分块流功能(解析范围头等),但是我想我也需要在客户端实现相同的功能。这可以用视频视图来完成吗

以下是我的服务器代码(它可以与iOS视频播放器配合使用,默认情况下,iOS视频播放器会分块请求):

FileInputStream in=newfileinputstream(文件);
ServletOutputStream out=response.getOutputStream();
长开始=0;
long-length,end=file.length();
列表范围=解析范围(请求);
如果(range.size()>0){
开始=范围。获取(0);
}           
如果(range.size()>1){
结束=范围。获取(1);
}
int数据长度=(int)(结束-开始)+1;
setHeader(“接受范围”、“字节”);
setHeader(“内容范围”,contentRangeHeaderString(开始、结束、长度));
response.setContentLength(数据长度);
response.setContentType(“视频/mp4”);
copylige(输入、输出、开始、数据长度);

您在客户端(android)中找到了处理此问题的方法吗?就连我也面临着同样的问题。我不知道为什么android的MediaPlayer不在数据块一出现就开始播放。@MAHANTESH我的解决方法是先将整个文件临时写入磁盘,然后将其从设备存储中流出来。不太理想,但我能想到的唯一解决方案是,它就像下载一个视频一样好,所以你为什么不下载它并在videoview中播放呢?将其作为整个视频的附件发送,而不是分块发送。这只是我的建议。是的,这就是我正在做的,如果我的评论不清楚,很抱歉。服务器端代码没有更改,以说明其他支持范围请求的设备。无论如何都不需要,因为它支持两种请求类型。
FileInputStream in = new FileInputStream(file);
ServletOutputStream out = response.getOutputStream();

long begin = 0;
long length, end = file.length();

List<Integer> range = parseRange(request);
if (range.size() > 0) {
    begin = range.get(0);
}           
if (range.size() > 1) {
    end = range.get(1);
}
int dataLength = (int)(end - begin) + 1;

response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Range", contentRangeHeaderString(begin, end, length));
response.setContentLength(dataLength);
response.setContentType("video/mp4");

IOUtils.copyLarge(in, out, begin, dataLength);