相关疑难解决方法(0)

从IO单元将音频写入磁盘

重写这个问题会更有吸引力.

我的问题是我无法从远程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)

iphone core-audio audiounit ios

10
推荐指数
1
解决办法
5436
查看次数

从RemoteIO录制到AAC:数据正在写入但文件无法播放

我一直试图在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)

core-audio ios ios5

7
推荐指数
1
解决办法
5647
查看次数

如何将AUGraph的输出写入文件?

我正在尝试编写(应该是)一个简单的应用程序,它在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输出记录到文件的更好方法?

谢谢您的帮助.

core-audio ios

5
推荐指数
1
解决办法
5233
查看次数

标签 统计

core-audio ×3

ios ×3

audiounit ×1

ios5 ×1

iphone ×1