我一直在寻找答案,但找不到我需要的东西。基本上在我的应用程序中,我将语音录制到音频文件(如iOS语音备忘录应用程序),然后想将其保存到本地文档目录。由于某种原因,下次启动应用程序时,我与录制文件一起提供的URL将过期。此外,即使它没有,如果我记录两次,第二个文件URL获得与第一个相同的URL,所以我丢失了第一个文件。
以这种方式录制:
[audioRecorder record];
其中:AVAudioRecorder * audioRecorder;
播放没问题:
[audioPlayer play];
其中:AVAudioPlayer * audioPlayer;
录制语音备忘录并将其保存到iPhone上的本地磁盘的最佳方法是什么?
感谢。
更新
我尝试使用此代码:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];
BOOL status = [data writeToFile:filePath atomically:YES];
数据是我的AVAudioPlayer NSData属性的数据,但BOOL得0,不知道为什么。
答案 0 :(得分:18)
返回我们用作声音文件名的当前日期和时间。
目标-C
- (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"];
}
Swift 4
func dateString() -> String {
let formatter = DateFormatter()
formatter.dateFormat = "ddMMMYY_hhmmssa"
let fileName = formatter.string(from: Date())
return "\(fileName).aif"
}
设置音频会话
目标-C
- (BOOL) startAudioSession
{
// Prepare the audio session
NSError *error;
AVAudioSession *session = [AVAudioSession sharedInstance];
if (![session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error])
{
NSLog(@"Error setting session category: %@", error.localizedFailureReason);
return NO;
}
if (![session setActive:YES error:&error])
{
NSLog(@"Error activating audio session: %@", error.localizedFailureReason);
return NO;
}
return session.inputIsAvailable;
}
Swift 4
func startAudioSession() -> Bool {
let session = AVAudioSession()
do {
try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
} catch(let error) {
print("--> \(error.localizedDescription)")
}
do {
try session.setActive(true)
} catch (let error) {
print("--> \(error.localizedDescription)")
}
return session.isInputAvailable;
}
录制声音..
目标-C
- (BOOL) 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];
// Create recorder
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (!recorder)
{
NSLog(@"Error establishing recorder: %@", error.localizedFailureReason);
return NO;
}
// Initialize degate, metering, etc.
recorder.delegate = self;
recorder.meteringEnabled = YES;
//self.title = @"0:00";
if (![recorder prepareToRecord])
{
NSLog(@"Error: Prepare to record failed");
//[self say:@"Error while preparing recording"];
return NO;
}
if (![recorder record])
{
NSLog(@"Error: Record failed");
// [self say:@"Error while attempting to record audio"];
return NO;
}
// Set a timer to monitor levels, current time
timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(updateMeters) userInfo:nil repeats:YES];
return YES;
}
Swift 4
func record() -> Bool {
var settings: [String: Any] = [String: String]()
settings[AVFormatIDKey] = kAudioFormatLinearPCM
settings[AVSampleRateKey] = 8000.0
settings[AVNumberOfChannelsKey] = 1
settings[AVLinearPCMBitDepthKey] = 16
settings[AVLinearPCMIsBigEndianKey] = false
settings[AVLinearPCMIsFloatKey] = false
settings[AVAudioQualityMax] = AVEncoderAudioQualityKey
let searchPaths: [String] = NSSearchPathForDirectoriesInDomains(.documentDirectory, .allDomainsMask, true)
let documentPath_ = searchPaths.first
let pathToSave = "\(documentPath_)/\(dateString)"
let url: URL = URL(pathToSave)
recorder = try? AVAudioRecorder(url: url, settings: settings)
// Initialize degate, metering, etc.
recorder.delegate = self;
recorder.meteringEnabled = true;
recorder?.prepareToRecord()
if let recordIs = recorder {
return recordIs.record()
}
return false
}
播放声音...从文档directiory中检索
目标-C
-(void)play
{
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath_ = [searchPaths objectAtIndex: 0];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:[self recordingFolder]])
{
arrayListOfRecordSound=[[NSMutableArray alloc]initWithArray:[fileManager contentsOfDirectoryAtPath:documentPath_ error:nil]];
NSLog(@"====%@",arrayListOfRecordSound);
}
NSString *selectedSound = [documentPath_ stringByAppendingPathComponent:[arrayListOfRecordSound objectAtIndex:0]];
NSURL *url =[NSURL fileURLWithPath:selectedSound];
//Start playback
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if (!player)
{
NSLog(@"Error establishing player for %@: %@", recorder.url, error.localizedFailureReason);
return;
}
player.delegate = self;
// Change audio session for playback
if (![[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error])
{
NSLog(@"Error updating audio session: %@", error.localizedFailureReason);
return;
}
self.title = @"Playing back recording...";
[player prepareToPlay];
[player play];
}
Swift 4
func play() {
let searchPaths: [String] = NSSearchPathForDirectoriesInDomains(.documentDirectory, .allDomainsMask, true)
let documentPath_ = searchPaths.first
let fileManager = FileManager.default
let arrayListOfRecordSound: [String]
if fileManager.fileExists(atPath: recordingFolder()) {
let arrayListOfRecordSound = try? fileManager.contentsOfDirectory(atPath: documentPath_)
}
let selectedSound = "\(documentPath_)/\(arrayListOfRecordSound.first)"
let url = URL.init(fileURLWithPath: selectedSound)
let player = try? AVAudioPlayer(contentsOf: url)
player?.delegate = self;
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
player?.prepareToPlay()
player?.play()
}
<强> stopRecording 强>
目标-C
- (void) stopRecording
{
// This causes the didFinishRecording delegate method to fire
[recorder stop];
}
Swift 4
func stopRecording() {
recorder?.stop()
}
<强> continueRecording 强>
目标-C
- (void) continueRecording
{
// resume from a paused recording
[recorder record];
}
Swift 4
func continueRecording() {
recorder?.record()
}
<强> pauseRecording 强>
目标-C
- (void) pauseRecording
{ // pause an ongoing recording
[recorder pause];
}
Swift 4
func pauseRecording() {
recorder?.pause()
}