Потоковая передача видео с сервера с помощью readableSteamJavascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Потоковая передача видео с сервера с помощью readableSteam

Сообщение Anonymous »

Deno имеет эту вещь ReadableStream, которая должна быть совместима с тем, что из браузеров. https://developer.mozilla.org/en-us/doc ... ablestream
И это следует использовать, когда вы хотите транслировать вещи. В примере в их документах используется некоторая дата/интервал и текст, а не видео
Но я нашел немного более старого кода в Интернете, который показывает, как использовать его с видео:

Код: Выделить всё

  const { size } = await Deno.stat("video.mp4");
const range = req.headers.get("range");

if (!range) {
throw new Error("no range");
}
console.log("req range=", range)

const num_blocks = 100;
const block_size = 16_384;
const chunk_size = block_size * num_blocks;

const start_index = Number(range.replace(/\D/g, "")?.trim());
const end_index = Math.min(start_index + chunk_size, size);
const file = await Deno.open("video.mp4", { read: true });
if (start_index > 0) {
await file.seek(start_index, Deno.SeekMode.Start);
}

let read_blocks = num_blocks;
let read_bytes = 0;
console.info("calc range=", start_index, end_index, size)
const stream = new ReadableStream({
start(){
console.log("start")
},
async pull(controller) {
const chunk = new Uint8Array(block_size);
try {
const read = await file.read(chunk);
console.log("read block bytes=", read)
if (read !== null && read > 0) {
controller.enqueue(chunk.subarray(0, read));
read_bytes += read;
}

read_blocks--;
if (read_blocks === 0) {
log.info("no more blocks", read_bytes)
controller.close();
file.close();
}
} catch (e) {
controller.error(e);
console.log(e)
file.close();
}
},

cancel(reason){
console.log("canceled=", reason)
file.close();
}
});

return new Response(stream, {
status: 206,
headers: {
"Content-Range": `bytes ${start_index}-${end_index}/${size}`,
"Accept-Ranges": "bytes",
"Content-Length": `${end_index - start_index}`,
"Content-Type": "video/mp4",
},
});
< /code>
Приведенный выше код предназначен для сервера видео в куски около 1,5 МБ каждый, и ReadableStream должен читать каждый кусок в блоках 16 КБ, так что это 100 блоков. /p>
Похоже, что он нормально транслируется в Firefox, но иногда я получаю ошибку в консоли Deno Typeerror: контроллер потока не может закрыть или заканчивать или enqueue 
(не всегда)
В Chrome он транслируется всего около 12 секунд, даже видео длиной 30 секунд. Если вы нажмите на игру снова, это начинается с самого начала. И в консоли я иногда получаю ту же ошибку, что и у Firefox.
Есть идеи, как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/794 ... dablesteam
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Потоковая потоковая передача видео с камеры FLIR с помощью Python
    Anonymous » » в форуме Python
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Потоковая потоковая передача Polars: Parquet Parquet на основе Shift (-1)
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Потоковая передача ответов с сервера вывода Triton с помощью бэкэнда Python
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Потоковая передача ответов с сервера вывода Triton с помощью бэкэнда Python
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Потоковая передача видео с использованием AWS SDK – вызов второго диапазона байтов не работает
    Гость » » в форуме JAVA
    0 Ответы
    68 Просмотры
    Последнее сообщение Гость

Вернуться в «Javascript»