AVAudioRecorder 录制 AAC/m4a
Posted
技术标签:
【中文标题】AVAudioRecorder 录制 AAC/m4a【英文标题】:AVAudioRecorder record AAC/m4a 【发布时间】:2012-08-28 16:04:43 【问题描述】:我正在尝试使用 AVAudioRecorder 在设备上录制音频。该文件被传输到网络服务器,我想在网络浏览器中播放生成的文件..
我在设备上尝试了各种设置组合...似乎没有将文件编码为正确的 AAC 格式。
QuickTime 说它不知道如何播放这个文件。
示例代码
private void InitializeRecordingSession()
string fileName = string.Format("0.m4a", Guid.NewGuid());
string tmpdir = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/audio";
if (!Directory.Exists(tmpdir))
Directory.CreateDirectory(tmpdir);
audioFilePath = Path.Combine(tmpdir, fileName);
Console.WriteLine("Audio File Path: " + audioFilePath);
var url = NSUrl.FromFilename(audioFilePath);
var settings = new AVAudioRecorderSettings()
AudioFormat = AudioFormatType.MPEG4AAC,
SampleRate = 44100,
NumberChannels = 1,
AudioQuality = AVAudioQuality.High,
;
recorder = AVAudioRecorder.ToUrl(url, settings, out error);
//Set Recorder to Prepare To Record
recorder.PrepareToRecord();
编辑-将此代码放在行前
recorder = AVAudioRecorder.ToUrl(url, settings, out error);
一切正常。
NSError error;
AVAudiosession audioSession = AVAudioSession.SharedInstance();
audioSession.SetCategory(AVAudioSession.CategoryRecord, out error);
audioSession.SetActive(true, out error);
【问题讨论】:
我想知道您是否找到了解决方案,因为我遇到了同样的问题。 【参考方案1】:对于硬件加速编码器,在任何给定时间只能激活一个会话。这意味着,对于 AAC,它可以在模拟器(使用软件编码器)中工作,但可能会在设备(使用硬件编码器)上失败,除非您的应用激活 AVAudioSession
。
我还尝试使用 AVAudioRecorder 以 AAC 编码格式录制音频,最好是在 .m4a 文件中。我在做这件事时玩得很开心。我很快就能够在核心音频文件 (.caf) 中获取录制到 AAC 的代码,但我无法让 AVAudioRecorder 正确格式化 .m4a。我正要使用较低级别的音频单元 API 重写我的应用程序中的录制代码,但我把它放在次要位置并添加到代码中以处理共享音频会话。设置完成后,我返回并尝试另存为 .m4a,它就可以正常工作。
下面是一些示例代码:
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSURL *tmpFileUrl = [NSURL fileURLWithPath:[docsDir stringByAppendingPathComponent:@"tmp.m4a"]];
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[NSNumber numberWithFloat:16000.0], AVSampleRateKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
nil];
NSError *error = nil;
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:tmpFileUrl settings:recordSettings error:&error];
[recorder prepareToRecord];
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
[session setActive:YES error:nil];
[recorder record];
然后结束我使用的录音:
[recorder stop];
AVAudioSession *session = [AVAudioSession sharedInstance];
int flags = AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation;
[session setActive:NO withFlags:flags error:nil];
那么'tmpFileUrl'处的文件就可以随意使用了。
【讨论】:
惊人的答案。谢谢,这为我节省了很多时间!【参考方案2】:iOS SDK 显然很愚蠢。将格式 ID 键设置为 kAudioFormatMPEG4AAC
不足以使其实际编码文件;在 QuickTime 中它会播放,但在它的属性中你只会看到 AAC
而没有更多细节。将输出文件扩展名更改为 m4a
应该有助于解决问题并使其应用正确的编码。
【讨论】:
我很确定我试过了,但没有成功。但我会再试一次。 这仍然不起作用“这不是 quicktime 理解的文件” 我必须在开始录制之前添加它,以使生成的 .m4a 文件可用。 AVAudioSession *session = [AVAudioSession sharedInstance]; [会话设置类别:AVAudioSessionCategoryRecord 错误:无]; [会话 setActive:YES 错误:nil];` 这太不可思议了,找了几天的问题。如果您因为提到的文件结尾问题而使用错误的编码播放文件,则它适用于 iOS,但不适用于 android 和一些播放器。在您将其从 iOS 中取出之前,无法查看您的文件是否存在问题。非常感谢。【参考方案3】:关于AVAudioSession
的提示很有帮助!
由于setActive:withFlags:error:
在 iOS 6.0 中已被弃用
停止音频会话的代码应调整为:
AVAudioSession *session = [AVAudioSession sharedInstance];
int flags = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
[session setActive:NO withOptions:flags error:nil];
【讨论】:
以上是关于AVAudioRecorder 录制 AAC/m4a的主要内容,如果未能解决你的问题,请参考以下文章
使用 AVAudioRecorder 录制时创建 2 秒音频文件