mikeo_410


 音に関する一覧

WPFで利用可能な標準のクラス

Fig.1 音に関連したクラス
クラス 名前空間 録音 Stream 圧縮 備考
MediaElement System.Windows.Controls X X X ・UIコントロール
・URIのみ再生
  1. <Window x:Class="wpf_audio_test1.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         Title="MainWindow" Height="350" Width="525">
  5.     <Grid Loaded="Grid_Loaded">
  6.         <MediaElement Source="file:///c:/codesamples/nf092004.wav"/>
  7.     </Grid>
  8. </Window>
MediaPlayer System.Windows.Media X X X ・UIコントロールではない
・URIのみ再生
  1. private void Grid_Loaded(object sender, RoutedEventArgs e)
  2. {
  3.     MediaPlayer mp = new MediaPlayer();
  4.     mp.Open(new Uri("file:///c:/codesamples/nf092004.wav"));
  5.     mp.Play();
  6. }
SystemSounds System.Media X X X 「テーマ」で設定されている警報音の短いWAVファイルを再生する機能
  1. private void Grid_Loaded(object sender, RoutedEventArgs e)
  2. {
  3.     System.Media.SystemSounds.Asterisk.Play();
  4.     //System.Media.SystemSounds.Beep.Play();
  5.     //System.Media.SystemSounds.Exclamation.Play();
  6.     //System.Media.SystemSounds.Hand.Play();
  7.     //System.Media.SystemSounds.Question.Play();
  8. }
SoundPlayer System.Media X O X Streamが入力に指定できるので音を作って渡せる
System.Media (Sound)」にサンプル

Silverlightの音

  互換性の点で気になるので確認しておく。

  1. MediaElementにSetSource()があって、Streamをソースにできる。
    現状は確認していないが、PCMが入出力できなかった。これは、Action Scriptも同様で、おそらく著作権保護が理由だと考えられる。
    一部の圧縮形式が再生可能。mp3はOK。
  2. AudioSinkクラスでPCMの入出力ができる。

  Silverlightは、Linuxでも、IE以外のブラウザでも、動作するもので、Silverlightが用意する以外の方法では入出力できない。
  何かのサウンドAPIを呼び出すと言ったことはできない。

マイク入力

  マイクだけでなく、音声の入力機能を持った標準的なクラスは無いようだ。

扱うデータによる分類

  1. データそのものが必要。周波数分析をするなど音声データそのものが必要。
  2. 単に、圧縮などのためにデータをメモリに格納する。音声加工ができるなら、データ値そのものに関心はない。
  3. リアルタイム性のためにバッファリングする。データ値そのものに関心はない。

  ---

  1. PCM
  2. 圧縮音声

  ---

  1. ネットワーク上のストリーミングデータの入出力
  2. ファイルを入出力
  3. メモリ上のデータを入出力

音声を扱う方法

  今のところ、標準的な方法では実現できないものは以下の通り。

  1. マイク入力
  2. マイク以外のキャプチャ
  3. リアルタイム再生
  4. 圧縮音声

  これらは、何かしらのAPIを使って実現することになる。
  大半は、今まで通り winmm.dll を呼び出せば実現できる。
  しかし、winmm.dll は 32ビット版のみが存在し、過去のものとして扱われているようだ。
  特に問題なく動作する。問題があるのは、プログラミング時だけ。
  64ビットWindowsの上で、そのままビルドすると実行時にエラーが起きる。エラー表示も、直ちに原因が推測できるものではない。
  中間コード方式の C# で、64/32ビットが何の関係があるのか私にはわからない。
  64ビットOS上でビルドするなら、プラットフォームをAnyCPUからx86に変える必要がある。
  Core Audio はどうか。


mikeo_410@hotmail.com