Запрос частичного диапазона с последним отказом байта
При попытке выполнить запрос частичного диапазона с использованием 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().