JeffMony / JeffVideoCache

Better than AndroidVideoCache, it supports M3U8 and MP4
Apache License 2.0
290 stars 65 forks source link

重大BUG。视频seek在最后,再往回seek到中间,数据出错,播放器无法播放。 #23

Open yoakerin opened 1 year ago

yoakerin commented 1 year ago

分析后发现问题出在这里。 类 Mp4Response.java 方法 public void sendBody(Socket socket, OutputStream outputStream, long pending) throws Exception{

} 如下代码 while (bufferLength > 0 && (readLength = randomAccessFile.read(buffer, 0, (int) bufferLength)) != -1) { offset += readLength; outputStream.write(buffer, 0, readLength); randomAccessFile.seek(offset); bufferLength = (avilable - offset + 1) > bufferedSize ? bufferedSize : (avilable - offset + 1); } 这里判断条件有问题。当第一次seek到结尾的时候,缓存文件中前面段没写入的数据,此段数据为空数据,再次往回seek,此时read 后,readLength 长度不是-1,但向buffer数组中写入的全是0,播放器接受到的全是空数据,也跳不出while循环。

bozaixing commented 9 months ago

分析后发现问题出在这里。 类 Mp4Response.java 方法 public void sendBody(Socket socket, OutputStream outputStream, long pending) throws Exception{

} 如下代码 while (bufferLength > 0 && (readLength = randomAccessFile.read(buffer, 0, (int) bufferLength)) != -1) { offset += readLength; outputStream.write(buffer, 0, readLength); randomAccessFile.seek(offset); bufferLength = (avilable - offset + 1) > bufferedSize ? bufferedSize : (avilable - offset + 1); } 这里判断条件有问题。当第一次seek到结尾的时候,缓存文件中前面段没写入的数据,此段数据为空数据,再次往回seek,此时read 后,readLength 长度不是-1,但向buffer数组中写入的全是0,播放器接受到的全是空数据,也跳不出while循环。

大佬,这个问题最后怎么解决的呢?