Как искать MP4 AAC аудио с помощью Media Source Extensions
Кто-нибудь может предложить мне несколько советов при поиске в потоке aac audio в контейнерах mp4? Я пытаюсь разработать службу загрузки музыки, которая будет получать данные с помощью удаленных запросов, а не просто ссылаться на файл mp4 в виде <audio>
ЦСИ. (который вместо этого будет буферизовать весь файл как можно быстрее, и поэтому будет довольно расточительным и дорогим).
До сих пор мне удавалось успешно добавлять последовательные буферы звукового диапазона к объекту SourceBuffer с помощью частичных / ранжированных запросов, прикрепленных к моему объекту MediaSource с типичным использованием MIME. Но как только я пытаюсь выполнить поиск, колеса отключаются, и я получаю сообщение об ошибке " CHUNK_DEMUXER_ERROR_APPEND_FAILED " с конкретной проблемой: " Сбой анализа потока ".
Я подготовил свои mp4 файлы, кодируя их с помощью ffmpeg (через модуль fluent ffmpeg), переписывая поле заголовка фильма в начале файла (через -movflags faststart
настройка), так что продолжительность может быть проанализирована. Затем я фрагментирую файл с mp4fragment (частью инструментов Bento4) с настройками по умолчанию и проверяю, чтобы структура файла соответствовала формату, указанному в ISO BMFF, с парами фрагментов фильма и блоков данных (moof/mdat), описывающих аудио поток Поскольку исходный буфер не имеет проблем с воспроизведением с самого начала, со смежными последующими диапазонами, это, кажется, подтверждает, что формат файла mp4 является приемлемым.
Кроме того, я попытался полностью фрагментировать файл в ffmpeg / fluent ffmpeg (используя параметры '-movflags empty_moov + default_base_moof'), но пока это работает, он также удаляет длительность из moov, как и следовало ожидать, поэтому файл увеличивается во время воспроизведения, так как все больше фрагментов извлекаются и добавляются. Если я установлю длительность файла вручную, у меня все еще будет проблема с невозможностью поиска небуферизованного аудио, поэтому мне кажется, что мне становится все труднее пытаться фрагментировать файл исключительно в ffmpeg.
Так как же мне искать в потоке? Я понял, что при эффективном поиске происходит произвольное "удаление иголками" случайным образом, поэтому исходный буфер может не справиться с анализом данных вне контекста, но я подумал, что он перейдет к следующему доступному фрагменту в диапазоне, который я получу (который рассчитывается с использованием процент ширины полосы поиска для установки player.currentTime, который затем преобразуется в подходящий диапазон байтов с использованием значения CBR 128 кбит / с для преобразования секунд в байты для отправки запроса частичного диапазона 206).
Я видел упоминания о смещениях буфера, но я не понимаю, как они применяются. Большинство примеров разработки, которые я видел, фокусируются только на целых файлах или сегментированных видео, а не на фрагментированных отдельных аудиофайлах для поиска? Нужно ли каким-то образом сохранять часть данных из окна moov при поиске исходного буфера, чтобы иметь возможность его проанализировать? В коробке багажника у меня есть data offset
это варьируется между двумя значениями по всему файлу, 444 и 448, в зависимости от того, равно ли число выборок 86 или 87. Я не уверен, почему это не соответствует.
Вот как выглядит moov из моего аудиофайла:
[ftyp] size=8+24
major_brand = isom
minor_version = 200
compatible_brand = isom
compatible_brand = iso2
compatible_brand = mp41
compatible_brand = iso5
[moov] size=8+620
[mvhd] size=12+96
timescale = 1000
duration = 350047
duration(ms) = 350047
[trak] size=8+448
[tkhd] size=12+80, flags=7
enabled = 1
id = 1
duration = 350047
width = 0.000000
height = 0.000000
[edts] size=8+28
[elst] size=12+16
entry count = 1
entry/segment duration = 350000
entry/media time = 2048
entry/media rate = 1
[mdia] size=8+312
[mdhd] size=12+20
timescale = 44100
duration = 0
duration(ms) = 0
language = und
[hdlr] size=12+41
handler_type = soun
handler_name = Bento4 Sound Handler
[minf] size=8+219
[smhd] size=12+4
balance = 0
[dinf] size=8+28
[dref] size=12+16
[url ] size=12+0, flags=1
location = [local to file]
[stbl] size=8+159
[stsd] size=12+79
entry-count = 1
[mp4a] size=8+67
data_reference_index = 1
channel_count = 2
sample_size = 16
sample_rate = 44100
[esds] size=12+27
[ESDescriptor] size=2+25
es_id = 0
stream_priority = 0
[DecoderConfig] size=2+17
stream_type = 5
object_type = 64
up_stream = 0
buffer_size = 0
max_bitrate = 128006
avg_bitrate = 128006
DecoderSpecificInfo = 12 10
[Descriptor:06] size=2+1
[stts] size=12+4
entry_count = 0
[stsc] size=12+4
entry_count = 0
[stsz] size=12+8
sample_size = 0
sample_count = 0
[stco] size=12+4
entry_count = 0
[mvex] size=8+48
[mehd] size=12+4
duration = 350047
[trex] size=12+20
track id = 1
default sample description index = 1
default sample duration = 0
default sample size = 0
default sample flags = 0
А вот типичный фрагмент:
[moof] size=8+428
[mfhd] size=12+4
sequence number = 1
[traf] size=8+404
[tfhd] size=12+8, flags=20008
track ID = 1
default sample duration = 1024
[tfdt] size=12+8, version=1
base media decode time = 0
[trun] size=12+352, flags=201
sample count = 86
data offset = 444
[mdat] size=8+32653
Это все выглядит хорошо? Любые указатели для поиска в таком файле будут очень благодарны. Спасибо!