Запрос частичного диапазона с последним отказом байта

При попытке выполнить запрос частичного диапазона с использованием chrome в качестве инструмента воспроизведения видео, воспроизведение видео начинает воспроизводиться, но по достижении половины, оно останавливается, как будто клиент все еще ожидает большего количества данных. На данный момент сервер уже отправил весь запрос. Пожалуйста, соблюдайте следующие запросы и ответ, а также код, используемый для отправки запрошенного диапазона:

Range:bytes=0-

Accept-Ranges:bytes
Content-Length:546827
Content-Range:bytes 0-546827/546828
Content-Type:video/webm

Accept-Ranges:bytes
Content-Length:6155
Content-Range:bytes 540672-546827/546828
Content-Type:video/webm


Accept-Ranges:bytes
Content-Length:1
Content-Range:bytes 546827-546827/546828
Content-Type:video/webm

Правильно ли обработан второй ответ? Потому что он зависает по этому запросу и начинает делать несколько запросов снова, пока время ожидания запроса не истекло.

Код обработки запроса:

private static void copyStream (PullBufferStream inputStream, OutputStream outputStream, BytesStreamObject bytesWrittenObj, int from, int to) throws IOException, CodecNotAvailableException {
    //export media stream
    BufferedOutputStream bout = new BufferedOutputStream (outputStream);
    Buffer b = new Buffer();
    long skipped =0;
    int byteLength = 0;

    do {
        inputStream.read(b);

        int len    = b.getLength();
        byte[] data   = (byte[]) b.getData();
        int  offset = b.getOffset();
        if (len > 0) {
            if(skipped < from) {             
              // skip bytes until reach from position in inputstream
              if(skipped + len <= from) {     
                  // skip all bytes just read
                  skipped += len;
              } else {                       
                  // skip only some of bytes read 
                  offset += (from - skipped);
                  len -= (from - skipped);
                  skipped = from;

              }
            } 
            if(to >= 0) {
                if(from + byteLength + len <= to) {
                    // use the full buffer
                } else {
                    // trim len to needed bytes to be read to prevent exceeding the "to" input parameter
                    len = (to + 1) - (from + byteLength);
                }
            } 

            byteLength+= len;
            bytesWrittenObj.bytesWritten = byteLength;
            bout.write(data, offset, len);
            //bout.write(data, from, end);
        } 
    } while (!b.isEOM());
    //fileProperties.setBytesLength(byteLength);

    //bout.close(); 

}

1 ответ

Решение

Мне нужно было убедиться, что я очищаю выходной поток, но также внес некоторые изменения в фактический размер файла, а не с помощью stream.available().

Другие вопросы по тегам