Tag: 核心 audioaudio

AudioFileReadPacketData传递有效文件时返回-50

我花了一些时间试图自己debugging,但我似乎无法得到AudioFileReadPacketData正确读取传入的数据。 这几乎基于Apple AudioQueueServices Guide 。 class SVNPlayer: SVNPlayback { var queue: AudioQueueRef? var audioFormat: AudioStreamBasicDescription! var playbackFile: AudioFileID? var packetDesc: AudioStreamPacketDescription! var isDone = false var packetPosition: Int64 = 0 var numPacketsToRead = UInt32() private let callback: AudioQueueOutputCallback = { aqData, inAQ, inBuffer in guard let userData = aqData else { return } let audioPlayer […]

audio队列:AudioQueueStart返回-50

我正在尝试在GLES应用程序(Unity3d)中编写麦克风功率计模块。 它在UIKit应用程序中正常工作。 但是,当我整合到我的unity3d项目中,AudioQueue无法启动属性。调用AudioQueueStart的结果代码始终是-50,但-50是什么意思? 我无法在iOS开发人员库中find参考。 我已经search了这个问题,并知道有人在cocos2d应用程序中有相同的问题。 也许这有一些相关性。 这是我的开始audio队列的代码: UInt32 ioDataSize = sizeof(sampleRate); AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &ioDataSize, &sampleRate); //returns noErr format.mSampleRate = sampleRate; format.mFormatID = kAudioFormatLinearPCM; format.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; format.mFramesPerPacket = format.mChannelsPerFrame = 1; format.mBitsPerChannel = 16; format.mBytesPerPacket = format.mBytesPerFrame = 2; AudioQueueNewInput(&format, listeningCallback, self, NULL, NULL, 0, &queue); //returns noErr AudioQueueBufferRef buffers[3]; for (NSInteger i = […]

为什么我的AudioQueueOutputCallback不能被调用?

我正在使用audio队列服务API播放通过iPhone上的TCP套接字连接从服务器stream式传输的audio。 我可以播放从套接字连接填充的缓冲区,我似乎无法使我的AudioQueue调用我的AudioQueueOutputCallback函数,我不知道。 高层次的devise 数据从套接字连接传递给播放器,并立即写入内存中的循环缓冲区。 随着AudioQueueBuffers变得可用,将数据从循环缓冲区复制到可用的AudioQueueBuffer中,并立即重新排队。 (或者,如果我的callback发生了) 怎么了 缓冲区全部被填满并成功排队,我清楚地听到了audiostream。 为了进行testing,我使用了大量的缓冲区(15),并且所有的缓冲区都可以无缝地播放,但是AudioQueueOutputCallback从来没有被调用过,所以我从来不会重新排列任何这些缓冲区,尽pipe事实似乎一切正常。 如果我不等我的callback,假设它永远不会被调用,而是根据写入的数据驱动缓冲区的排队,我可以无限期地播放audiostream,重用和重新排列缓冲区,就好像它们一样已经明确地回到了我的callback。 事实是:我可以在需要时重复使用缓冲区的情况下完美地播放stream,这使我最困惑。 为什么不调用callback? 可能有关的代码 stream的格式是16位线性PCM,8kHz,单声道: _streamDescription.mSampleRate = 8000.0f; _streamDescription.mFormatID = kAudioFormatLinearPCM; _streamDescription.mBytesPerPacket = 2; _streamDescription.mFramesPerPacket = 1; _streamDescription.mBytesPerFrame = sizeof(AudioSampleType); _streamDescription.mChannelsPerFrame = 1; _streamDescription.mBitsPerChannel = 8 * sizeof(AudioSampleType) _streamDescription.mReserved = 0; _streamDescription.mFormatFlags = (kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsPacked); 我的原型和callback的实现如下。 没有什么特别的,几乎和我目前看到的每个例子都一样: // Prototype, declared above the class's @implementation void […]

iOS:使用蓝牙audio输出(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput)AudioSession

CoreAudio AudioSession框架涉及到几个蓝牙任务,我有几个问题,我希望有人能帮助我解决这些问题,或者至less可以证实我的最新发现。 该用例是一个导航应用程序,想要连接一个支持HFP和A2DP的蓝牙function的无线电。 我已经阅读了整个AudioSession编程指南,但我仍然有一些开放的问题,特别是通过蓝牙audio输出。 蓝牙HFPaudio输出(kAudioSessionOutputRoute_BluetoothHFP)只能在AudioSession的情况下设置kAudioSessionCategory_PlayAndRecord已设置,并且您正在覆盖以下属性:kAudioSessionProperty_OverrideCategoryEnableBluetoothInput。 这是真的? 如果没有,我怎样才能将MediaPlayback会话路由为kAudioSessionOutputRoute_BluetoothHFP路由。 背景模式下的audio输出对于类别kAudioSessionCategory_PlayAndRecord而言是不可能的。 因此,如果我在后台,我无法通过蓝牙HFP路由播放声音。 这是真的? 如果应用程序在后台,有没有办法通过蓝牙HFP协议发送audio? 如果有支持A2DP的设备,我的audio路由将始终自动切换到kAudioSessionOutputRoute_BluetoothA2DP路由。 我怎样才能防止这种路线变化? 另外我怎么能指定我现在想要的输出路线。 使用iOS5,可以通过kAudioSessionProperty_AudioRouteDescription标志查询所有这些路由目的地,但我不知道如何设置它,因为我想拥有它。 是否有可能做到这一点? 我希望你们中的一些人能够帮助我解决这些问题。 这对我对CoreAudio的整体了解,特别是AudioSession框架,确实有帮助。