2012-08-28 16 views
10

AVAudioRecorderを使用してデバイスにオーディオを録音しようとしています。そのファイルはWebサーバーに送信され、その結果のファイルをWebブラウザで再生したいのですが...AVAudioRecorderレコードAAC/m4a

私はデバイス上でさまざまな組み合わせの設定を試しています...ファイルを正しい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); 

すべてが働いていた行の前にこのコードを入れて編集 -By。

NSError error;  
AVAudioSession audioSession = AVAudioSession.SharedInstance(); 
audioSession.SetCategory(AVAudioSession.CategoryRecord, out error); 
audioSession.SetActive(true, out error); 
+0

setActive:withFlags:error:以来

は、オーディオセッションを停止させるためのコードがに調整しなければならないのiOS 6.0 では非推奨となっています。 – justinkoh

答えて

6

iOS SDKは明らかに愚かです。フォーマットIDキーをkAudioFormatMPEG4AACに設定するだけでは、実際にファイルをエンコードするには不十分です。 QuickTimeでは再生されますが、そのプロパティではAACと表示され、詳細は表示されません。出力ファイルの拡張子をm4aに変更すると、そのトリックを行い、適切なエンコーディングを適用するのに役立ちます。

+0

私はそれを試したと確信して、それは動作しませんでした。でも、もう一度試してみるよ。 –

+0

これはまだ動作していません「これはQuickTimeが理解できるファイルではありません」 –

+0

この方法は私にとってはうまくいきませんでした。 – justinkoh

30

ハードウェアアクセラレータエンコーダでは、常に1つのセッションしかアクティブにできません。つまり、AACの場合、ソフトウェアエンコーダが使用されているシミュレータでは動作しますが、アプリがAVAudioSessionをアクティブにしない限り、ハードウェアエンコーダが使用されているデバイスでは失敗する可能性があります。

また、AVAudioRecorderを使用して、AACでエンコードされた形式のオーディオを.m4aファイルに録音しようとしました。私はこれを行う時間の獣を持っていた。コアオーディオファイル(.caf)の内部にAACに録音するコードをすぐに手に入れることができましたが、AVAudioRecorderで.m4aを適切にフォーマットすることができませんでした。私はアプリケーションの録音コードを低レベルのAudio Units APIを使って書き直そうとしていましたが、代わりにバックバーナーに入れて共有オーディオセッションを処理するコードを追加しました。それが設定されたら、私は戻って.m4aとして保存しようとしたところ、ちょうどうまくいった。そして、「tmpFileUrl」でのファイルは、あなたのようにしてください使用することができます

[recorder stop]; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation; 
[session setActive:NO withFlags:flags error:nil]; 

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]; 

その後、私は使用した記録を終了するには:ここで

は、いくつかのサンプルコードです。

+1

これは無数の時間upvotedする必要があります!驚くべき答えです: – mahboudz

+0

ありがとう、これは私に多くの時間を節約! –

3

ヒント約AVAudioSessionは非常に役に立ちます!私は同じ問題に直面したとして、あなたはこの解決策を見つけた場合、私は思ったんだけど

AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation; 
[session setActive:NO withOptions:flags error:nil]; 
関連する問題