5

録音されたファイルの音声レベル (dB) を表す視覚的なグラフを作成する必要があります。私はこのようにしようとしました:

NSError *error = nil;
AVAudioPlayer *meterPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.recording.fileName] error:&error];

if (error) {
    _lcl_logger(lcl_cEditRecording, lcl_vError, @"Cannot initialize AVAudioPlayer with file %@ due to: %@ (%@)", self.recording.fileName, error, error.userInfo);
} else {
    [meterPlayer prepareToPlay];
    meterPlayer.meteringEnabled = YES;
    
    for (NSTimeInterval i = 0; i <= meterPlayer.duration; ++i) {
        meterPlayer.currentTime = i;
        [meterPlayer updateMeters];
        float averagePower = [meterPlayer averagePowerForChannel:0];
        _lcl_logger(lcl_cEditRecording, lcl_vTrace, @"Second: %f, Level: %f dB", i, averagePower);
    }
}
[meterPlayer release];

うまくいけばクールですが、うまくいきませんでした。私はいつも -160 dB を得ます。それを実装する方法に関する他のアイデアはありますか?

UPD:これが私が最終的に得たものです:

代替テキスト http://img22.imageshack.us/img22/5778/waveform.png

4

4 に答える 4

9

この同じ質問に来て、検索に多くの時間を費やした他の人を助けたいだけです. あなたの時間を節約するために、私は私の答えを出しました。私はこれを一種の秘密として扱う人がここにいるのが嫌いです...

extaudioserviceaudio queueavfoundationに関する記事を検索した後。

AVFoundation を使用する必要があることに気付きました。理由は簡単です。これは最新のバンドルであり、Objective C ですが、cpp スタイルではありません。

したがって、それを行う手順は複雑ではありません。

  1. AVAsset音声ファイルから作成
  2. avassetreaderから作成avasset
  3. avassettrackから作成avasset
  4. avassetreadertrackoutputから作成avassettrack
  5. avassetreadertrackoutputを前に追加しavassetreaderて、音声データの読み取りを開始します

avassettrackoutputから、NextSampleBufferを 1 つずつコピーできます(すべてのデータを読み取るためのループです)。

copyNextSampleBufferは、CMSampleBufferGetAudioBufferListWithRetainedBlockBufferによってAudioBufferListを取得するために使用できるCMSampleBufferRefを提供します。AudioBufferListは AudioBuffer の配列ですAudioBufferは、そのmData部分に格納されている一連のオーディオ データです。

上記はextAudioService でも実装できます。しかし、上記のaffoundationアプローチの方が簡単だと思います。

次の質問は、mDataをどうするか? avassetreadertrackoutputを取得すると、その出力形式を指定できるので、出力をlpcmに指定することに注意してください。

次に、最終的に取得するmDataは、実際には float 形式の振幅値です。

簡単でしょ?あちこちのピースからこれを整理するのに多くの時間を費やしましたが.

共有に役立つ 2 つのリソース: この記事を読んで、基本的な用語と概念を理解してください。

サンプル コード: https://github.com/iluvcapra/JHWaveform 上記のコードのほとんどをこのサンプルから直接コピーして、独自の目的に使用できます。

于 2014-03-07T02:23:08.567 に答える
3

私自身は使用していませんが、Apple のavTouch iPhone サンプルには、AVAudioPlayer を使用した棒グラフがあり、どのように動作するかを簡単に確認できます。

于 2009-11-20T00:16:30.790 に答える
0

わかりました、私はもう一度自分の質問に答えるつもりのようです:http : //www.supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/多くの具体的なものはありませんが、少なくともあなたは何を知っているでしょう読むべきAppleドキュメント。

于 2009-11-20T11:48:53.433 に答える
0

AVAudioPlayer制約に基づいて使用できるとは思いません。サウンド ファイルを実際に再生せずに「開始」できたとしても、オーディオ ファイルがストリーミングされるのと同じ速さでグラフを作成するのに役立ちます。あなたが話しているのは、音の静的分析を行うことです。これには、まったく異なるアプローチが必要です。ファイルを自分で読み込んで、手動で解析する必要があります。SDK で何かを使用した簡単な解決策はないと思います。

于 2009-11-20T02:59:19.737 に答える