Как искать 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

Это все выглядит хорошо? Любые указатели для поиска в таком файле будут очень благодарны. Спасибо!

0 ответов

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