在iPhone编程中录制和播放音频

时间:2010-08-17 16:28:44

标签: iphone

我正在尝试从我的iPhone模拟器录制音频,然后将其保存到目录中然后播放。由于我听不到我录制的音频,我甚至不确定它是否正在录制。这是我的代码:

-(IBAction) playRecording:sender
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *dir = [paths objectAtIndex:0]; 

    NSFileManager *filemanager = [NSFileManager defaultManager]; 

    NSArray *files = [filemanager contentsOfDirectoryAtPath:dir error:nil]; 

    NSString *file = [files objectAtIndex:0]; 

    NSString *path = [dir stringByAppendingPathComponent:file]; 

    NSURL *url = [NSURL URLWithString:path]; // url is nil 

    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 

    player.volume = 0.3; 

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

    [player play]; 


}


-(IBAction) record:sender 
{
    if(recorder.recording) 
    {
        [recorder stop]; 

        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategorySoloAmbient error:nil];

        [recordButton setTitle:@"Record" forState:UIControlStateNormal]; 

    }

    else 
    {
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

        NSString *dir = [paths objectAtIndex:0]; 
        NSString *filename = [[NSString alloc] initWithString:@"myfile.caf"]; 

        NSString *path = [dir stringByAppendingPathComponent:filename]; 

        NSMutableDictionary *settings = [[NSMutableDictionary alloc] init]; 

        [settings setValue:[NSNumber numberWithInt:kAudioFormatAppleLossless] forKey:AVFormatIDKey]; 

        [settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 

        [settings setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey]; 

        [settings setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; 

        [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 

        [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; 

        [recorder release]; 

        recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:path]
    settings:settings error:nil];

        [recorder prepareToRecord]; 
        recorder.meteringEnabled = YES; 
        [recorder record]; 

        [recordButton setTitle:@"Stop" forState:UIControlStateNormal]; 

    }
}

更新1:

playRecording中的url变量总是被评估为nil。

2 个答案:

答案 0 :(得分:2)

问题是NSURL需要一个未提供的有效URL。这是一种修复NSURL stringWithURL喜欢的有效URL路径的方法:

NSString *path = [dir stringByAppendingPathComponent:file]; 

NSString *fixedPath = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

NSURL *url = [NSURL URLWithString:fixedPath]; 

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 

player.volume = 0.3; 

[player play]; 

答案 1 :(得分:1)

#import "RecorderController.h"

#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>

#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]

@implementation RecorderController

@synthesize _recordButton;
@synthesize _recorder;

- (void)awakeFromNib {

  NSError *err = nil;

  NSMutableDictionary *recordSetting;
  recordSetting = [[NSMutableDictionary alloc] init];

  [recordSetting setValue: [NSNumber numberWithInt: kAudioFormatLinearPCM] forKey: AVFormatIDKey];
  [recordSetting setValue: [NSNumber numberWithFloat: 44100.0] forKey: AVSampleRateKey];
  [recordSetting setValue:[NSNumber numberWithInt: 2] forKey: AVNumberOfChannelsKey];

  [recordSetting setValue: [NSNumber numberWithInt: 16] forKey: AVLinearPCMBitDepthKey];
  [recordSetting setValue: [NSNumber numberWithBool: NO] forKey: AVLinearPCMIsBigEndianKey];
  [recordSetting setValue: [NSNumber numberWithBool: NO] forKey: AVLinearPCMIsFloatKey];

  // create a new dated file
  NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
  NSString *caldate = [now description];
  NSString *recorderFilePath;
  //recorderFilePath = [[NSString stringWithFormat:@"%@/%@.wav", DOCUMENTS_FOLDER, caldate] retain];
    recorderFilePath = [[NSString stringWithFormat:@"%@/SeasonsGreetings.wav", DOCUMENTS_FOLDER, caldate] retain];


  NSURL *url = [NSURL fileURLWithPath:recorderFilePath];
    NSLog(@"PATH: %@",url);
  err = nil;
  _recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];

  if(!_recorder){
    NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle: @"Warning"
                               message: [err localizedDescription]
                              delegate: nil
                     cancelButtonTitle:@"OK"
                     otherButtonTitles:nil];
    [alert show];
    [alert release];
    return;
  }

  // prepare to record
  [_recorder setDelegate:self];
  [_recorder prepareToRecord];

}

- (IBAction)recordButtonPressed:(UIButton *)sender {
  NSLog(@"Record button pressed");

  [_recorder record];
}

@end