ios AudioUnit bluetooth 录音 播放 实现
来源:互联网 发布:gbic端口 编辑:程序博客网 时间:2024/05/29 08:03
ios AudioUnit bluetooth 录音 播放 实现
因为拍摄短视频的时候有时候手机离主人比较远的时候,这样录音效果就不好了, 为了方便记录声音,则最好的方式就是使用蓝牙耳机,但是ios关于蓝牙耳机的使用特别少,以下是我总结的内容。
#import "XYRecorder.h"#import <AVFoundation/AVFoundation.h>#define INPUT_BUS 1#define OUTPUT_BUS 0AudioUnit audioUnit;AudioBufferList *buffList;@implementation XYRecorder#pragma mark - init- (instancetype)init { self = [super init]; if (self) { AudioUnitInitialize(audioUnit); [self initRemoteIO]; } return self;}- (void)initRemoteIO { [self initAudioSession]; [self initBuffer]; [self initAudioComponent]; [self initFormat]; [self initAudioProperty]; [self initRecordeCallback]; [self initPlayCallback];}- (void)initAudioSession { NSError *error; AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]; [audioSession setPreferredSampleRate:44100 error:&error]; [audioSession setPreferredInputNumberOfChannels:1 error:&error]; [audioSession setPreferredIOBufferDuration:0.023 error:&error];}- (void)initBuffer { UInt32 flag = 0; AudioUnitSetProperty(audioUnit, kAudioUnitProperty_ShouldAllocateBuffer, kAudioUnitScope_Output, INPUT_BUS, &flag, sizeof(flag)); buffList = (AudioBufferList*)malloc(sizeof(AudioBufferList)); buffList->mNumberBuffers = 1; buffList->mBuffers[0].mNumberChannels = 1; buffList->mBuffers[0].mDataByteSize = 1024 * sizeof(short); buffList->mBuffers[0].mData = (short *)malloc(sizeof(short) * 1024);}- (void)initAudioComponent { AudioComponentDescription audioDesc; audioDesc.componentType = kAudioUnitType_Output; audioDesc.componentSubType = kAudioUnitSubType_RemoteIO; audioDesc.componentManufacturer = kAudioUnitManufacturer_Apple; audioDesc.componentFlags = 0; audioDesc.componentFlagsMask = 0; AudioComponent inputComponent = AudioComponentFindNext(NULL, &audioDesc); AudioComponentInstanceNew(inputComponent, &audioUnit);}- (void)initFormat { AudioStreamBasicDescription audioFormat; audioFormat.mSampleRate = 44100; audioFormat.mFormatID = kAudioFormatLinearPCM; audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; audioFormat.mFramesPerPacket = 1; audioFormat.mChannelsPerFrame = 1; audioFormat.mBitsPerChannel = 16; audioFormat.mBytesPerPacket = 2; audioFormat.mBytesPerFrame = 2; AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, OUTPUT_BUS, &audioFormat, sizeof(audioFormat)); AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, INPUT_BUS, &audioFormat, sizeof(audioFormat));}- (void)initRecordeCallback { AURenderCallbackStruct recordCallback; recordCallback.inputProc = RecordCallback; recordCallback.inputProcRefCon = (__bridge void *)self; AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, INPUT_BUS, &recordCallback, sizeof(recordCallback));}- (void)initPlayCallback { AURenderCallbackStruct playCallback; playCallback.inputProc = PlayCallback; playCallback.inputProcRefCon = (__bridge void *)self; AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, OUTPUT_BUS, &playCallback, sizeof(playCallback));}- (void)initAudioProperty { UInt32 flag = 1; AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, INPUT_BUS, &flag, sizeof(flag)); AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, OUTPUT_BUS, &flag, sizeof(flag));}#pragma mark - callback functionstatic OSStatus RecordCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData){ AudioUnitRender(audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, buffList); short *data = (short *)buffList->mBuffers[0].mData; NSLog(@"%d %d %d ", buffList->mBuffers[0].mDataByteSize, inBusNumber, inNumberFrames); return noErr;}static OSStatus PlayCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) {// memcpy(ioData->mBuffers[0].mData, buffList->mBuffers[0].mData, buffList->mBuffers[0].mDataByteSize); AudioUnitRender(audioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData); return noErr;}#pragma mark - public methods- (void)startRecorder { AudioOutputUnitStart(audioUnit);}- (void)stopRecorder { AudioOutputUnitStop(audioUnit);}@end
阅读全文
0 0
- ios AudioUnit bluetooth 录音 播放 实现
- ios AudioUnit 播放 pcm 数据
- ios AudioUnit 录制播放 pcm
- iOS中录音和播放实现
- iOS实现录音与播放功能
- ios 录音播放问题
- iOS录音和播放
- iOS录音和播放
- ios录音与播放
- IOS 录音与播放
- ios 录音,播放 tips
- iOS录音播放
- ios之录音+播放
- IOS多媒体之视频播放与录音的简易实现
- 【iOS录音与播放】实现利用音频队…
- [Android] 录音与播放录音实现
- Android--实现自制录音/播放录音程序
- [Android] 录音与播放录音实现
- MOOC清华《程序设计基础》第5章:八皇后问题-代码一
- ios-设置UISearchBar输入框的颜色等属性
- Android中关于签名的一些知识
- 支持向量机
- JSP_strut2架构下前台接收后台传递到前台之数据并处理以使用的一种方法
- ios AudioUnit bluetooth 录音 播放 实现
- 二维指针*(void **)的研究(uC/OS-II案例)
- 【JZOJ5219】【GDOI2018模拟7.10】B
- bzoj3687 简单题 bitset
- json 学习日记
- PHP explode 和 implode 用法
- Physically Based Rendering
- win10系统打字卡顿
- 文章标题