解决的问题利用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地址: