Geo*_*bin 1 cocoa-touch objective-c
所以基本上我只想监视iPhone中麦克风(s?)拾取的当前dB级别,主要是客观的c代码.我在谷歌上环顾四周,看起来你需要用AudioQueues进行一些"硬核"编程才能让它运转起来.我不擅长C编码所以下面的代码是我尝试使用最低限度的C编码来获得一个结果,我可以将其发送回我热情和熟悉的Objective-c土地.问题是,我似乎无法创建AudioQueue,我得到的'状态'是-50,这是'未知错误'.
我本质上是在我的viewDidLoad中设置音频队列并在其上面声明交流回调,并且在回调中我抓住当前的dB值并将其发送回目标c,但回调永远不会被调用,因为AudioQueue不是正确创造,我不明白为什么.任何人都能看到我做错的事情,或者指出我对这个音频内容的客观c包装的方向.干杯.
@interface ViewController ()
{
AudioQueueRef mQueue;
}
- (void)receivedSoundOfPower:(Float32)power;
@end
@implementation ViewController
void MyInputBufferHandler( void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp * inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription* inPacketDesc)
{
ViewController *self = (__bridge id)inUserData;
AudioQueueLevelMeterState meters[1];
UInt32 dlen = sizeof(meters);
OSStatus status = AudioQueueGetProperty(inAQ,kAudioQueueProperty_CurrentLevelMeterDB,meters,&dlen);
if (status == 0)
{
Float32 peakPower = meters[0].mPeakPower;
[self receivedSoundOfPower:peakPower];
}
}
- (void)receivedSoundOfPower:(Float32)power
{
NSLog(@"%f", power);
}
- (void)viewDidLoad
{
[super viewDidLoad];
OSStatus status =AudioQueueNewInput(kAudioStreamAnyRate,
MyInputBufferHandler,
(__bridge void *)(self),
NULL,
NULL,
0,
&(mQueue));
NSLog(@"%ld", status);
// Turn on level metering (iOS 2.0 and later)
UInt32 on = 1;
AudioQueueSetProperty(mQueue,kAudioQueueProperty_EnableLevelMetering,&on,sizeof(on));
// Do any additional setup after loading the view, typically from a nib.
}
Run Code Online (Sandbox Code Playgroud)
您不需要仅使用音频队列来获取数据库值.你可以做更多的事情:
- (void)setup {
// record audio to /dev/null
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
// some settings
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 2], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
// create a AVAudioRecorder
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
[recorder prepareToRecord];
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
}
}
- (void)levelTimerCallback:(NSTimer *)timer {
[recorder updateMeters];
// here is the DB!
float peakDecebels = [recorder peakPowerForChannel:1];
float avaeragePower = [recorder averagePowerForChannel:1];
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您想要访问音频数据,这个库是一流的:http://alexbw.github.com/novocaine/
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |