[英]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.