Вопрос

Как я могу реализовать поиск (функция временной шкалы) в потоковом аудио на iPhone?

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

Но я не смог найти никакого способа узнать количество байтов, которые уже были воспроизведены.Я могу узнать количество байтов, которые были переданы в потоковом режиме.Но не удается узнать, сколько байт было воспроизведено.В качестве основы я использую пример потоковой передачи аудио Мэтта Галлахера.

Любая помощь очень ценится.

Спасибо.

Возможно, просто удастся найти решение.Документация AudioFileStreamSeek гласит

После вызова этой функции анализатор принимает следующие данные, переданные функция AudioFileStreamParseBytes AudioFileStreamParseBytes запускается с возвращенного смещения в байтах в outAbsoluteByteOffset параметр.

Как нам это сделать?Должны ли мы использовать параметр Http Range?Если мы отправим смещение в байтах в Range, будет ли это работать так, как ожидалось?И как я должен очистить существующие байты в буфере, чтобы избежать совместного воспроизведения двух потоков?

Любая помощь очень ценится.Спасибо.

Это было полезно?

Решение

AudioFileStreamSeek работает с пакетами, а не с количеством байт.Итак, что вам действительно нужно отслеживать, так это количество пакетов.

Метод MyEnqueueBuffer в коде Мэтта - это когда буферы отправляются в AudioQueue для воспроизведения.Возьмите packetsfilled и увеличьте свою индексную переменную, прежде чем packetsfilled будет сброшен на 0:

myData.absolutePackets = myData.absolutePackets + myData-> Пакеты заполнены;

Моя проблема в том, что я не могу правильно реализовать AudioFileStreamSeek даже с этим значением.Так что, если у вас есть какой-нибудь пример кода рабочего поиска с кодом Мэтта, пожалуйста, поделитесь.

Спасибо!

Другие советы

Я действительно не пробовал AudioFileStream API для этого (мы внедрили наш собственный внутренний интерфейс), но вот несколько вещей, о которых вы должны позаботиться.

Если предположить, что у вас нет проблем с произвольным поиском потока байтов, то вам нужно продолжать отслеживать взаимосвязь между номером кадра MP3 и абсолютным местоположением потока байтов, как и говорит Пол.Я предполагаю, что вы можете сделать это в своем AudioFileStream_PacketsProc, вызвав AudioFileStreamSeek по пути.

Вот самая сложная часть.Когда вы выполняете случайный поиск, вам необходимо сбросить внутренние состояния AudioFileStream.Потому что он может находиться в некотором промежуточном состоянии, ожидая, что следующие входящие байты завершат текущий кадр.Я не уверен, можете ли вы просто ввести нули, чтобы пропустить текущий кадр и начать все сначала (это вам нужно попробовать, поскольку я не вижу ничего похожего на AudioFileStreamReset в API;однако сама звуковая очередь имеет функцию сброса, с помощью которой вы можете очистить уже поставленный в очередь кадр).В любом случае вы также должны позаботиться о своем AudioFileStream_PacketsProc, потому что вы собираетесь проанализировать часть потока байтов, которую вы уже отслеживали.

Обратите внимание, что вы не можете просто найти начало MP3-кадра, полагаясь на секунду и битрейт.Даже при потоке MP3 с неизменяемой скоростью могут быть отступы через каждые несколько кадров.Таким образом, наиболее точная информация по-прежнему поступает от анализатора.

Я должен быстро добавить, что другой способ выполнить случайный поиск - это просто "кэшировать" (хранить) проанализированные пакеты, если вы не воспроизводите действительно длинный и большой поток.Индекс кадра может быть вычислен на основе информации заголовка кадра.Для MP3-файлов, отличных от VBR, частота кадров в секунду является постоянной (напримерэто 44100/1152 = 38,28125 кадров в секунду для стереофонического MP3 без VBR с частотой 44,1 кГц.;ознакомьтесь со спецификацией MP3, чтобы понять, почему это так).

можете ли вы использовать AudioQueueStart с mSampleTime места, к которому вы хотите обратиться?

так что просто остановите игру....и начать с другого времени выборки?[просто возьмите текущее время выборки и манипулируйте им так, как вам нужно?]

inDeviceStartTime Время, в которое должна начинаться очередь аудио.

Чтобы указать время начала относительно временной шкалы соответствующего аудиоустройства, используйте поле mSampleTime структуры AudioTimeStamp.Используйте NULL, чтобы указать, что очередь аудиозаписей должна начаться как можно скорее.

Возвращаемое значение Код результата.Смотрите раздел “Коды результатов очереди аудио”.

Обсуждение Если соответствующее аудиоустройство еще не запущено, эта функция запускает его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top