Welcome to MSDN Blogs Sign in | Join | Help

Windows Multimedia Hacks

マイクロソフト株式会社の Multimedia サポートチームの blog です。
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 は非常に簡単にコーディングできますので、ぜひ試してみてくださいね。

Posted: Saturday, September 19, 2009 10:34 PM by JPDSMM

Comments

No Comments

Leave a Comment

(required) 

(required) 

(optional)

(required) 

  
Enter Code Here: Required

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Page view tracker