【问题标题】:iphone-peakPowerForChannel function in AVAudioRecorder doesn't workAVAudioRecorder 中的 iphone-peakPowerForChannel 功能不起作用
【发布时间】:2009-07-28 02:14:55
【问题描述】:

我正在尝试使用 AVAudioRecorder 实例录制声音,整个录制进度运行良好,除了当我调用 [recorder peakPowerForChannel:0] 尝试获取音量时,返回值始终为 0,这很奇怪。 .

我检查了录制的音频文件,完全没问题。然后我使用 AVAudioPlayer 播放它,在播放过程中,我调用 [player peakPowerForChannel:0],返回值似乎正确且有意义。

我怎样才能获得正确的价值?我已经设置了:recoder.meteringEnabled = YES,并且每次调用 [recorder peakPowerForChannel:0] 时都会调用 [recorder updateMeters]。 录音机首字母如下:

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
//General Audio Format Settings 
[recordSetting setValue:[NSNumber numberWithInt: 'ima4'] forKey:AVFormatIDKey]; 
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
//Linear PCM Format Settings 
[recordSetting setValue:[NSNumber numberWithInt: 32] forKey:AVLinearPCMBitDepthKey]; 
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
//Encoder Settings 
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMedium] forKey:AVEncoderAudioQualityKey]; 
[recordSetting setValue:[NSNumber numberWithInt:96] forKey:AVEncoderBitRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitDepthHintKey];
//Sample Rate Conversion Settings 
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVSampleRateConverterAudioQualityKey];
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:nil];
recorder.meteringEnabled = YES;

【问题讨论】:

    标签: iphone avaudiorecorder


    【解决方案1】:

    试试这个。这个对我有用。我认为您遇到的问题是您没有调用 updateMeters

    设置记录器一次(这部分代码没问题)

    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;
    //Start the actual Recording
    [recorder record];
    
    NSTimer *TimerUpdate = [NSTimer scheduledTimerWithTimeInterval:.1 
       target:self selector:@selector(timerTask) userInfo:nil repeats:YES];
    

    然后定义这个小程序来获取峰值电平:

    - (void) timerTask {
       [recorder updateMeters];
       float level = [recorder peakPowerForChannel:0];
       NSLog(@"%f", level);
    }
    

    【讨论】:

      【解决方案2】:

      您必须等待设置meteringEnabled 属性,直到您发送record 消息或prepareToRecord 消息。

      在您的具体情况下,添加:

      [recorder prepareToRecord];
      

      之前

      recorder.meteringEnabled = YES;
      

      它应该可以工作。

      【讨论】:

      • 感谢您的评论。更改呼叫顺序并使用正确的频道(在我的情况下为频道 0)正在工作!
      【解决方案3】:

      尝试测试通道 1 或 2 的峰值,而不是 0

      【讨论】:

        【解决方案4】:

        应该返回0,表示0dB和最大功率。来自 Apple 的文档:

        返回值
        正在录制的声音的当前峰值功率,以分贝为单位。返回值 0 dB 表示满量程或最大功率;返回值 -160 dB 表示最小功率(即接近静音)。

        http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioRecorder_ClassReference/Reference/Reference.html

        你想要 averagePowerForChannel: 代替。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多