Я занимаюсь разработкой приложения для iOS, и я довольно новичок в разработке для iOS. До сих пор я реализовал h264-декодер из сетевого потока с использованием VideoToolbox, что было довольно сложно.
Теперь мне нужно воспроизвести аудиопоток, исходящий из сети, но без участия файла, только необработанный поток AAC, считываемый непосредственно из сокета. Этот поток поступает из выходных данных экземпляра ffmpeg.
Проблема в том, что я не знаю, как начать с этого, кажется, есть немного информации по этой теме. Я уже пробовал с AVAudioPlayer
, но нашел только тишину. Я думаю, что сначала мне нужно распаковать пакеты из потока, как с помощью декодера h264.
Я пробовал также с AVAudioEngine
и AVAudioPlayerNode
, но безуспешно, так же, как с AVAudioPlayer
. Может ли кто-нибудь дать мне руководство? Может быть AudioToolbox
? AudioQueue
Большое спасибо за помощь:)
Edit:
Я играю с AVAudioCompressedBuffer
и без ошибок использую AVAudioEngine
и AVAudioNode
. Но я не знаю, что означает этот вывод:
inBuffer: <AVAudioCompressedBuffer@0x6040004039f0: 0/1024 bytes>
Значит ли это, что буфер пуст? Я пытался заполнить этот буфер несколькими способами, но всегда возвращает что-то вроде 0/1024. Я думаю, что я не делаю это правильно:
compressedBuffer.mutableAudioBufferList.pointee = audioBufferList
Есть идеи?
Спасибо!
Редактировать 2:
Я редактирую для отражения моего кода для распаковки буфера. Может быть, кто-то может указать мне в правильном направлении.
Примечание. Пакет, который принимается этой функцией, фактически передается без заголовка ADTS (9 байт), но я также попытался передать его с заголовком.
func decodeCompressedPacket(packet: Data) -> AVAudioPCMBuffer {
var packetCopy = packet
var streamDescription: AudioStreamBasicDescription = AudioStreamBasicDescription.init(mSampleRate: 44100, mFormatID: kAudioFormatMPEG4AAC, mFormatFlags: UInt32(MPEG4ObjectID.AAC_LC.rawValue), mBytesPerPacket: 0, mFramesPerPacket: 1024, mBytesPerFrame: 0, mChannelsPerFrame: 1, mBitsPerChannel: 0, mReserved: 0)
let audioFormat = AVAudioFormat.init(streamDescription: &streamDescription)
let compressedBuffer = AVAudioCompressedBuffer.init(format: audioFormat!, packetCapacity: 1, maximumPacketSize: 1024)
print("packetCopy count: \(packetCopy.count)")
var audioBuffer: AudioBuffer = AudioBuffer.init(mNumberChannels: 1, mDataByteSize: UInt32(packetCopy.count), mData: &packetCopy)
var audioBufferList: AudioBufferList = AudioBufferList.init(mNumberBuffers: 1, mBuffers: audioBuffer)
var mNumberBuffers = 1
var packetSize = packetCopy.count
// memcpy(&compressedBuffer.mutableAudioBufferList[0].mBuffers, &audioBuffer, MemoryLayout<AudioBuffer>.size)
// memcpy(&compressedBuffer.mutableAudioBufferList[0].mBuffers.mDataByteSize, &packetSize, MemoryLayout<Int>.size)
// memcpy(&compressedBuffer.mutableAudioBufferList[0].mNumberBuffers, &mNumberBuffers, MemoryLayout<UInt32>.size)
// compressedBuffer.mutableAudioBufferList.pointee = audioBufferList
var bufferPointer = compressedBuffer.data
for byte in packetCopy {
memset(compressedBuffer.mutableAudioBufferList[0].mBuffers.mData, Int32(byte), MemoryLayout<UInt8>.size)
}
print("mBuffers: \(compressedBuffer.audioBufferList[0].mBuffers.mNumberChannels)")
print("mBuffers: \(compressedBuffer.audioBufferList[0].mBuffers.mDataByteSize)")
print("mBuffers: \(compressedBuffer.audioBufferList[0].mBuffers.mData)")
var uncompressedBuffer = uncompress(inBuffer: compressedBuffer)
print("uncompressedBuffer: \(uncompressedBuffer)")
return uncompressedBuffer
}