gpt4 book ai didi

ios - 在 iOS 中录制音频并永久保存

转载 作者:可可西里 更新时间:2023-11-01 04:11:25 24 4
gpt4 key购买 nike

我制作了 2 个 iPhone 应用程序,可以录制音频并将其保存到文件中并再次播放。

其中一个使用 AVAudiorecorder 和 AVAudioplayer。第二个是苹果的SpeakHere音频队列示例。

两者都在模拟器和设备上运行。

但是当我重新启动任何一个应用程序时,都找不到录制的文件!!!我已经尝试了在 stackoverflow 上找到的所有可能的建议,但它仍然不起作用!

这是我用来保存文件的:

NSArray *dirPaths; 
NSString *docsDir;

dirPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];

NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound1.caf"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

最佳答案

好吧,我终于解决了。问题是我正在设置 AVAudioRecorder 并将我的 ViewController.m 的 viewLoad 中的路径文件覆盖具有相同名称的现有文件。

  1. 录制音频并将其保存到文件并停止应用程序后,我可以在 Finder 中找到该文件。 (/Users/xxxxx/Library/Application Support/iPhone Simulator/6.0/Applications/0F107E80-27E3-4F7C-AB07-9465B575EDAB/Documents/sound1.caf)
  2. 当我重新启动应用程序时,记录器的设置代码(来自 viewLoad)将覆盖我的旧文件:

    sound1.caf

  3. 用一个新的。同名但无内容。

  4. 回放只会播放一个空的新文件。 --> 明显没有声音。


这就是我所做的:

我使用 NSUserdefaults 来保存录制文件名的路径,以便稍后在我的播放方法中检索。


清理 ViewController.m 中的 viewLoad:

- (void)viewDidLoad
{

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

[audioSession setActive:YES error:nil];

[recorder setDelegate:self];

[super viewDidLoad];
}

在 ViewController.m 中编辑记录:

- (IBAction) record
{

NSError *error;

// Recording settings
NSMutableDictionary *settings = [NSMutableDictionary dictionary];

[settings setValue: [NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[settings setValue: [NSNumber numberWithFloat:8000.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];
[settings setValue: [NSNumber numberWithInt: AVAudioQualityMax] forKey:AVEncoderAudioQualityKey];

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

NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[self dateString]];

// File URL
NSURL *url = [NSURL fileURLWithPath:pathToSave];//FILEPATH];


//Save recording path to preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];


[prefs setURL:url forKey:@"Test1"];
[prefs synchronize];


// Create recorder
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];

[recorder prepareToRecord];

[recorder record];
}

在 ViewController.m 中编辑播放:

-(IBAction)playBack
{

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

[audioSession setActive:YES error:nil];


//Load recording path from preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];


temporaryRecFile = [prefs URLForKey:@"Test1"];



player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];



player.delegate = self;


[player setNumberOfLoops:0];
player.volume = 1;


[player prepareToPlay];

[player play];


}

并在 ViewController.m 中添加了一个新的 dateString 方法:

- (NSString *) dateString
{
// return a formatted string for a file name
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"ddMMMYY_hhmmssa";
return [[formatter stringFromDate:[NSDate date]] stringByAppendingString:@".aif"];
}

现在它可以通过 NSUserdefaults 加载最后记录的文件:

    //Load recording path from preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];


temporaryRecFile = [prefs URLForKey:@"Test1"];



player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];

在(IBAction)回放中。 temporaryRecFile 是我的 ViewController 类中的一个 NSURL 变量。

声明如下 ViewController.h :

@interface SoundRecViewController : UIViewController <AVAudioSessionDelegate,AVAudioRecorderDelegate, AVAudioPlayerDelegate>
{
......
......
NSURL *temporaryRecFile;

AVAudioRecorder *recorder;
AVAudioPlayer *player;

}
......
......
@end

关于ios - 在 iOS 中录制音频并永久保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15059089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com