亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果傳輸狀態為 206 部分內容,Chrome 將無法加載視頻

如果傳輸狀態為 206 部分內容,Chrome 將無法加載視頻

萬千封印 2023-04-26 14:24:49
我正在制作一個簡單的 Javacom.sun.net.httpserver.HttpServer來提供靜態視頻文件。如果我返回狀態代碼 206,部分內容,當我嘗試通過瀏覽器訪問它時,視頻無法播放(狀態代碼為 200 的視頻播放正常,但我希望能夠搜索和循環播放視頻),這是我的HttpHandler:final String path = StaticHandler.toPathSafe(httpExchange.getRequestURI().getPath());System.out.println(path);final File file = new File(path);if (file.isFile()){    int code = 200;    long position = 0L;    long end = file.length();    if (httpExchange.getRequestHeaders().containsKey("Range"))    {        try        {            long[] range = StaticHandler.parseRange(httpExchange.getRequestHeaders().get("Range").get(0));            position = range[0];            if (range[1] != -1)                end = range[1];            // the video loads fine when code = 200;            code = 206;            httpExchange.getResponseHeaders().set("Content-Range", "bytes " + position + "-" + end + "/" + file.length());        }        catch (Exception e)        {            e.printStackTrace();        }    }    httpExchange.getResponseHeaders().set("Accept-Range", "bytes");    httpExchange.getResponseHeaders().set("Content-Type", "video/mp4");    httpExchange.getResponseHeaders().set("Content-Length", String.valueOf(end - position));    System.out.println("Response: " + position + ", " + end);    httpExchange.sendResponseHeaders(code, 0L);    final FileChannel fileChannel = new FileInputStream(file).getChannel();    final WritableByteChannel responseChannel = Channels.newChannel(response.getOutputStream());    fileChannel.transferTo(position, end - position, responseChannel);    responseChannel.close();    fileChannel.close();}else{    System.out.println("404");    httpExchange.sendResponseHeaders(404, -1);}上面的代碼無法在 chrome 上加載,但在 firefox 中工作正常,這是我在 Chrome 中獲得的標頭:Response Headers:Accept-range: bytesContent-length: 31491166Content-range: bytes 0-31491166/31491166Content-type: video/mp4Date: Sat, 27 Jul 2019 14:32:55 GMTTransfer-encoding: chunked我是否遺漏了什么和/或我的代碼有什么問題?
查看完整描述

2 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

范圍包括開始到結束。不是起始長度

例如:

Content-range: bytes 0-0/31491166

返回 1 個字節(從字節零到字節零)

您的代碼不起作用,因為瀏覽器正在等待一個從未發送過的字節。


查看完整回答
反對 回復 2023-04-26
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

使用下面的代碼片段。它在所有瀏覽器Safari、Firefox 和 Chrome上運行和測試。


protected byte[] prepareContent(final HttpHeaders headers, byte[] media,

        String range) throws IOException {

    

    long rangeStart = 0;

    long rangeEnd;


    long fileSize = media.length;

    String[] ranges = range.split("-");

    rangeStart = Long.parseLong(ranges[0].substring(6));


    if (ranges.length > 1) {

        rangeEnd = Long.parseLong(ranges[1]);

    } else {

        rangeEnd = fileSize - 1;

    }

    if (fileSize < rangeEnd) {

        rangeEnd = fileSize - 1;

    }

    

    String contentLength = String.valueOf((rangeEnd - rangeStart) + 1);

    

    headers.add("Content-Length", contentLength);

    headers.add("Content-Range", "bytes " + rangeStart + "-" + rangeEnd + "/" + fileSize);

    headers.add("Content-Type", "video/mp4");

    headers.add("Accept-Ranges","bytes");

    return readByteRange(media, rangeStart, rangeEnd);

}


private byte[] readByteRange(byte[] media, long start, long end) throws IOException {

    

    try (InputStream inputStream = new ByteArrayInputStream(media);

         ByteArrayOutputStream bufferedOutputStream = new ByteArrayOutputStream()) {

        

        int nRead;

        while ((nRead = inputStream.read(media, 0, media.length)) != -1) {

            bufferedOutputStream.write(media, 0, nRead);

        }

        bufferedOutputStream.flush();

        byte[] result = new byte[(int) (end - start) + 1];

        System.arraycopy(bufferedOutputStream.toByteArray(), (int) start, result, 0, result.length);

        return result;

    }

}


查看完整回答
反對 回復 2023-04-26
  • 2 回答
  • 0 關注
  • 946 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號