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 は非常に簡単にコーディングできますので、ぜひ試してみてくださいね。