簡體   English   中英

AVAudioRecorder記錄AAC / m4a

[英]AVAudioRecorder record AAC/m4a

我正在嘗試使用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);

對於硬件加速編碼器,在任何給定時間只能激活一個會話。 這意味着,對於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'中的文件。

iOS SDK顯然很愚蠢。 將格式ID鍵設置為kAudioFormatMPEG4AAC還不足以實際編碼文件; 在QuickTime中它會播放,但在其屬性中你只會看到AAC而沒有進一步的細節。 將輸出文件擴展名更改為m4a應該有助於實現技巧並使其應用正確的編碼。

關於AVAudioSession的提示非常有用!

由於setActive:withFlags:error:已在iOS 6.0中棄用,因此停止音頻會話的代碼應調整為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM