Правильно разделить MPEG-1 Layer 3 для потокового сервера - PullRequest
1 голос
/ 05 ноября 2019

Я работаю на сервере потоковой передачи музыки. Прямо сейчас я хочу отправить файл MP3 порциями с сервера на клиент (через запрос / ответ http-диапазона). Мой клиент успешно декодирует данные ответа и воспроизводит музыкальный фрагмент после фрагмента (фиксированный размер в байтах), но между каждым фрагментом есть заикающийся звук (короткий, но заметный).

Версия кодирования файла MP3 - MPEG-1 и уровень 3. Я читал о формате MP3 в этой статье , я заметил, что в слое 3 кадры не являются независимыми (так называемый бит /байт-накопитель) и они специально сказали:

В худшем случае может потребоваться 9 входных кадров, прежде чем можно будет декодировать один кадр

Причина, по которой я использую http-страница запроса заключается в том, что после проверки Spotify передачи по сети (Chrome dev-tool) я копирую их метод для запроса частичного содержимого. Длина запрашиваемого ими байта составляет приблизительно 166000, но не является фиксированной (иногда 166287, 16682 ... байтов)

Вопрос:

Имеет ли Spotify разделить их файл на приблизительный (не фиксированный) размер блока?

Если это так, как мне правильно разделить этот файл MPEG-1 Layer 3 правильно для потоковой передачи?

1 Ответ

0 голосов
/ 06 ноября 2019

Прямо сейчас я использую JavaScript на клиентской стороне для воспроизведения аудио. Я использую класс «AudioContext» и метод «decodeAudioData» для декодирования каждого куска

Как указывает @szatmary, это проблема. Вы рассматриваете эти куски, как будто они полностью независимы, но это не так. Это приводит к возникновению сбоев.

Что вам нужно сделать, это декодировать, как вы идете, и добавить данные в конец того буфера, который вы декодируете. Расширения MediaSource - это предписанный способ сделать это. MSE дает вам контроль над тем, как вы извлекаете эти данные, поэтому, если вы хотите получить их с помощью запросов Range, вы можете. Просто установите атрибут src элемента Audio и дайте ему поиграть. Браузер достаточно умен, чтобы делать свои собственные запросы диапазона, а также, при необходимости, откатится к обычным запросам. Это позволяет браузеру также обрабатывать управление потоком. Вам не нужно делать никакой дополнительной работы, и вы получите более оптимальное решение.

...