Expression Encoder 3 SDK でエンコード (H.264+AAC in MP4)

こんにちは。わび~です。

今日は Expression Encoder 3 SDK の入門編その2です。

ファイル input.mp4 を読み込んで、output.mp4 にエンコードする C# のサンプルコードです。

入力は Expression Encoder 3 が対応しているものはすべて OK です。

出力はファイルコンテナが MP4、ビデオが H.264 (Baseline プロファイル, 768Kbps, 320x240, 30fps) で、オーディオが AAC (128Kbps, 2ch, 44.1KHz) です。サムネイルも作成します(JPEG 160x120)。

ものすごく具体的に言いますと、現行Walkman 用の設定です。

百聞は一見にしかず、ということでサンプルコードをご覧ください。一部に雑な部分がありますが、そこはツッコミ禁止でお願いいたします。動作には Expression Encoder 3 (有償版)が必要です。

 
 

    1 using System;

    2 using System.Drawing;

    3 using Microsoft.Expression.Encoder;

    4 using Microsoft.Expression.Encoder.Profiles;

    5 

    6 namespace Sample

    7 {

    8     class
Program

    9     {

   10         static
void Main(string[] args)

   11         {

   12             Sample.MyEncoder enc = new Sample.MyEncoder();

   13             enc.doEncode(args);

   14         }

   15     }

   16     class
MyEncoder

   17     {

   18         private
DateTime dtStart;   // 進捗状況の表示用に開始時刻を覚えておく変数。

   19 

   20         public
void doEncode(string[] args)

   21         {

   22             // 入力ファイルを設定する。

   23             string srcfilepath = @"input.mp4";

   24             MediaItem mediaItem = new
MediaItem(srcfilepath);

   25 

   26             // ビデオ出力フォーマットを設定する。(H.264ビデオ)

   27             mediaItem.OutputFormat = new
MP4OutputFormat();

   28             mediaItem.OutputFormat.VideoProfile = new
BaselineH264VideoProfile()

   29             {

   30                 Bitrate = new
ConstantBitrate(768), // Kbps単位

   31                 FrameRate = 30,

   32                 AutoFit = true,                 // アスペクト比を維持する。

   33                 Size = new
Size(320, 240),      // ビデオフレームのサイズ 320x240

   34             };

   35             // オーディオ出力フォーマットを設定する。(AACオーディオ)

   36             mediaItem.OutputFormat.AudioProfile = new
AacAudioProfile()

   37             {

   38                 Bitrate = new
ConstantBitrate(128),

   39                 SamplesPerSecond = 44100,

   40                 Channels = 2,

   41             };

   42 

   43             // サムネイル(JPEG)を 00:00:32 の位置の画像で作る。

   44             mediaItem.ThumbnailMode = ThumbnailMode.Custom;

   45             mediaItem.ThumbnailTime = new
TimeSpan(0,0,32); // 時刻 00:00:32

   46             mediaItem.ThumbnailSize = new
Size(160, 120);   // サムネイル画像のサイズ 160x120 ピクセル

   47 

   48             //ジョブを作る。

   49             Job = new
Job();

   50             job.MediaItems.Add(mediaItem);

   51 

   52 

   53             //出力フォルダ、ファイル名を設定する。

   54             job.OutputDirectory = System.IO.Directory.GetCurrentDirectory();

   55             job.CreateSubfolder = false;

   56             job.DefaultMediaOutputFileName = @"output.mp4";

   57 

   58             //進捗状況を表示するためのイベントコールバックを登録する。

   59             job.EncodeProgress

   60                 += new
EventHandler<EncodeProgressEventArgs>(OnProgress);

   61 

   62             //エンコードを開始する。

   63             dtStart = DateTime.Now;

   64             job.Encode();

   65         }

   66 

   67         // 進捗状況を表示するためのイベントコールバック。

   68         public
void OnProgress(object sender,

   69             EncodeProgressEventArgs e)

   70         {

   71             TimeSpan ts;

   72             DateTime dtNow = DateTime.Now;

   73             ts = dtNow - dtStart;

   74             try

   75             {

   76                 Console.Write("進捗 " + String.Format("{0,5:F1}", e.Progress) + "% / ");

   77                 Console.Write("経過 " + ts.ToString().Remove(8) + " / ");

   78 

   79                 TimeSpan tsTotal = new
TimeSpan(0, 0, (int)(ts.TotalSeconds * (100.0 / e.Progress)));

   80                 Console.Write("総計 " + tsTotal.ToString() + " / ");

   81                 TimeSpan tsRemain = new
TimeSpan(0, 0, (int)((tsTotal - ts).TotalSeconds));

   82                 Console.Write("残り " + tsRemain.ToString());

   83                 Console.Write("\r");

   84             }

   85             catch (Exception err)

   86             {

   87                 Console.WriteLine(err.GetType().FullName);

   88             }

   89         }

   90 

   91     }

 
 

 ただ、このままですと、サムネイルのファイル名が output _Thumb.jpg となってしまうので、Walkman のように output.jpg でないと困る場合には、エンコード後にリネームすることでカバーする必要があります。これは既に修正を要求しましたので、次期バージョンの Expression Encoder で修正予定です。

このように Expression Encoder 3 SDK は非常に簡単にコーディングできますので、ぜひ試してみてくださいね。