簡體   English   中英

在iPhone編程中錄制和播放音頻

[英]Recording and Playing Audio in IPhone Programming

我試圖從我的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。

問題是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]; 
#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM