首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVAudioRecorder记录AAC/m4a

AVAudioRecorder记录AAC/m4a
EN

Stack Overflow用户
提问于 2012-08-28 16:04:43
回答 3查看 13.8K关注 0票数 12

我正在尝试用AVAudioRecorder记录设备上的音频。该文件被传输到web服务器,我想在web浏览器中播放该文件。

我在device...nothing上尝试过各种设置组合,似乎可以将文件编码成正确的AAC格式。

QuickTime说它不知道如何播放这个文件。

样本代码

代码语言:javascript
复制
    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();  
     }

编辑-By将这段代码放在行前面

代码语言:javascript
复制
recorder = AVAudioRecorder.ToUrl(url, settings, out error);

一切正常。

代码语言:javascript
复制
NSError error;    
AVAudioSession audioSession = AVAudioSession.SharedInstance();
audioSession.SetCategory(AVAudioSession.CategoryRecord, out error);
audioSession.SetActive(true, out error);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-05 08:02:30

iOS SDK显然是愚蠢的。将格式ID键设置为kAudioFormatMPEG4AAC并不足以使其实际编码文件;在QuickTime中,它将播放,但在其属性中,您只会看到AAC,而没有进一步的详细信息。将输出文件扩展名更改为m4a应该有助于完成任务,并使其应用正确的编码。

票数 10
EN

Stack Overflow用户

发布于 2012-10-02 21:34:28

对于硬件加速编码器,在任何给定时间只能有一个会话处于活动状态.这意味着,对于AAC,它将在模拟器中工作(在模拟器中使用软件编码器),但在设备上(在设备上使用硬件编码器)可能会失败,除非应用程序激活AVAudioSession

我还试图使用AVAudioRecorder以AAC编码格式记录音频,最好是在.m4a文件中。我有一段时间做这件事。我很快就能在核心音频文件(.caf)中将代码记录到AAC,但我无法让AVAudioRecorder正确地格式化.m4a。我正要用更低级别的音频单元API重写我的应用程序中的录音代码,但是我把它放在次要位置,并添加到代码中来处理共享音频会话。一旦设置好了,我就回去尝试将其保存为一个.m4a,它只是起作用了。

下面是一些示例代码:

代码语言:javascript
复制
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];

然后结束我用的录音:

代码语言:javascript
复制
[recorder stop];
AVAudioSession *session = [AVAudioSession sharedInstance];
int flags = AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation;
[session setActive:NO withFlags:flags error:nil];

那么'tmpFileUrl‘处的文件可以随意使用。

票数 34
EN

Stack Overflow用户

发布于 2013-04-11 19:27:43

关于AVAudioSession的提示非常有用!

由于setActive:withFlags:error:在iOS 6.0中已不再受欢迎,因此停止音频会话的代码应该调整为:

代码语言:javascript
复制
AVAudioSession *session = [AVAudioSession sharedInstance];
int flags = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
[session setActive:NO withOptions:flags error:nil];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12163240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档