Expression Encoder SDKを触ってみる その2

chakemiです。本日で、年内の仕事納めだったため、軽く納会を行ないました。 本日は、引き続きExpressionEncoderSDKを触ってみようと思います。

まずはExpressionEncoderの基本的な部分についてですが、 ExpressionEncoderでは、ジョブと呼ばれるエンコードセッションを作成しソースビデオのインポートをします。

一つのジョブには任意の数のビデオをインポートする事が可能です。

インポートが完了したらこれらのビデオに対してトリミングやカット、オーディオのボリューム変更などの処理を行ないます。

必要な変更を行ったらジョブ内の各クリップに対し、プロファイルと呼ばれるエンコードオプションを設定します。

プロファイルは、ビットレート、ビデオサイズ、コーデックなどの様々な設定で構成されています。

最後に出力方法を選択してエンコードとなりますが、この出力方法はsliverlightテンプレートを使用する方法と使用しない方法があります。また、テンプレートを使用しないで.wmvファイル、.wmaファイルを作成することも出来ます。 ここでは主に、WindowsMediaEncoderの代替としてExpressionEncoderを利用しようと考えているので、主に.wmvへ出力を基本として触れていこうと思ってます。ExpressionEncoder4Proを買う予算も無いですし。。。

ExpressionEncoderの基本的な使い方も理解できたとこで、前回(前々回か)のソースを見てみます。 まず、MediaItemインスタンスを生成してビデオソースを登録します。

1
MediaItem mediaItem = new MediaItem(@"C:\ruby.avi");

Jobインスタンスを生成し、作成したMediaItemオブジェクトをjob.MediaItemsプロパティへ追加します。

1
2
Job job = new Job();
job.MediaItems.Add(mediaItem);

出力先を指定して、エンコードを実行。

1
2
3
4
5
6
job.OutputDirectory = @"C:\videoOutput";

Console.WriteLine("Encoding…c");
job.Encode();
Console.WriteLine("Finished encoding.");
job.Dispose();

今回は、エンコードの際にプロファイルを指定してエンコードを実行してみようと思います。

プロファイルを設定するには、簡単な方法としてjob.ApplyPresetメソッドを使用してプリセットを利用する方法があります。 引数に、Presetsクラスのメンバー、もしくはプリセットとして保存したファイル名を指定することが出来ます。 Presetsクラスには、ExpressionEncoderのプリセットに定義されている様々なプロファイルが用意されています。

せっかくなので、自分で作成したプロファイルをプリセットとして保存して使用してみたいと思います。 ExpressionEncoderアプリケーションのエンコードタブから独自の設定を行い、歯車マークのボタンをクリックし「パネルをプリセットとして保存」を選択、xmlファイルを保存します。

試しに作成したものがこんな感じ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?xml version="1.0" encoding="utf-16"?>
<!--Created with Expression Encoder version 4.0.1651.0-->
<Preset
  Version="4.0">
  <Job />
  <MediaFile
    WindowsMediaProfileLanguage="ja-JP"
    VideoResizeMode="Letterbox">
    <OutputFormat>
      <WindowsMediaOutputFormat>
        <AudioProfile>
          <WmaAudioProfile
            Codec="Wma"
            Channels="2"
            BitsPerSample="16"
            SamplesPerSecond="44100">
            <Bitrate>
              <ConstantBitrate
                Bitrate="64"
                IsTwoPass="False"
                BufferWindow="00:00:00" />
            </Bitrate>
          </WmaAudioProfile>
        </AudioProfile>
        <VideoProfile>
          <MainVC1VideoProfile
            DifferentialQuantization="Off"
            InLoopFilter="True"
            MotionSearchRange="MacroblockAdaptive"
            BFrameCount="1"
            SmoothStreaming="False"
            AdaptiveDeadZone="Conservative"
            AdaptiveGop="True"
            ClosedGop="True"
            DenoiseFilter="False"
            KeyFrameDistance="00:00:05"
            MotionChromaSearch="LumaOnly"
            MotionMatchMethod="SAD"
            NoiseEdgeRemovalFilter="False"
            OverlapSmoothingFilter="True"
            MotionVectorCost="Static"
            Complexity="Normal"
            AutoFit="True"
            Force16Pixels="False"
            FrameRate="0"
            SeparateFilesPerStream="False"
            NumberOfEncoderThreads="0">
            <Streams
              AutoSize="False"
              FreezeSort="False">
              <StreamInfo
                Size="512, 384">
                <Bitrate>
                  <ConstantBitrate
                    Bitrate="505"
                    IsTwoPass="False"
                    BufferWindow="00:00:05" />
                </Bitrate>
              </StreamInfo>
            </Streams>
          </MainVC1VideoProfile>
        </VideoProfile>
      </WindowsMediaOutputFormat>
    </OutputFormat>
  </MediaFile>
</Preset>

※ここでは、プリセットの細かい点に関しては触れません。

では、試しに作成したプリセットを指定してエンコードを行なってみたいと思います。 作成した.xmlファイルは実行ファイルと同一フォルダに保存してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Expression.Encoder;

namespace ConsoleApplication1
{
    class Program
    {


        static void Main(string[] args)
        {
            MediaItem mediaItem = new MediaItem(@"C:\ruby.avi");

            //jobの生成
            Job job = new Job();
            job.MediaItems.Add(mediaItem);

            //プリセット適用
            job.ApplyPreset("codelife.xml");

            //出力先
            job.OutputDirectory = @"C:\videoOutput";

            job.EncodeProgress += new EventHandler<EncodeProgressEventArgs>(OnProgress);

            //エンコード
            Console.WriteLine("Encoding…c");
            job.Encode();
            Console.WriteLine("Finished encoding.");
            job.Dispose();
        }

        static void OnProgress(object sender, EncodeProgressEventArgs e)
        {
            Console.Write("\b\b\b\b\b\b\b");
            Console.Write("{0:F2}%", e.Progress);
        }

    }
}

プリセットに設定した通りにエンコード出来ました。

今回は、EncodeProgressイベントハンドラを登録してエンコード進捗を表示するようにしました。(サンプルのまんまですが。。。)

Comments