Tag: audiounit

在RemoteIOaudio单元回放callback中的AudioBufferList内容

我想在截取iOS设备的扬声器的过程中“截取”audio数据。 我相信这可以使用remoteIOaudio单元和callback来完成。 在下面的playbackCallback中,ioData实际上是否包含任何audio数据? static OSStatus playbackCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { … } 我很困惑,因为有关ioData的日志信息似乎意味着它包含audio数据… // if (ioData->mNumberBuffers > 0) AudioBuffer buffer = ioData->mBuffers[0]; NSLog(@"buffer.mNumberChannels: %ld", buffer.mNumberChannels); // prints 2 NSLog(@"buffer.mDataByteSize : %ld", buffer.mDataByteSize); // prints 4096 但是,从ioData的内容创build一个CMSampleBufferRef并使用AVAssetWriter将其写入CoreAudioFile会生成一个静默文件。 输出文件的长度似乎很好(几秒钟),但在Audacity中打开文件显示了一个扁平线。 在阅读大量的SOpost并试验了很多remoteIOaudio单元示例代码之后,我开始怀疑上面的ioData是否包含应该在playbackCallback中填充的预大小但空的缓冲区。

使用单声道input和立体声输出设置audio单元iOS

我正在尝试设置一个具有单声道input和立体声输出的audio单元。 打算通过左声道输出播放正弦波音,并通过右声道周期性地输出不同的符号波。 我收到错误, 'NSInternalInconsistencyException', reason: ' Error initialing unit: -50; 当我尝试在这里初始化我的audio单元时, // Initialize audio unit OSErr err = AudioUnitInitialize(self.ioUnit); NSAssert1(err == noErr, @"Error initializing unit: %hd", err); 我相信这与我如何设置audio设备有关, // Audio component description AudioComponentDescription desc; desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_RemoteIO; desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; // Get component AudioComponent inputComponent = […]

在AudioUnit中内置哪些可以重新采样audio?

我有一个应用程序需要快速改变audio采样率。 通过对样本进行简单的线性插值导致的音高偏移是完全正确的。 是否有一个audio单元实时重新采样软件(即:不需要改变硬件采样率)。

从iOS上的“audio单元渲染过程”触发UI代码

