Я использую AVAssetReader для копирования данных PCM с дорожки iPod в буфер, который затем воспроизводится с помощью аудиоустройства RemoteIO.Я пытаюсь создать отдельный поток для загрузки звуковых данных, чтобы я мог получить доступ и воспроизводить данные из буфера во время его загрузки.
В настоящее время у меня есть большой объект NSMutableData, который в конечном итоге содержит всю песнюданные.В настоящее время я загружаю аудиоданные в отдельном потоке, используя NSOperation следующим образом:
- AVAssetReaderOutput копирует, самое большее, 8192 байта за раз в CMBlockBuffer
- Скопируйте эти байты в NSDataobject
- Добавить этот объект NSData к большему объекту NSMutableData (который в конечном итоге содержит всю песню)
- Когда закончите, воспроизведите песню, получив доступ к каждому пакету в объекте NSMutableData
Я пытаюсь воспроизвести песню, копируя эти байты.Я не уверен, что хороший способ записи и чтения из файла того же времени.
Короткая идея, которая у меня была:
- Создание и заполнение 3 объектов NSData, каждыйДлина 8192 байта в качестве буферов.
- Начните играть.Когда я закончу воспроизведение первого буфера, загрузите новые данные в первый буфер.
- Когда я закончу воспроизведение второго буфера, загрузите новые данные во второй.То же самое для третьего
- Начните воспроизведение с первого буфера снова, заполните третий.И т. Д.
Или создайте один объект NSData, содержащий 3 * 8192 единицы PCM, и каким-либо образом выполняйте запись и чтение из него одновременно с двумя различными потоками.
Мой код работает на двух разных потоках прямо сейчас.Я добавляю данные в массив до тех пор, пока не нажму кнопку воспроизведения, после чего он останавливается (возможно, потому что поток заблокирован, но я не знаю прямо сейчас) и воспроизводится, пока не достигнет конца того, что я загрузил, и не вызовет исключение EXC_BAD_ACCESS.
Короче говоря, я хочу найти правильный способ воспроизведения данных PCM, когда они копируются, скажем, 8192 байта за раз.Вероятно, мне придется сделать это с другим потоком (я сейчас использую NSOperation), но неясно, как писать и читать из буфера одновременно, предпочтительно с использованием методов Objective-C более высокого уровня.