AVAudioRecorder记录AAC / m4a

时间:2012-08-28 16:04:43

标签: ios ipad audio xamarin.ios avaudiorecorder

我正在尝试使用AVAudioRecorder在设备上录制音频。该文件被传输到Web服务器,我想在Web浏览器中播放该结果文件..

我在设备上尝试了各种设置组合......似乎没有任何东西可以将文件编码为正确的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);

3 个答案:

答案 0 :(得分:31)

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

我还尝试使用AVAudioRecorder以AAC编码格式录制音频,最好是.m4a文件。我有一个时间的野兽这样做。我很快就能够将代码记录到核心音频文件(.caf)中的AAC,但我无法让AVAudioRecorder正确格式化.m4a。我正准备使用较低级别的Audio Units 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'中的文件。

答案 1 :(得分:9)

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

答案 2 :(得分:3)

关于AVAudioSession的提示非常有帮助!

由于setActive:withFlags:error:已在iOS 6.0中弃用 停止音频会话的代码应调整为:

AVAudioSession *session = [AVAudioSession sharedInstance];
int flags = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
[session setActive:NO withOptions:flags error:nil];