【问题标题】:AVAudioRecorder writes malformed file?AVAudioRecorder 写入格式错误的文件?
【发布时间】:2013-03-20 13:31:25
【问题描述】:

此代码有效,但当我迁移到 iOS 6 时,它不再支持 mp4。

我准备写

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"Temp.mp4"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
                                [NSNumber numberWithFloat: 32000], AVSampleRateKey,
                                [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
                                [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
                                nil];
NSError *error = nil;
self.audioRecorder = nil;
AVAudioRecorder *audioRecorderBuffer = [[AVAudioRecorder alloc]
                                        initWithURL:soundFileURL
                                        settings:recordSettings
                                        error:&error];
self.audioRecorder = audioRecorderBuffer;
self.audioRecorder.delegate = self;
if (error)
    NSLog(@"error: %@", [error localizedDescription]);
else
    [self.audioRecorder prepareToRecord];

然后录制、存储、保存以及当我尝试播放时:

_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:_audioURL error:&error];
_audioPlayer.delegate = self;
if (error)
    NSLog(@"Error: %@", [error localizedDescription]);
else {
    [_audioPlayer prepareToPlay];
    if (![_audioPlayer play]) {
        NSLog(@"Play Error: %@", error);
    }
}

我得到错误:

错误:操作无法完成。 (OSStatus 错误 1685348671。)

代码适用于未压缩的格式。 压缩的 mp4 可在装有 iOS 6 的 iPhone 4 上工作,也可在装有 iOS 5.x 的 iphone 4S 上工作,但不能在装有 iOS 6 的 iphone 4S 和 iphone 5 上工作。

AVAudioRecorder 录制并写入文件,然后 AVAudioPlayer 出错 Error: The operation could not be completed. (OSStatus 错误 1685348671。)。 文档指出文件格式已损坏。

有什么想法吗?

【问题讨论】:

  • 我也有同样的问题。它完成了录制,但文件无法播放。有什么意见吗?

标签: iphone ios objective-c avaudioplayer avaudiorecorder


【解决方案1】:

尝试在[self.audioRecorder prepareToRecord]之前添加以下内容

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
[session setActive:YES error:nil];

看看这个question/answer

【讨论】:

    【解决方案2】:

    我刚刚遇到了与损坏的文件非常相似的问题 - 对我来说,归结为那些无法录制的人拒绝了访问麦克风的权限。这意味着 prepareToRecord 正在工作(并截断文件),而 record 报告它正在工作,但实际上它没有记录任何内容。

    这段代码(swift不是Objective-C)获取权限状态:

    let val : AVAudioSessionRecordPermission = AVAudioSession.sharedInstance().recordPermission()
    switch( val ){
    case AVAudioSessionRecordPermission.Undetermined :
        print("permission undetermined")
        break
    case AVAudioSessionRecordPermission.Denied :
        print("permission denied")
        break
    case AVAudioSessionRecordPermission.Granted :
        print("permission granted")
        break
    default :
        print("permission unknown")
        break
    }
    

    当我想录制时,我使用了这个:

    AVAudioSession.sharedInstance().requestRecordPermission({(granted: Bool)-> Void in
        if granted {
            self.internalRecorder.prepareToRecord()
            self.internalRecorder.record()
        } else {
            // can't record - update UI
        }
    })
    

    如果遇到同样的问题,希望它能节省一些时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      相关资源
      最近更新 更多