AVAudioFile из памяти?

Я играю с AVAudioFile и AVAudioPlayerNode.

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

Это: он отлично работает, когда я записываю данные во временный файл и загружаю его с помощью AVAudioFile (затем я инициализирую AVAudioBuffer и использую AVAudioFile.readIntoBuffer &, наконец, AVAudioPlayerNode.scheduleBuffer). Но я не могу загрузить буфер напрямую из первого фрагмента (NSData).

Должен ли я реализовать собственный протокол NSURLProtocol и попытаться инициализировать AVAudioFile из настраиваемого NSURL?

func play( data: NSData ) {
var audioFile: AVAudioFile
var audioBuffer: AVAudioPCMBuffer
// writing the data
let destPath = NSTemporaryDirectory() + "chunk.mp3"
data.writeToFile( destPath, atomically: true )
// initializing the AVAudioFile
audioFile = AVAudioFile( forReading: NSURL(string: destPath)!)
// initializing the AVAudioPCMBuffer
audioBuffer = AVAudioPCMBuffer(PCMFormat: audioFile.processingFormat,
                               frameCapacity: UInt32(data.length))
audioFile.readIntoBuffer( audioBuffer )
/*
    I didn't put any AVAudioPlayerNode/AVAudioEngine in this code to keep it simple and describe the situation,
    anyway this works fine when everything's properly initialized:
*/
player.scheduleBuffer( audioBuffer, completionHandler: nil )
}

person Matías Insaurralde    schedule 25.01.2016    source источник


Ответы (1)


Из документация:

Для воспроизведения потокового аудиоконтента, например, из сетевого подключения, используйте службы потока аудиофайлов совместно со службами очереди аудио. Службы потока аудиофайлов анализируют аудиопакеты и метаданные из распространенных форматов контейнеров аудиофайлов в сетевом потоке битов. Вы также можете использовать его для анализа пакетов и метаданных из файлов на диске.

Ключевым моментом здесь является использование служб аудиофайлов для передачи данных в буферы и постановки их в очередь с помощью служб аудио очереди. Сетевая часть обычно выполняется с использованием CFNetwork API, что намного ниже уровня NSURLProtocol.

Пример кода Apple «AudioFileStreamExample» иллюстрирует клиентскую и серверную реализацию, передающую звук в потоковом режиме. Это было бы подходящей отправной точкой.

person quellish    schedule 25.01.2016
comment
Спасибо, посмотрю! - person Matías Insaurralde; 25.01.2016