2009-03-16 2 views
2

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

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

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

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

Спасибо.

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

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

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

Любая помощь очень ценится. Благодарю.

ответ

2

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

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

myData.absolutePackets = myData.absolutePackets + myData-> packetsFilled;

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

Спасибо!

1

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

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

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

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

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

0

Вы можете использовать AudioQueueStart с mSampletime места, которое вы хотите найти?

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

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

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

Возвращаемое значение Код результата. См. «Коды результатов воспроизведения звука».

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

+2

AudioQueueStarts mSampletime - это только задержка перед запуском AudioQueue - не позиция, из которой можно играть. – Constantin

Смежные вопросы