我有一个多通道混音器audio单元在iOS应用程序中播放audio文件,我需要弄清楚如何更新应用程序的用户界面,并执行重置,当callback命中最长的audio文件的结尾(设置为在公共汽车0上运行)。 由于我的代码如下所示,我正在尝试使用KVO来实现此目的(使用布尔variablestapesUnderway – tapesUnderway是必要的,因为此Objective-C代码在其正常域之外运行,请参阅http://www.cocoabuilder.com/ archive / cocoa / 57412-nscfnumber-no-pool-in-place-just-leaking.html )。 static OSStatus tapesRenderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { SoundBufferPtr sndbuf = (SoundBufferPtr)inRefCon; UInt32 bufferFrames = sndbuf[inBusNumber].numFrames; AudioUnitSampleType *in = sndbuf[inBusNumber].data; // These mBuffers are the output buffers and are empty; these two lines are just setting the […]

如何正确填充立体声AudioBuffer

所以我使用苹果公司的MixerHost示例代码为立体声合成做一个基本的听觉设置。 我有一些麻烦,搞清楚如何填补缓冲区。 具体来说,我只在左声道中获取audio,右声道是沉默的: AudioUnitSampleType *buffer = (AudioUnitSampleType *)ioData->mBuffers[0].mData; SInt16 sampleValue; for(UInt32 i = 0; i < inNumberFrames; i++) { sampleValue = sinf(inc) * 32767.0f; // generate sine signal inc += .08; buffer[i] = sampleValue; } if(inc > 2e10) inc -= 2e10; 这在左声道上播放正弦波…音调types每10秒左右改变一次,另一个指标是我做错了:] 我已经尝试了其他的方法来通过数组。 这产生了离正弦信号很远的有趣声音。 有一次,我在两个频道上都输出了糟糕/不连贯的结果,这有点像成功。 如果我检查AudioBuffer结构,它确认有2个通道,每帧的字节数是4.所以每帧有两个SInt16,对吧? 一个用于左侧,另一个用于右侧通道..他们应该交错? 请注意,我使用的是与Apple示例不同的stream格式,因为我不知道定点math。 stream格式设置如下: size_t bytesPerSample = sizeof (AudioUnitSampleType); stereoStreamFormat.mFormatID […]

CMSampleBufferSetDataBufferFromAudioBufferList返回错误12731

我试图捕捉应用程序的声音,并将其传递给AVAssetWriter作为input。 我设置audio单元的callback来获得AudioBufferList。 问题开始于将AudioBufferList转换为CMSampleBufferRef。 它始终返回错误-12731,表示所需参数丢失 谢谢 卡罗尔 -(OSStatus) recordingCallbackWithRef:(void*)inRefCon flags:(AudioUnitRenderActionFlags*)flags timeStamp:(const AudioTimeStamp*)timeStamp busNumber:(UInt32)busNumber framesNumber:(UInt32)numberOfFrames data:(AudioBufferList*)data { AudioBufferList bufferList; bufferList.mNumberBuffers = 1; bufferList.mBuffers[0].mData = NULL; OSStatus status; status = AudioUnitRender(audioUnit, flags, timeStamp, busNumber, numberOfFrames, &bufferList); [self checkOSStatus:status]; AudioStreamBasicDescription audioFormat; // Describe format audioFormat.mSampleRate = 44100.00; audioFormat.mFormatID = kAudioFormatLinearPCM; audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; audioFormat.mFramesPerPacket = 1; audioFormat.mChannelsPerFrame […]

适用于iOS应用程序的多轨道MP3播放

我正在做一个应用程序,涉及以多轨道格式(鼓,人声,吉他,钢琴等)播放歌曲。 我不需要为每个音轨做任何奇妙的audio处理,我需要做的就是播放,暂停,以及将每个音轨静音/取消静音。 我一直在使用AVAudioPlayer的多个实例,但是在进行设备testing时,我注意到当他们第一次播放时,曲目的播放非常不同步。 此外,当我暂停和播放曲目时,它们将继续失去同步。 经过一些研究后,我意识到AVAudioplayer只是有太多的延迟,不适合我的应用。 在我的应用程序中,我基本上有一个AVArudioPlayers的NSArray,我将循环播放每一个或暂停/停止每一个,我相信这是什么造成它在设备上不同步。 似乎苹果的audio混音器对我来说效果不错,但是当我尝试实现它时,我得到了一个EXC_BAD_ACCESS错误,我找不出来。 我知道答案是使用OpenAL或audio单元,但是当我所需要做的就是同时播放5个.mp3曲目时,似乎没有必要花费数周的时间来学习这些内容。 有没有人有任何build议如何做到这一点? 谢谢

AURenderCallback在Swift中

我正在创build一个使用audio单元的应用程序,尽pipe在Objective-C(包括苹果自己的aurioTouch和其他)中有很多代码示例,但我试图在Swift中编写整个代码。 我已经能够build立我的AUGraph并通过它运行一些audio,但我似乎无法弄清楚回显的callback语法。 我已经尝试了几种方法: 方法1:直接创build一个AURenderCallback let render : AURenderCallback = { ( inRefCon: UnsafeMutablePointer<Void>, ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, inTimeStamp: UnsafePointer<AudioTimeStamp>, inBufNumber: UInt32, inNumberFrames: UInt32, ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus in return noErr } 在这个callback中,除了返回noErr之外,我什么都没有做,因为我只是想让它工作。 但是,编译器返回以下错误: (UnsafeMutablePointer,UnsafeMutablePointer,UnsafePointer,UInt32,UInt32,UnsafeMutablePointer) – > OSStatus'不能转换为'AURenderCallback AURenderCallback在文档中的定义是这样的: typealias AURenderCallback = (UnsafeMutablePointer<Void>,UnsafeMutablePointer<AudioUnitRenderActionFlags>,UnsafePointer<AudioTimeStamp>, UInt32, UInt32,UnsafeMutablePointer<AudioBufferList>) -> OSStatus 这似乎与我所input的一样,虽然可能是我不明白文档要求什么。 方法2:创build一个代表AURenderCallback的函数 func render( inRefCon: UnsafeMutablePointer<Void>, ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, inTimeStamp: UnsafePointer<AudioTimeStamp>, inBufNumber: […]

从Socket连接在iOS上播放audio

希望你能帮助我解决这个问题,我看到很多与此有关的问题,但是没有一个真正帮助我弄清楚我在这里做错了什么。 所以在Android上,我有一个AudioRecord,它正在loggingaudio并通过套接字连接将audio作为字节数组发送到客户端。 这部分在Android上非常简单,并且工作得很好。 当我开始使用iOS时,发现没有简单的方法可以解决这个问题,所以在经过两天的研究和封堵之后,玩这个就是我所得到的。 哪个仍然不能播放任何audio。 它启动时会产生噪音,但没有任何audio通过插口传输。 我确认套接字通过logging缓冲区数组中的每个元素来接收数据。 这里是我使用的所有代码,很多是从一堆网站重用,不能记住所有的链接。 (BTW使用AudioUnits) 首先,audio处理器:播放回叫 static OSStatus playbackCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { /** This is the reference to the object who owns the callback. */ AudioProcessor *audioProcessor = (__bridge AudioProcessor*) inRefCon; // iterate over incoming stream an copy to output stream […]

iOSaudio单元在某些频率之上切断声音

我收到声音(UDP WiFi)有一些问题,我想尽可能多地清除它。 所以在开始的时候,我想把一些频率以上的声音切断。 很明显,我从套接字获得原始数据,然后将其复制到输出缓冲区。 我敢肯定,确切的切断应该在那里完成。 你能build议我吗? 我目前的callback代码 static OSStatus outputCallback(void *udata, AudioUnitRenderActionFlags *flags, const AudioTimeStamp *ts, UInt32 busnum, UInt32 nframes, AudioBufferList *buflist) { NXAudioDevice *dev = (__bridge NXAudioDevice *) udata; AudioBuffer *buf = buflist->mBuffers; // Here I get new audioBufferData NSData *data = [dev getAudioData]; if (!data) { buf->mDataByteSize = 0; return -1; } else […]