[C#]Microsoft Expression Encoderを使用して簡易画面キャプチャソフトを作る、その3。

Microsoft Expression Encoderを使用したキャプチャソフト続き。

もうやめるといいつつ、改良を加えてみた。改良点は2つ。
・キャプチャ時の画面の大きさをエンコード後も維持させる。
・録音デバイスの自動選択設定。

キャプチャ時の画面の大きさを維持
これは、エンコード時に画面の大きさを指定してしないと出力サイズがキャプチャ時のサイズよりも小さくなるという問題。
このキャプチャソフトはテンポラリに作成されたファイルを連結して一つのファイルとしてWMVファイルをエンコードして生成するので、その時にパラメータを指定してあげれば良い。
具体的にはMediaItemインスタンスのOutputFormat.VideoProfile.Sizeプロパティにサイズを指定する。

エンコード箇所ソース(一部割愛)

//// 対象ファイルのパスを取得(ファイル名は昇順になる辞書順)
var files = System.IO.Directory.GetFiles(_dir);

//// MediaItemインスタンスを作成
MediaItem item = new MediaItem(files.First());

//// 後のファイルをAddする
foreach (var file in files.Skip(1))
{
   item.Sources.Add(new Source(file));
}

//// オリジナルのサイズを維持
item.OutputFormat.VideoProfile.Size = new System.Drawing.Size(item.CropRect.Width, item.CropRect.Height);

//// エンコードJOBの作成
var job = new Job();
job.MediaItems.Add(item);

//// エンコードの開始
job.Encode();
job.Dispose();

録音デバイスの自動選択設定
これは動画の録画開始時に音声デバイスを自動で選択する機能。普段は普通のスピーカーをデフォルトの音声デバイスとして使用しているのだけれど、一時的にHDMIモニタなどを使用し、キャプチャを実行した時に、録音を行う音声デバイスを自動的に選択(HDMIモニタがプライマリのときはHDMIから音声を録音)するよう改良するというもの。

WMI(Windows Management Instrumentation)を使用して取得できると思ったらデバイス情報しか見えてこなかったので、以前使用したCoreAudioAPIを使用することに。

Vista Core Audio API Master Volume Control
http://www.codeproject.com/Articles/18520/Vista-Core-Audio-API-Master-Volume-Control

CoreAudioAPIのページの最初に記述されているGetDefaultAudioEndpoint()を使用してデフォルトの音声デバイスを取得し、IDプロパティがデバイスパスになるようなので、これを利用し元からあるソースを改修。思ったよりも楽にできた。
音声デバイスを取得する関数

        /// <summary>
        /// オーディオデバイスを取得する
        /// </summary>
        /// <returns></returns>
        private void GetAuidoDevice()
        {
            if (_audioDevice == null)
            {
                /// デバイスの一覧を取得
                var devs = Microsoft.Expression.Encoder.Devices.EncoderDevices.FindDevices(Microsoft.Expression.Encoder.Devices.EncoderDeviceType.Audio);
                
                /// CoreAudioAPIを使用してデフォルトのデバイスを取得
                var devEnum = (new CoreAudioApi.MMDeviceEnumerator()).GetDefaultAudioEndpoint(CoreAudioApi.EDataFlow.eRender, CoreAudioApi.ERole.eMultimedia);

                /// デバイスパスを参照してデフォルトデバイスを取得
                var defDevice = devs.Where(p => p.DevicePath == devEnum.ID);

                if (defDevice.Any())
                {
                    _audioDevice = defDevice.First();
                }
            }
        }

GetAuidoDevice関数はキャプチャ開始時に呼ばれる関数なので音声デバイスは常に音がでるものが選ばれるようになる。

尚、設定画面から音声デバイスの設定項目を外した。
Img20130203183713

今回作成したソースはこちら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


This blog is kept spam free by WP-SpamFree.