12

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);
4

3 に答える 3

33

ハードウェア アクセラレーション エンコーダーの場合、一度にアクティブにできるセッションは 1 つだけです。これは、AAC の場合、アプリがAVAudioSession.

また、AVAudioRecorder を使用して、できれば .m4a ファイルに AAC エンコード形式でオーディオを録音しようとしていました。私はこれをやっている時間の獣を持っていました. コードをコア オーディオ ファイル (.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」のファイルを自由に使用できます。

于 2012-10-02T21:34:28.270 に答える
10

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

于 2012-09-05T08:02:30.807 に答える
3

についてのヒントAVAudioSessionはとても役に立ちます!

setActive:withFlags:error:は iOS 6.0 で非推奨になったため、オーディオ セッションを停止するためのコードを次のように調整する必要があります。

AVAudioSession *session = [AVAudioSession sharedInstance];
int flags = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
[session setActive:NO withOptions:flags error:nil];
于 2013-04-11T19:27:43.110 に答える