问题描述
|
我知道有多个线程存在相同的问题,但是我无法使其解决方案正常工作。我最终创建了这个课:
微控制器
#import Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
#import <UIKit/UIKit.h>
@interface microcontroller : UIView < UITextFieldDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate,AVAudioSessionDelegate > {
AVAudioRecorder *recorder;
NSTimer *levelTimer;
double lowPassResults;
}
- (void)levelTimerCallback:(NSTimer *)timer;
@end
微控制器
#import \"microcontroller.h\"
@implementation microcontroller
- (id)init
{
NSURL *url = [NSURL fileURLWithPath:@\"/dev/null\"];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0],AVSampleRateKey,[NSNumber numberWithInt: kAudioFormatAppleLossless],AVFormatIDKey,[NSNumber numberWithInt: 1],AVNumberOfChannelsKey,[NSNumber numberWithInt: AVAudioQualityMax],AVEncoderAudioQualityKey,nil];
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
[recorder preparetoRecord];
recorder.meteringEnabled = YES;
if ([recorder preparetoRecord] == YES){
[recorder record];
}else {
int errorCode = CFSwapInt32HostToBig ([error code]);
NSLog(@\"Error: %@ [%4.4s])\",[error localizedDescription],(char*)&errorCode);
}
levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
} else
NSLog([error description]);
// input \'level\' is in meter.mAveragePower
return self;
}
- (void)levelTimerCallback:(NSTimer *)timer {
[recorder updateMeters];
const double ALPHA = 1.0; // 0.05f
double peakPowerForChannel = pow(10,(0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
if (lowPassResults > 0.55)
NSLog(@\"Mic blow detected\");
[recorder updateMeters];
NSLog(@\"Average input: %f Peak input: %f\",[recorder averagePowerForChannel:0],[recorder peakPowerForChannel:0]);
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@\"initiated\");
NSURL *url = [NSURL fileURLWithPath:@\"/dev/null\"];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0],nil];
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
[recorder preparetoRecord];
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
} else
NSLog([error description]);
}
- (void)dealloc {
[levelTimer release];
[recorder release];
[super dealloc];
}
@end
但是我无法使麦克风正常工作。我仅收到此输出,并且麦克风从不响应:
平均输入:-120.000000峰值输入:-120.000000
有什么错误的想法吗?
谢谢你的帮助 !
解决方法
好吧,我认为提到我正在团结一致并不重要,这是罪魁祸首。
Unity会修改一些设置,因此在加载ViewController时一定要这样做:
[[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayAndRecord
error: &setCategoryError];
if (setCategoryError) {
NSLog([setCategoryError description]);
}
否则,完美编写的录音机将无法正常工作。就是这样..问题解决了!
此错误是一个难以检测的错误,希望此消息对处于同样困境的任何其他人有所帮助。
, 好的,这是解决方法:
文件\“ MicController.m \”
#import \"MicController.h\"
static MicController *sharedListener = nil;
@implementation MicController
+ (MicController *)sharedListener {
@synchronized(self) {
if (sharedListener == nil)
[[self alloc] init];
}
return sharedListener;
}
- (void)dealloc {
//[sharedListener stop];
//[levelTimer release];
[recorder release];
[super dealloc];
}
#pragma mark -
#pragma mark Listening
- (void)listen {
[[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayAndRecord
error: nil];
NSURL *url = [NSURL fileURLWithPath:@\"/dev/null\"];
//kAudioFormatAppleIMA4
//kAudioFormatMPEG4AAC
/*
NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0],AVSampleRateKey,[NSNumber numberWithInt: kAudioFormatAppleLossless],AVFormatIDKey,[NSNumber numberWithInt: 1],AVNumberOfChannelsKey,[NSNumber numberWithInt: AVAudioQualityMax],AVEncoderAudioQualityKey,nil];
*/
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0],[NSNumber numberWithInt: 2],nil];
/*
[NSNumber numberWithFloat: 44100.0],[NSNumber numberWithInt: kAudioFormatMPEG4AAC],[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,AVLinearPCMIsFloatKey,nil];
*/
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
[recorder prepareToRecord];
recorder.meteringEnabled = YES;
[recorder record];
//levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
} else
NSLog([error description]);
}
- (void)stop {
[recorder release];
}
/*
- (void)levelTimerCallback:(NSTimer *)timer {
[recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10,(0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
//if (lowPassResults < 0.95)
//NSLog(@\"Mic blow detected\");
NSLog(@\"Average input: %f Peak input: %f Low pass results: %f\",[recorder averagePowerForChannel:0],[recorder peakPowerForChannel:0],lowPassResults);
}
*/
#pragma mark -
#pragma mark Levels getters
- (Float32)averagePower {
[recorder updateMeters];
const double ALPHA = 0.7;
double peakPowerForChannel = pow(10,(0.05 * [recorder averagePowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
return [recorder averagePowerForChannel:0];
//return lowPassResults;
//NSLog(@\"Average input: %f Peak input: %f Low pass results: %f\",lowPassResults);
}
- (Float32)peakPower {
[recorder updateMeters];
const double ALPHA = 0.7;
double peakPowerForChannel = pow(10,(0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
return [recorder peakPowerForChannel:0];
//return lowPassResults;
//NSLog(@\"Average input: %f Peak input: %f Low pass results: %f\",lowPassResults);
}
#pragma mark -
#pragma mark Singleton Pattern
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (sharedListener == nil) {
sharedListener = [super allocWithZone:zone];
return sharedListener;
}
}
return nil;
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)init {
if ([super init] == nil)
return nil;
return self;
}
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX;
}
- (void)release {
// Do nothing.
}
- (id)autorelease {
return self;
}
@end
只需添加代码
[[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayAndRecord
error: nil];
在上方作废\“-(无效)听{\”
谢谢。
再见
, 在使用Titanium加速器的情况下,我也遇到同样的问题。在模拟器中,该类正常运行,但在设备中,平均输入= -120
这是代码:
//
// MicController.h
// Mic
//
// Created by DekWilde on 10/26/11.
// Copyright 2011 DekWilde. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
@interface MicController : NSObject {
AVAudioRecorder *recorder;
//NSTimer *levelTimer;
double lowPassResults;
}
+ (MicController *)sharedListener;
- (void)listen;
- (void)stop;
//- (void)levelTimerCallback:(NSTimer *)timer;
- (Float32)averagePower;
- (Float32)peakPower;
@end
和MicController.m
#import \"MicController.h\"
static MicController *sharedListener = nil;
@implementation MicController
+ (MicController *)sharedListener {
@synchronized(self) {
if (sharedListener == nil)
[[self alloc] init];
}
return sharedListener;
}
- (void)dealloc {
//[sharedListener stop];
//[levelTimer release];
[recorder release];
[super dealloc];
}
#pragma mark -
#pragma mark Listening
- (void)listen {
NSURL *url = [NSURL fileURLWithPath:@\"/dev/null\"];
//kAudioFormatAppleIMA4
//kAudioFormatMPEG4AAC
/*
NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0],nil];
*/
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0],nil];
/*
[NSNumber numberWithFloat: 44100.0],nil];
*/
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
[recorder prepareToRecord];
recorder.meteringEnabled = YES;
[recorder record];
//levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
} else
NSLog([error description]);
}
- (void)stop {
[recorder release];
}
/*
- (void)levelTimerCallback:(NSTimer *)timer {
[recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10,(0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
//if (lowPassResults < 0.95)
//NSLog(@\"Mic blow detected\");
NSLog(@\"Average input: %f Peak input: %f Low pass results: %f\",lowPassResults);
}
*/
#pragma mark -
#pragma mark Levels getters
- (Float32)averagePower {
[recorder updateMeters];
const double ALPHA = 0.7;
double peakPowerForChannel = pow(10,(0.05 * [recorder averagePowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
return [recorder averagePowerForChannel:0];
//return lowPassResults;
//NSLog(@\"Average input: %f Peak input: %f Low pass results: %f\",lowPassResults);
}
- (Float32)peakPower {
[recorder updateMeters];
const double ALPHA = 0.7;
double peakPowerForChannel = pow(10,(0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
return [recorder peakPowerForChannel:0];
//return lowPassResults;
//NSLog(@\"Average input: %f Peak input: %f Low pass results: %f\",lowPassResults);
}
#pragma mark -
#pragma mark Singleton Pattern
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (sharedListener == nil) {
sharedListener = [super allocWithZone:zone];
return sharedListener;
}
}
return nil;
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)init {
if ([super init] == nil)
return nil;
return self;
}
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX;
}
//- (void)release {
// Do nothing.
//}
- (id)autorelease {
return self;
}
@end
我的问题是:我需要将您发布的有关此问题的解决方案的代码放在哪里。 。 。我该如何解决这个问题?
, 现在,Unity 3.5已添加了对麦克风输入的支持,我建议您在Unity中进行操作,这样您就不必维护Cocoa代码,并且将来可以轻松将其移植到Android / Web / Native。
已经有一些关于此的有用的文章:
http://forum.unity3d.com/threads/123036-iOS-Microphone-input
http://forum.unity3d.com/threads/118215-Blow-detection-(使用iOS-麦克风)