android media player 5.0版本发送多个范围请求
1> 我正在使用本地代理服务器从网络驱动器播放视频文件 2> 它在4.x版本时运行良好,我在5.0版本时得到了更新,现在代码不工作了 3> 它播放一些视频的初始帧,而不是连续发送范围请求 处理来自媒体播放器的请求的代码android media player 5.0版本发送多个范围请求,android,Android,1> 我正在使用本地代理服务器从网络驱动器播放视频文件 2> 它在4.x版本时运行良好,我在5.0版本时得到了更新,现在代码不工作了 3> 它播放一些视频的初始帧,而不是连续发送范围请求 处理来自媒体播放器的请求的代码 @Override public void handle(HttpRequest request, HttpResponse response, HttpContext httpContext) throws HttpException, I
@Override
public void handle(HttpRequest request, HttpResponse response,
HttpContext httpContext) throws HttpException, IOException {
Log.d(tag, "handle 4.0+");
String streamUrl="";
InputStream inStream=null;
long acContentLenght=-1;
long toSendContentLenght=-1;
InputStreamEntity inStreamEntity=null;
List<NameValuePair> parameters =null;
try{
parameters=URLEncodedUtils.parse(new URI(request.getRequestLine().getUri()), HTTP.UTF_8);
}catch(URISyntaxException URIe){
Log.e(tag, URIe+"");
}
for (NameValuePair nameValuePair : parameters) {
if(nameValuePair.getName().equals("streamUrl")){
streamUrl=nameValuePair.getValue();
}
if(nameValuePair.getName().equals("requestId")){
requestId=nameValuePair.getValue();
}
}
Log.d(tag, "streamUrl to play "+streamUrl);
Header hedaers[]=request.getAllHeaders();
//Log.d(tag,"request line "+request.getRequestLine());
for(int i=0;i<hedaers.length;i++){
Header h=hedaers[i];
Log.d(tag,"request " +h.getName() +" = "+h.getValue());
}
SmbFile sFile=null;
try{
sFile=SambaDrive.getInstance().smbFile(streamUrl);
inStream=sFile.getInputStream();
}catch(Exception e){
response.setStatusCode(403);
//response.setStatusCode();
return;
}
boolean isRangeRequest=false;
String rangeHeaderValue="";
long startRange=-1;
long endRange=-1;
for(Header header:hedaers){
if(header.getName().startsWith("Range")){
isRangeRequest=true;
rangeHeaderValue=header.getValue();
String byteStr="bytes=";
if(rangeHeaderValue.endsWith("-")){
startRange=Long.parseLong(rangeHeaderValue.substring(byteStr.length(),rangeHeaderValue.indexOf("-")));
}else{
startRange=Long.parseLong(rangeHeaderValue.substring(byteStr.length(),rangeHeaderValue.indexOf("-")));
endRange=Long.parseLong(rangeHeaderValue.substring(rangeHeaderValue.indexOf("-")+1));
}
acContentLenght=sFile.length();
if(endRange>0){
toSendContentLenght=endRange-startRange+1;
}else{
toSendContentLenght=acContentLenght-startRange;
endRange=acContentLenght-1;
}
}
}
final byte buffer[]=new byte[1024*50];
if(isRangeRequest){
long skippedBytes=inStream.skip(startRange);
Log.d(tag,"Bytes skipped "+skippedBytes);
response.setHeader("Content-Range", "bytes " + (startRange + "-" + endRange + "/" + acContentLenght));
response.setHeader("Content-Type", "video/mp4");
response.setHeader("Content-Length", toSendContentLenght + "");
response.setStatusCode(206);
Header headersResponse[]=response.getAllHeaders();
for(int i=0;i<headersResponse.length;i++){
Header h=headersResponse[i];
Log.d(tag,"Range Response " +h.getName() +" = "+h.getValue());
}
}else{
acContentLenght=sFile.length();
response.setHeader("Content-Type", "video/mp4");
response.setHeader("Content-Length",acContentLenght+"");
response.setStatusCode(200);
Header headersResponse[]=response.getAllHeaders();
for(int i=0;i<headersResponse.length;i++){
Header h=headersResponse[i];
Log.d(tag,"Response " +h.getName() +" = "+h.getValue());
}
}
final BufferedInputStream bfIn=new BufferedInputStream(inStream);
final long toSendContentLenghtToLog=toSendContentLenght;
ContentProducer cntProducer=new ContentProducer() {
int readBytes;
long byteSent=0;
@Override
public void writeTo(OutputStream outputStream) throws IOException {
try{
while ((readBytes = bfIn.read(buffer, 0, buffer.length)) != -1) {
Log.d(tag,"readBytes "+readBytes);
byteSent+=readBytes;
outputStream.write(buffer);
outputStream.flush();
}
}catch (IOException ioExce){
Log.d(tag,"IO exception is thrown"+ioExce.getMessage());
ioExce.printStackTrace();
}
finally{
Log.d(tag,"Bytes sent are "+byteSent +" content length is "+toSendContentLenghtToLog);
Log.d(tag,"Finally called");
bfIn.close();
}
}
};
response.setEntity(new EntityTemplate(cntProducer));
Log.d(tag, "handle-");
}