android media player 5.0版本发送多个范围请求

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

1> 我正在使用本地代理服务器从网络驱动器播放视频文件

2> 它在4.x版本时运行良好,我在5.0版本时得到了更新,现在代码不工作了

3> 它播放一些视频的初始帧,而不是连续发送范围请求

处理来自媒体播放器的请求的代码

@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-");
}