iOS AudioUnit音频录制 -(4)

解决的问题利用AudioUnit实现音频的录制和播放

一、指定文件路径

1、NSFileManager的使用

1、文件的创建

判断文件路径是否存在

BOOL isExist = [fileManger fileExistsAtPath:path];

- (BOOL)createFileAtPath:(NSString *)path //要创建的目录
contents:(nullable NSData *)data //文件内容
attributes:(nullable NSDictionary *)attr//文件属性,nil表示采用默认属性;

2、复制文件/移动文件/删除文件/获取文件属性

[fileManger copyItemAtPath:fromFilePath toPath:toDirPath error:&error];
[fileManger moveItemAtPath:frompath toPath:toPath error:nil];
[fileManger removeItemAtPath:toPath error:nil];
[fileManger attributesOfItemAtPath:path error:nil];

3、文件句柄类

对文件进行读写操作需要使用NSFileHandle

只读的句柄 [NSFileHandle fileHandleForReadingAtPath:path]

只写的句柄 [NSFileHandle fileHandleForWritingAtPath:path]

读写句柄 NSFileHandle fileHandleForUpdatingAtPath:path];

读取指定长度的数据
[readOnlyHandle readDataOfLength:5]

设置文件偏移量
[readOnlyHandle seekToFileOffset:偏移的字节数];

二、配置音频环境

  • 1、AVAudioseession
  • 2、音频单元描述 AudioComponentDescription
  • 3、音频格式描述 AudioStreamBasicDescription
  • 4、设置应用属性
AudioUnitSetProperty(               AudioUnit               inUnit,
                                    AudioUnitPropertyID     inID,
                                    AudioUnitScope          inScope,
                                    AudioUnitElement        inElement,
                                    const void * __nullable inData,
                                    UInt32                  inDataSize) 
OSStatus status = AudioUnitSetProperty(audioUnit,
                                           kAudioUnitProperty_StreamFormat,
                                           kAudioUnitScope_Output,
                                           kInputBus,
                                           &inputStreamDesc,
                                           sizeof(inputStreamDesc));

    
    //麦克风输入设置为1(yes)
    int inputEnable = 1;
    status = AudioUnitSetProperty(audioUnit,
                                  kAudioOutputUnitProperty_EnableIO,//输入的音频类型I/O
                                  kAudioUnitScope_Input,
                                  kInputBus,
                                  &inputEnable,
                                  sizeof(inputEnable));
    CheckError(status, "setProperty EnableIO error");
    
    //设置回调
    AURenderCallbackStruct inputCallBackStruce;
    inputCallBackStruce.inputProc = inputCallBackFun;
    inputCallBackStruce.inputProcRefCon = (__bridge void * _Nullable)(self);
    
    status = AudioUnitSetProperty(audioUnit,
                                  kAudioOutputUnitProperty_SetInputCallback,
                                  kAudioUnitScope_Output,
                                  kInputBus,
                                  &inputCallBackStruce,
                                  sizeof(inputCallBackStruce));
  • 5、设置录音回调函数
AudioUnitRender(AudioUnit       inUnit,//初始化的AudioUnit
                AudioUnitRenderActionFlags * __nullable// ioActionFlags,
                const AudioTimeStamp *          inTimeStamp,
                UInt32                          inOutputBusNumber,
                UInt32                          inNumberFrames,
                    AudioBufferList *               ioData //录音的数据
                    
                    
)   

对AudioBufferlist初始化操作

    ViewController *recorder = (__bridge ViewController *)(inRefCon);//当前界面
    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0].mData = NULL;
    bufferList.mBuffers[0].mDataByteSize = 0;

三、处理录音数据

获取缓存下的AudioBuffer,并将数据写入文件,对AudioBufferlist结构的参数详解 :(音频格式描述以及音频单元描述以及应用的配置)

iOS音频之AudioUnit简单播放音频 -(2)

 AudioBuffer buffer = bufferList.mBuffers[0];
 int len = buffer.mDataByteSize;
 [recorder->dataWriter writeBytes:buffer.mData len:len toPath:stroePath];

四、播放录音文件

讲解一个参数 memcpy:从资源内存复制到目标内存的语法。

Git地址:

你可能感兴趣的:(iOS AudioUnit音频录制 -(4))