当前位置: 首页 > 知识库问答 >
问题:

AVAudioRecorder不会创建。可以打开和播放的m4a文件

东方方伟
2023-03-14

我正在尝试修改一个可以将音频文件(安全/加密)发送到其他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代码=1685348671“操作无法完成。(OSStatus错误1685348671)。”代码16853471-

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

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

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

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

https://dl.dropboxusercontent.com/u/14939586/2013-07-08 13-24.m4ahttps://dl.dropboxusercontent.com/u/14939586/2013-07-08 10-11.aac

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

问题3:是否需要指定AAC-LC用于无损编码?或者,我只能从AVAudioRecorder转移到较低级别的API才能这样做?

共有3个答案

戴正阳
2023-03-14

我有同样的问题,我得到NSOSStatusErrorDomain 560030580时创建AVAudioPlayer与本地文件。

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

在录制音频之前,我一直在调用setCategory(.playAndRecord)setActive(yes)way,然后在播放时调用setCategory(.playback)setActive(yes),我从未调用过setActive(false)

根据一些播放和录制应用程序的Apple文档,停用需要明确进行,所以我所做的是:

  • 在录制之前,以及在完成通话时,呼叫setCategory(.record)setActive(yes)

还有,我找到了这个https://www.osstatus.com/这提供了有关处理音频/文件时抛出的错误的更多信息。

施学
2023-03-14

对于在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",它令人惊讶地works.andiOS文件="fileName. m4a"顺利播放。

阎声
2023-03-14

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

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

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

问题2是VLC中的一个问题,显示的通道数不正确。MacOS Finder的“获取信息”窗口中的音频文件显示为单通道。

问题3未获答复。

 类似资料:
  • 问题内容: 所以我想做的就是快速创建并播放声音,当我按下按钮时会播放声音,我知道如何在Objective-C中做到这一点,但是有人知道如何在Swift中做到吗? 对于Objective-C来说是这样的: 然后播放它,我会做: 有人知道我该怎么做吗? 问题答案: 这是我添加到FlappySwift的一些有效的代码:

  • 我无法在我的MediaPlayer应用程序中运行某个特定的流。我知道该应用程序可以工作,但当我决定更改我的流媒体服务时,新的URL无法工作。将这个URL插入网络浏览器确实有效。以下是我的相关代码: 然后,在onPrepared()中: 这是我的LogCat(在装有Android 4.3的三星Galaxy Nexus上运行): 有什么想法吗? 编辑 我做了更多的挖掘,并为上面提供的链接设置了一个Ht

  • 可播放的文件类型 选择影像时,能播放以下种类的档案。 Memory Stick™影像格式 - MPEG-4 Simple Profile(AAC) - H.264/MPEG-4 AVC Main Profile (CABAC) (AAC) 、Baseline Profile (AAC) MP4 - MPEG-4 Simple Profile (AAC) - H.264/MPEG-4 AVC Mai

  • 可播放的文件类型 选择音乐时,能播放以下种类的档案。 Memory Stick™音乐格式 - ATRAC3™ - ATRAC3plus™ - MP3 MP3(MPEG-1/2 Audio Layer3) MP4(MPEG-4 AAC) WAVE(Linear PCM) WMA 提示 部份数据可能因种类的限制而无法播放。 在网络上公开的图像文件案可能有播放限制。详细信息请询问档案的提供者。 无法播放

  • 可播放的文件类型 使用SensMe™ channels时,可播放使用个人计算机,由"Media Go"传送至 PSP™的以下种类之档案。 MP3 (MPEG-1 Audio Layer3) MP4 (MPEG-4 AAC-LC) WMA 提示 部份数据可能因种类的限制而无法播放。 在网络上公开的档案可能有播放限制。详细信息请询问档案的提供者。 无法播放内建著作权保护机能的WMA档案。

  • 我用的是玩耍框架1.2.5.3。当我在我的项目上运行WAR命令时,我得到的是一个带有。战争延期。在这个目录中有一个WEB-INF目录,我的项目的其余部分也在这个目录中。 play-war命令不是应该将项目打包为标准的war jar,以便在web服务器上部署吗?我错过了什么?