HTTP Live Streaming с аудиофайлами разной длины

Я пытаюсь транслировать аудио на клиентов iOS и Safari с помощью Apple ' s Протокол HTTP Live Streaming . В отличие от многих распространенных реализаций HTTP Live Streaming, моя цель - использовать короткие аудиоклипы, которые по своей природе имеют разную длину, в основном в диапазоне 10-30 секунд. В дополнение к потоковой передаче звука из этих сегментов, я хотел бы получить доступ к метаданным для каждого сегмента, чтобы я мог обновить отображение и / или предоставить пользователю дополнительные параметры для получения дополнительной информации о конкретном аудио сегменте.

В настоящее время у меня есть настроил несколько тестовых примеров, которые конвертируют мой исходный звук (MP3) в различные форматы и создают потоковые файлы M3U для тестирования на устройствах iOS, но ни один из моих подходов не работал должным образом (потоковая передача правильно и передача метаданных клиенту). Я использую AVPlayer для загрузки и воспроизведения созданных файлов M3U:

_playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://localhost/sample.m3u8"]]
_player = [[AVPlayer alloc] initWithPlayerItem:_playerItem];
[_playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];

// ... wait for user input

[_player play];

Подход 1: Необработанные файлы MP3

Я взял исходные файлы MP3 с метаданными id3v2 (v2.3.0) и добавил их в список воспроизведения M3U.

#EXTM3U
#EXT-X-TARGETDURATION:23
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:14
http://localhost/trk_01.mp3
#EXTINF:22
http://localhost/trk_02.mp3
#EXTINF:16
http://localhost/trk_03.mp3
#EXT-X-ENDLIST

Результаты: Свойство timedMetadata обновляется, как только начинается воспроизведение с правильной информацией ID3 для первой дорожки. Воспроизводится первая композиция, но ближе к концу она обрывается. Данные ID3 для второй дорожки отображаются, но воспроизведение второй дорожки не начинается. Через несколько секунд я получаю сообщение об ошибке на консоли:

2011-04-26 07:04:52.668 TestClient[49756:601b] Prime: Exiting because mConverterError is '!buf' (0x800 req, 0x0 primed)
2011-04-26 07:04:52.668 TestClient[49756:601b] Prime failed ('!buf'); will stop (2048/0 frames)

Подход 2: Используйте Mediafilesegmenter Apple для создания отдельных файлов MP3

В этом подходе я использую mediafilesegmenter для создания нового MP3-файла для каждого сегмента . Инструмент сегментации Apple обычно используется для сегментации, но поскольку все мои аудиоклипы короткие и разной длины, это не совсем подходит для моего приложения. Я передаю утилите целевую продолжительность в 999 секунд, чтобы она создавала один выходной файл для каждого входного файла, который я ей передаю. Вот команда, которую я использую для создания каждой отдельной дорожки:

mediafilesegmenter -t 999 -f "$OUTPUT_DIR" "$INPUT_FILE" && cp $OUTPUT_DIR/fileSequence0.mp3 $OUTPUT_FILE

Получившийся MP3-файл, кажется, имеет некоторые данные о времени, поскольку vbindiff показывает мне изменение в заголовке файла и появляется строка «com.apple.streaming.transportStreamTimestamp» в первых нескольких байтах нового файла. При исследовании этой строки в проекте спецификации HTTP Live Streaming обнаруживается отрывок:

Файлы элементарного аудиопотока ДОЛЖНЫ сигнализировать метку времени первого образец в файле, добавив Тег ID3 PRIV [ID3] с владельцем идентификатор "com.apple.streaming.transportStreamTimestamp". Двоичные данные ДОЛЖНЫ быть 33-битными. Элементарный поток программы MPEG-2 отметка времени, выраженная в виде прямого байта восьмиоктетное число, с верхним 31 биты установлены в ноль.

Затем я создаю файл M3U так же, как в Подходе 1. (Обратите внимание, что с помощью mediafilesegmenter я также могу передавать информацию ID3, используя предварительно созданные файлы тегов ID3 ​​и метафайл, описывающий смещения времени ID3. I ' я пропустил это здесь, потому что я даже не могу заставить эти файлы правильно воспроизводиться.)

Результаты: Первый трек транслируется так же, как в подходе 1. Трек снова обрывается ближе к концу, а второй трек не воспроизводится. играть. Метаданные отсутствуют, но их можно достаточно легко добавить с помощью параметра -M в mediafilesegmenter.

Подход 3: Используйте ffmpeg для создания файлов транспортного потока MPEG

Используя этот последний подход, я передаю исходные файлы MP3 через ffmpeg для создания Данные транспортного потока MPEG:

ffmpeg -i "$INPUT_FILE" -f mpegts -acodec copy "$OUTPUT_FILE"

Затем я создаю M3U, как и в первых двух подходах.

Результаты: Этот подход действительно работает; все файлы плавно передаются клиенту. Однако я не могу передать какие-либо метаданные клиенту. Я безуспешно пытался передать аргументы типа -metadata title = "My Title" в ffmpeg.

9
задан Cœur 11 July 2019 в 05:20
поделиться