Q:オーディオファイルやQuickTimeムービーの周波数レベルを取得し、iTunesやQuickTime Playerのように表示するにはどうしたらよいでしょうか?A:QuickTime 7では、いくつかの“MovieAudio API”が追加され、音量と周波数の測定、ゲイン調節、オーディオバランスやミュートの設定などがごく簡単に行えるようになりました。APIのいくつかは既存の機能と重複していますが、“MovieAudio API”のほうがシンプルで一貫したプログラムインターフェイスを提供し、これらのタスクを実行するのに望ましい方法になっています。 たとえば、周波数レベルを監視するには、メディアハンドラのレベルに下がって QuickTimeムービーを渡すことで、2つの“MovieAudio API”を使って簡単に周波数を測定できます。まず 注意:これらの測定用APIは、オーディオデータを再生チェーンから取得するため、ムービーの再生中にのみ機能します。
注意:FFTは測定レベルを要求するたびに実行されるため、生じるオーバーヘッドの量は呼び出しの頻度に比例します。さらに、要求するチャンネルごとにFFTがあります。これはつまり、プレミックス(たとえば リスト1:周波数測定の設定
UInt32 numberOfBandLevels = 7; // もっと高い周波数バンドにはこの数を増やす
UInt32 numberOfChannels = 2; // DeviceMixを使っている場合はStereoMix用
// デバイスのチャンネル数を取得する必要がある
QTAudioFrequencyLevels *freqResults = NULL;
...
// ムービーごとにこれを呼び出し、測定を実行する
err = SetMovieAudioFrequencyMeteringNumBands(myMovie,
kQTAudioMeter_StereoMix,
&numberOfBandLevels);
if (err) goto bail;
freqResults = malloc(offsetof(QTAudioFrequencyLevels,
level[numberOfBandLevels * numberOfChannels]));
if (freqResults == NULL) {
err = memFullErr;
goto bail:
}
freqResults->numChannels = numberOfChannels;
freqResults->numFrequencyBands = numberOfBandLevels;
...
リスト2:測定されたレベルの取得
...
// 測定レベルを表示する準備が整うたびに呼び出す
if (freqResults != NULL) {
err = GetMovieAudioFrequencyLevels(myMovie, kQTAudioMeter_StereoMix, freqResults);
if (err) goto bail;
for (i = 0; i < freqResults->numChannels; i++) {
for (j = 0; j < freqResults->numFrequencyBands; j++) {
// 周波数レベルは0. から1. のFloat32型の値
Float32 value = freqResults->levels[(i *
freqResults->numFrequencyBands) + j];
// 値を使って何か処理をする
...
}
}
}
...
リスト3:kQTAudioMeter_DeviceMix使用時のチャンネル数の取得
AudioChannelLayout *layout = NULL;
UInt32 size = 0;
UInt32 numChannels = 0;
OSStatus err;
...
// デバイスレイアウトのサイズを取得する
err = QTGetMoviePropertyInfo(theMovie, kQTPropertyClass_Audio,
kQTAudioPropertyID_DeviceChannelLayout,
NULL, &size, NULL);
if (err || (0 == size)) goto bail;
// デバイスレイアウトにメモリを割り当てる
layout = (AudioChannelLayout*)calloc(1, size);
if (NULL == layout) {
err = memFullErr;
goto bail;
}
// ムービーからデバイスレイアウトを取得する
err = QTGetMovieProperty(theMovie, kQTPropertyClass_Audio,
kQTAudioPropertyID_DeviceChannelLayout,
size,
layout,
NULL);
if (err) goto bail;
// ここでチャンネル数を取得する
numChannels = (layout->mChannelLayoutTag ==
kAudioChannelLayoutTag_UseChannelDescriptions) ?
layout->mNumberChannelDescriptions :
AudioChannelLayoutTag_GetNumberOfChannels(layout->mChannelLayoutTag);
free(layout);
...
参考資料ムービー、オーディオ、ミックス 3つの定数が、周波数測定のオーディオチャンネルのミックスを定義します。 kQTAudioMeter_StereoMix - ムービー内の有効なサウンドトラックのステレオ(2チャンネル)ミックスを測定します。 kQTAudioMeter_MonoMix - モノラルへミックスされたムービーとして測定します。 kQTAudioMeter_DeviceMix - ムービーを再生するデバイスのAudioChannelLayoutへの ムービーのミックスを測定します。 ドキュメント改訂履歴
掲載日: 2006-01-26 |
|