【问题标题】:AVAudioRecorder does not create .m4a files that can be opened and playedAVAudioRecorder 不会创建可以打开和播放的 .m4a 文件
【发布时间】:2013-07-06 08:34:25
【问题描述】:

我正在尝试修改一个可以将音频文件(安全/加密)发送到其他 iOS 设备的 iOS 应用。它使用 AVAudioRecorder 录制音频文件,并使用 AVAudioPlayer 播放任何接收到的音频文件。

我现在正在尝试修改应用程序以创建和发送与 Android 兼容的文件。我将现有的 AVAudioRecorder 代码修改为:

[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
[settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitRateKey];
[settings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
[settings setValue:[NSNumber numberWithFloat:48000.0] forKey:AVSampleRateKey];

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

NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd HH-mm"];

NSString *filename = [NSString stringWithFormat:@"%@.aac", [format stringFromDate:NSDate.date]];

由此创建的文件可以在 Mac、iOS 设备上播放,但不能在 Android 设备上播放。如果手动将文件扩展名更改为以“.m4a”结尾,则该文件将在 Android 上播放。

(“.aac”格式的优点是旧版本的应用可以接收这些文件并播放它们——我一直保持向后兼容性。)

所以我做了这个改变:

NSString *filename = [NSString stringWithFormat:@"%@.m4a", [format stringFromDate:NSDate.date]];

但是,生成的文件(由 AVAudioRecorder 创建且没有错误)无法在 Mac 或 iOS 设备上播放。我正在等待它是否适用于 Android。

当 AVAudioPlayer 尝试打开该文件时,它会输出:

错误域=NSOSStatusErrorDomain Code=1685348671 "操作 无法完成。 (OSStatus 错误 1685348671。)”代码 1685348671 -> "dta?": 文件格式错误,不是该类型音频文件的有效实例,或未被识别为音频文件。

仅仅将文件重命名为“.aac”并不能改变它无法加载到 Mac 或 iOS 上的任何内容的事实。

目前,最好的解决方案似乎是创建一个“.aac”文件,然后让 Android 端将“.aac”替换为“.m4a”并尝试播放它。

问题 1:有谁知道为什么更改文件扩展名会导致 AVAudioPLayer 失败?顺便说一句,我在上面创建的“.m4a”文件无法用我在 Mac 上的任何东西打开,所以我无法判断问题是文件格式还是 iOS 或 Mac 无法读取此文件类型.

对于任何好奇的人,我将来自 AVAudioRecorder 的“.aac”和“.m4a”文件的副本放在这里:

https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2013-24.m4a https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2010-11.aac

问题 2:当我将 AVAudioRecorder 设置为一个通道时,生成的文件是立体声的。为什么? (至少 VLC 是这么说元数据的)

问题3:有没有指定AAC-LC进行无损编码?还是只有从 AVAudioRecorder 转移到较低级别的 API 时才能这样做?

【问题讨论】:

标签: ios avaudiorecorder aac m4a


【解决方案1】:

问题 1 的答案是您必须正确设置音频会话,否则 m4a 文件无法正确格式化。我现在在开始录制之前设置的音频会话代码是:

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

我在录制完成后将会话设置回播放,以便可以播放音频文件。

问题 2 是 VLC 中的一个问题,它显示的频道数不正确。音频文件在 MacOS Finder 的 Get Info 窗口中显示为单声道。

问题 3 没有答案。

【讨论】:

    【解决方案2】:

    对于在 iOS 和 android 中播放的“.m4a”文件中创建和录制音频,我使用以下代码:

    NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
    
    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
    
    
    AudioRecorder = [[AVAudioRecorder alloc] initWithURL:fileOutPutUrl settings:recordSetting error:nil];
    [AudioRecorder setDelegate:self];
    [AudioRecorder recordForDuration:RecordLimitTime];  // Record Limit if require
    if ([AudioRecorder prepareToRecord]) {
        [AudioRecorder record];
    }
    

    在 Android 方面,我不必更改仅播放“.mp3”文件的代码,在 android 中只需将扩展名从“fileName.m4a”更改为“fileName.mp3”,它的效果令人惊讶。 iOS file = "fileName.m4a" 播放流畅。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,在使用本地文件创建 AVAudioPlayer 时遇到了 NSOSStatusErrorDomain 560030580

      问题不在于文件,也不在于它的格式,而是因为我错误地设置了AVAudioSession

      我在录制音频之前打电话给setCategory(.playAndRecord)setActive(yes),然后在播放它时打电话给setCategory(.playback)setActive(yes),我从来没有打电话给setActive(false)

      根据Apple docs,对于某些播放和录制应用程序,需要明确停用,所以我所做的是:

      • 在录音前和结束通话时拨打setCategory(.record)setActive(yes)setActive(false)
      • 在播放文件之前调用setCategory(.playback)setActive(yes),完成调用setActive(false)

      另外,我发现了这个https://www.osstatus.com/,它提供了有关在处理音频/文件内容时引发的错误的更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多