重写这个问题会更有吸引力.
我的问题是我无法从远程IO单元成功地将音频文件写入磁盘.
我采取的步骤是
打开一个mp3文件并将其音频提取到缓冲区.我根据图表的属性设置了一个asbd用于我的图形.我设置并运行我的图形循环提取的音频和声音成功地从扬声器出来!
我遇到的困难是从远程IO回调中获取音频样本并将其写入磁盘上的音频文件,我正在使用ExtAudioFileWriteASync.
音频文件确实被写入并且与原始mp3有一些可听见的相似之处,但听起来非常扭曲.
我不确定问题是否存在
A)ExtAudioFileWriteAsync无法像io单元回调提供的那样快速写入样本.
B)我已经为extaudiofile refeference设置了ASBD错误.我想先保存一个wav文件.我不确定我是否在下面的ASBD中正确描述了这一点.
其次,我不确定在创建音频文件时为inChannelLayout属性传递什么值.
最后我非常不确定要用于kExtAudioFileProperty_ClientDataFormat的asbd.我一直在使用我的立体声流格式,但仔细看看文档说这必须是pcm.它应该与remoteio的输出格式相同吗?如果是这样,我错误地将远程io的输出格式设置为stereostreamformat?
我意识到这个问题有很多,但我有很多不确定因素,我似乎无法自行解决.
设置立体声流格式
- (void) setupStereoStreamFormat
{
size_t bytesPerSample = sizeof (AudioUnitSampleType);
stereoStreamFormat.mFormatID = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket = bytesPerSample;
stereoStreamFormat.mFramesPerPacket = 1;
stereoStreamFormat.mBytesPerFrame = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame = 2; // 2 indicates stereo
stereoStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate = engineDescribtion.samplerate;
NSLog (@"The stereo stereo format :");
}
Run Code Online (Sandbox Code Playgroud)
使用立体声流格式设置remoteio回调
AudioUnitSetProperty(engineDescribtion.masterChannelMixerUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
masterChannelMixerUnitloop,
&stereoStreamFormat,
sizeof(stereoStreamFormat));
AudioUnitSetProperty(engineDescribtion.masterChannelMixerUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
masterChannelMixerUnitloop,
&stereoStreamFormat,
sizeof(stereoStreamFormat));
static OSStatus masterChannelMixerUnitCallback(void *inRefCon,
AudioUnitRenderActionFlags …Run Code Online (Sandbox Code Playgroud) 我一直试图在iOS 5上一个renderCallback记录从RemoteIO单元直接AAC在iPad 2,我已经看到了矛盾的信息说这是不可能的-这是可能的(在评论点击这里).我想要这样做的原因是因为录制到PCM需要如此多的磁盘空间来记录任何长度 - 即使它稍后被转换为AAC.
我准备放弃了.我已经通过谷歌刮,所以,核心音频书和苹果的核心音频邮件列表和论坛,并已经到了,我没有得到任何错误的点-和我记录的东西到磁盘,但生成的文件无法播放.模拟器和设备都是这种情况.
所以...如果有人有这方面的经验,我真的很感激在正确的方向上轻推.设置是RemoteIO正在播放AUSamplers的输出并且工作正常.
以下是我在下面的代码中所做的事情
指定AudioStreamBasicDescriptionremoteIO设备的格式kAudioFormatLinearPCM
ExtAudioFileRef
通过从RemoteIO单元获取指定客户端格式,创建并指定目标格式
为RemoteID单元指定renderCallback
在renderCallback中,在kAudioUnitRenderAction_PostRender阶段中写入数据
正如我所说,我没有收到任何错误,并且生成的音频文件大小显示正在写入某些内容,但该文件无法播放.也许我的格式搞砸了?
无论如何,这是我在一个瓶子里的信息和/或"Be Here Dragons"的旗帜,任何人都在冒着Core-Audio的黑暗水域.
//尝试播放文件时得到的不愉快的消息:

//部分remoteIO设置
// Enable IO for recording
UInt32 flag = 1;
result = AudioUnitSetProperty(ioUnit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input,
kInputBus, // == 1
&flag,
sizeof(flag));
if (noErr != result) {[self printErrorMessage: @"Enable IO for recording" withStatus: result]; return;}
// Describe format - - - - - - - - - -
size_t bytesPerSample = sizeof (AudioUnitSampleType);
AudioStreamBasicDescription …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写(应该是)一个简单的应用程序,它在AUGraph中按顺序包含一堆音频单元,然后将输出写入文件.我使用AUGraphAddRenderNotify添加了回调.这是我的回调函数:
OSStatus MyAURenderCallback(void *inRefCon,
AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
if (*actionFlags & kAudioUnitRenderAction_PostRender) {
ExtAudioFileRef outputFile = (ExtAudioFileRef)inRefCon;
ExtAudioFileWriteAsync(outputFile, inNumberFrames, ioData);
}
}
Run Code Online (Sandbox Code Playgroud)
这种作品.该文件是可播放的,我可以听到我录制的内容,但是有大量静电使其几乎听不见.
有人知道这有什么问题吗?或者有没有人知道将AUGraph输出记录到文件的更好方法?
谢谢您的帮助.