Welcome to MSDN Blogs Sign in | Join | Help

Windows Multimedia Hacks

マイクロソフト株式会社の Multimedia サポートチームの blog です。
楽しいハック講座(3) マルチメディア タイマー その 2

こんにちははらだんです。今回は以前予告した timeSetEvent API の動作をハックしていきます。(注:クラックではありません)

 

今回紹介する内容は、弊社から無償で公開されているデバッグ専用のツール Debugging Tools for Windows に同梱されているデバッガ (windbg) と公開デバッグ シンボルを使えば誰でも確認することができます。

 

調査する内容の概要は以下になります。詳細については以前の記事「timeSetEvent の制限事項と不具合について」を読んでいただけたらと思います。

 

お題:

Windows XP timeSetEven() uDelay 429,497 ms 以上かつ TIME_PERIODIC を指定して呼ぶと期待する時間が経過する遥か前にイベントが発火する。Windows Vista/Windows 7 ではこの現象は起きていない。この現象についてデバッグを行い動作を確認する。

 

詳細は以前の記事に譲るとして、このお題について以下の 4 点を確認します。

A. uDelay の上限が 1000 秒であることを実装から確認する

B. Windows XP では 429496 ミリ秒を超えるとオーバーフローすることを確認する

C. TIME_ONESHOT の場合なぜ B. の現象は再現しないかを確認する

D. Windows Vista ではこれが発生しないことを実装から確認する

 

こちらが本日の実験用のプログラムです。

#include "windows.h"
#include "mmsystem.h"
#pragma comment(lib, "winmm.lib")

void CALLBACK TimerCallback(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
 std::cout << "timer" << std::endl;
 return;
}
int _tmain(int argc, _TCHAR* argv[])
{
 timeSetEvent(429497, 0, TimerCallback, 1, TIME_PERIODIC);
 timeSetEvent(429497, 0, TimerCallback, 2, TIME_ONESHOT);

 return 0;
}

オーバーフローする uDelay 値を設定し、TIME_PRIODIC/TIME_ONESHOT での動作を確認する。

 

プログラムの実行ファイルの名称は Hack_timeSetEvent.exe としました。

早速このプログラムを Windows XP SP2/SP3 Windows Vista SP1/SP2 環境でデバッグしてみましょう。

 

※今回は Windbg の使い方は申し訳ございませんが省略させていただきました。別の機会で紹介させていただきます。

 

A. uDelay の上限が 1000 秒であることを実装から確認する

これは関数を追っていくとすぐにわかりますので手始めにここから確認して行きます。

 

(1) timeSetEvent 関数:引数 fuEvent のチェックをして Internal 関数を呼ぶ

Windbg [File]-[Open Executable] を選択し、プログラムを指定します。その後以下のブレーク ポイントを設定しプログラムを実行します。

 

0:000> bp WINMM!timeSetEvent
0:000> g

 

すぐに timeSetEvent 関数でブレークします。この関数は第 5 引数の fuEvent フラグのバリデーションを行うだけで、すぐに timeSetEventInternal と呼ばれる関数を呼び出します。u コマンドで timeSetEvent のディスアセンブラ コードを見ると以下のように引数をそのまま渡しています。このような呼び出しパターンは実は API にはよくあります。実装は timeSetEvent にはないので timeSetEventInternal に進みます。

 

76b0b0dc ff7518          push    dword ptr [ebp+18h]
76b0b0df ff7514          push    dword ptr [ebp+14h]
76b0b0e2 ff7510          push    dword ptr [ebp+10h]
76b0b0e5 ff750c          push    dword ptr [ebp+0Ch]
76b0b0e8 ff7508          push    dword ptr [ebp+8]     <=== uDelay

76b0b0eb e8f8feffff      call    WINMM!timeSetEventInternal (76b0afe8)

ebp+8 ebp+18h は今見ている関数の引数です。この辺のお約束については当 Blog ではこれまで紹介したことがありませんでした。参考になる書籍もありますので、次回ご紹介します。

 

(2) timeSetEventInternal 関数:1000 秒の上限処理

timeSetEvent から呼び出された timeSetEventInternal 関数のディスアセンブラ コードを見ていきます。この関数の先頭で早速 uDelay が上限 1000 秒(=1,000,000 ミリ秒)を超えていないかチェックし、超えている場合にはタイマー イベントは作成せずに終了します。

 

0:000> u
WINMM!timeSetEventInternal:
76b0afe8 8bff            mov     edi,edi   //
関数のエントリ ポイントのお約束
76b0afea 55              push    ebp      
//スタック ベース ポインタの保存
76b0afeb 8bec            mov     ebp,esp  
//現在のスタックのトップをスタック ベースにする
76b0afed 83ec30          sub     esp,30h  
//ローカル変数として 30h バイト確保
76b0aff0 53              push    ebx
76b0aff1 8b5d08          mov     ebx,dword ptr [ebp+8]  
<=== uDelay の読み込み
76b0aff4 81fb40420f00    cmp     ebx,0F4240h 
<=== 0F4240h = 1000000 ミリ秒と比較
76b0affa 56              push    esi
76b0affb 57              push    edi          
↓超えている場合ジャンプ
76b0affc 0f8794000000    ja      WINMM!timeSetEventInternal+0xae (76b0b096)
 ジャンプ先(76b0b096)ではタイマー イベントを作成せずに終了しています。

 

この確認で timeSetEvent のタイマー遅延時間 uDelay の上限は 1000 ms とわかりました。

 

B. Windows XP では 429496 ミリ秒を超えるとオーバーフローすることを確認する

次はオーバーフローする犯行現場を押さえます。デバッガで追いかけていくだけですが、現場にたどり着くまで uDelay がどのように関数に渡されていくか、どのレジスタに読み込まれているか、常にチェックしていきます。

 

(1) timeSetTimerEvent 関数:オーバーフローの犯行現場

3 分クッキングのように先に進んでいきます。次はオーバーフローする瞬間を捕まえます。先ほどのデバッグの続きで、 timeSetEventInternal 関数を p t コマンドを使って進めていくと、timeThreadSetEvent と呼ばれる関数が呼ばれ、さらにその関数内から timeSetTimerEvent と呼ばれる関数が呼ばれます。

 

timeSetTimerEvent が呼ばれたところでのコールスタックです。

timeSetTimerEvent が呼ばれたところでのコールスタックです。
0:000> knL
 # ChildEBP RetAddr 
00 0012fee4 76b0ad0e WINMM!
timeSetTimerEvent

01 0012fef8 76b0b0a8 WINMM!
timeThreadSetEvent+0x80
02 0012ff40 76b0b0f0 WINMM!timeSetEventInternal+0xc0
03 0012ff60 0040103b WINMM!timeSetEvent+0x28  <=
アプリからの API 呼び出しはここ
04 0012ff7c 004011de Hack_timeSetEvent!wmain+0x2b
05 0012ffc0 7c816fd7 Hack_timeSetEvent!__tmainCRTStartup+0x10f
06 0012fff0 00000000 kernel32!BaseProcessStart+0x23

 

timeSetTimerEvent のディスアセンブラ コードを見てます。

0:000> u
WINMM!timeSetTimerEvent:
76b0abda 8bff            mov     edi,edi
76b0abdc 55              push    ebp
76b0abdd 8bec            mov     ebp,esp  //
ここまではさっきと同じお約束の動作
76b0abdf 51              push    ecx
76b0abe0 51              push    ecx
76b0abe1 56              push    esi
76b0abe2 8b7508          mov     esi,dword ptr [ebp+8]
76b0abe5 8b06            mov     eax,dword ptr [esi]  
<=== uDelay
76b0abe7 8b5620          mov     edx,dword ptr [esi+20h]
76b0abea 69c010270000    imul    eax,eax,2710h
<=== eax = eax * 10000

 

このいちばん最後の処理ですが、 timeSetEvent で設定した uDelay 10000 を掛けています。

10000 倍することが何を意味しているのかですが、これはミリ秒から100ナノ秒の単位に変換しているところです。しかしこの 3 オペランドを取る掛け算命令は残念なことに 64-bit の結果を返しません。imul eax,ecx などの命令であれば edx:eax 64-bit に結果が返る計算ができるのですがそうなっていません。

 

0:000> ? 0x00068db9 * 0x2710
Evaluate expression: 4294970000 = 00000001`00000a90

 

計算するとこのように 33bit 目に繰り上がりが発生し、 32bit の eax レジスタでは桁あふれが発生します。

 

p コマンドでステップ実行していくと以下のようにその瞬間を捕らえられます。

0:000> p
eax=00068db9
ebx=76b10200 ecx=00000020 edx=9267821e esi=76b11760 edi=00000001
eip=76b0abea esp=0012fed8 ebp=0012fee4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
WINMM!timeSetTimerEvent+0x10:
76b0abea 69c010270000  
 imul    eax,eax,2710h

0:000> p
eax=00000a90 ebx=76b10200 ecx=00000020 edx=9267821e esi=76b11760 edi=00000001
eip=76b0abf0 esp=0012fed8 ebp=0012fee4 iopl=0         ov up ei pl zr na pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000a47
WINMM!timeSetTimerEvent+0x16:
76b0abf0 33c9            xor     ecx,ecx

この計算結果がそのまま使われてタイマー イベントが作成されてしまいます。

 

この確認で Windows XP timeSetEvent には 429497 ms の上限があることがわかりました。

しかし TIME_ONESHOT 動作の時にはこの現象は発生しないことが確認できています。

 

C. TIME_ONESHOT の場合なぜ B. の現象は再現しないかを確認する

ここまでの処理で TIME_ONESHOT TIME_PERIODIC の動作に差はありません。したがってこの後追跡していくと TIME_ONESHOT の時だけミリ秒の値を使う、または 64-bit で再度計算しなおしているところがあるはずです。続きのディスアセンブラ コードを確認します。

 

(1) TIME_ONESHOT の時にだけ実行されるコードを確認する。

 

0:000> u
WINMM!timeSetTimerEvent+0xd:
76b0abe7 8b5620          mov     edx,dword ptr [esi+20h]
76b0abea 69c010270000    imul    eax,eax,2710h  <===
犯行現場
76b0abf0 33c9            xor     ecx,ecx
76b0abf2 57              push    edi
76b0abf3 8b7e24          mov     edi,dword ptr [esi+24h]
76b0abf6 03c2            add     eax,edx
76b0abf8 13cf            adc     ecx,edi
76b0abfa 894620          mov     dword ptr [esi+20h],eax
0:000> u
WINMM!timeSetTimerEvent+0x23:
76b0abfd 894e24          mov     dword ptr [esi+24h],ecx
76b0ac00 33ff            xor     edi,edi
76b0ac02 f6461401        test    byte ptr [esi+14h],1
76b0ac06 7413            je      WINMM!timeSetTimerEvent+0x41 (76b0ac1b)

76b0ac08 53              push    ebx
76b0ac09 e8037ffeff      call    WINMM!soundPlay+0x3e (76af2b11)
76b0ac0e 8b4e20          mov     ecx,dword ptr [esi+20h]
76b0ac11 8b5e24          mov     ebx,dword ptr [esi+24h]
0:000> u
WINMM!timeSetTimerEvent+0x3a:
76b0ac14 2bc1            sub     eax,ecx
76b0ac16 1bd3            sbb     edx,ebx
76b0ac18 5b              pop     ebx
76b0ac19 eb0f            jmp     WINMM!timeSetTimerEvent+0x50 (76b0ac2a)

76b0ac1b 6aff            push    0FFFFFFFFh   <=TIME_ONESHOT の場合ここに飛ぶ
76b0ac1d 68f0d8ffff      push    0FFFFD8F0h = -10000
です。
76b0ac22 57              push    edi
76b0ac23 ff36            push    dword ptr [esi]
0:000> u
WINMM!timeSetTimerEvent+0x4b:
76b0ac25 e8bc02ffff      call    WINMM!_allmul (76afaee6)
76b0ac2a 3bd7            cmp     edx,edi

76b0ac2c 7c0e            jl      WINMM!timeSetTimerEvent+0x62 (76b0ac3c)
76b0ac2e 7f04            jg      WINMM!timeSetTimerEvent+0x5a (76b0ac34)
76b0ac30 3bc7            cmp     eax,edi
76b0ac32 7608            jbe     WINMM!timeSetTimerEvent+0x62 (76b0ac3c)
76b0ac34 897df8          mov     dword ptr [ebp-8],edi
76b0ac37 897dfc          mov     dword ptr [ebp-4],edi

0:000> p
eax=e3c3fcac ebx=76b10200 ecx=00000000 edx=e3c3f21c esi=
76b11790 edi=00000000
eip=76b0ac02 esp=0012fdf4 ebp=0012fe04 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
WINMM!timeSetTimerEvent+0x28:
76b0ac02 f6461401        test    byte ptr [esi+14h],1       ds:0023:76b117a4=00
0:000> dd esi
76b11790  00068db9 00000001 0041111d 00000002
76b117a0  00000031
00000000 00000798 00000c28

 

最初の緑のコードに注目します。test  命令により 1 と比較しているところは今回の呼び出しが TIME_ONESHOT(=1) かどうかをチェックしているところです。TIME_PERIODIC 指定の場合にはオレンジのコードが実行されたのちにピンクのコード以降にジャンプします。TIME_ONESHOT の場合にのみ実行される2番目の緑のコードを見てみます。_allmul という関数を呼ぶためにスタックに引数を保存しています。

 

 

(2) _allmul 関数:64-bit の掛け算

_allmul 関数内に入って動作をトレースすると以下のように uDelay の再計算を行っていました。

0:000> p
eax=00068db9 ebx=fff97247 ecx=ffffd8f0
edx=00068db8 esi=76b11790 edi=00000000
eip=76afaf12 esp=0012fddc ebp=0012fe04 iopl=0         nv up ei ng nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000286
WINMM!_allmul+0x2c:
76afaf12 f7e1            mul     eax,ecx 
429497 * (-10000)

0:000> p
eax=fffff570 ebx=fff97247 ecx=ffffd8f0 edx=00068db7 esi=76b11790 edi=00000000
eip=76afaf14 esp=0012fddc ebp=0012fe04 iopl=0         ov up ei ng nz na po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000a83
WINMM!_allmul+0x2e:
76afaf14 03d3            add     edx,ebx
0:000> p
eax=
fffff570 ebx=fff97247 ecx=ffffd8f0 edx=fffffffe esi=76b11790 edi=00000000
eip=76afaf16 esp=0012fddc ebp=0012fe04 iopl=0         nv up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000282
WINMM!_allmul+0x30:
76afaf16 5b              pop     ebx
0:000> p
eax=fffff570 ebx=76b10200 ecx=ffffd8f0 edx=fffffffe
esi=76b11790 edi=00000000
eip=76afaf17 esp=0012fde0 ebp=0012fe04 iopl=0         nv up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000282
WINMM!_allmul+0x31:
76afaf17 c21000          ret     10h

0:000> ? fffffffefffff570
Evaluate expression: -
4294970000 = fffffffe`fffff570

 

符号が逆なのはこの後の処理の都合ですが、この計算結果を使ってタイマー イベントが作成されます。この後 NtSetTimer 関数が呼ばれカーネル モードで処理されていきます。これについては機会があったらやってみたいと思います。

 

TIME_PERIODIC TIME_ONESHOT では計算過程が異り、 TIME_ONESHOT では 64-bit で計算されていることがわかりました。

 

D. Windows Vista ではこれが発生しないことを実装から確認する

最後に Windows Vista の方での実装を確認してみます。

 

(1) timeSetTimerEvent 関数:オーバーフローしない

 

0:000> u
WINMM!timeSetTimerEvent:
745744ca 8bff            mov     edi,edi
745744cc 55              push    ebp
745744cd 8bec            mov     ebp,esp
745744cf 51              push    ecx
745744d0 51              push    ecx
745744d1 56              push    esi
745744d2 8b7508          mov     esi,dword ptr [ebp+8]
745744d5 8b06            mov     eax,dword ptr [esi]
0:000> u
WINMM!timeSetTimerEvent+0xd:
745744d7 b910270000      mov     ecx,2710h

745744dc f7e1           
mul     eax,ecx
745744de 014620          add     dword ptr [esi+20h],eax
745744e1 57              push    edi
745744e2 115624          adc     dword ptr [esi+24h],edx
745744e5 8b4614          mov     eax,dword ptr [esi+14h]
745744e8 33ff            xor     edi,edi
745744ea a801            test    al,1
 

Windows XP とあまり変らないように見えますが、実際に動かしてみると違いがわかると思います。

 

0:000> p
eax=74597f00 ebx=74597d80 ecx=00000020 edx=00000000 esi=74597f00 edi=00000001
eip=745744d5 esp=0028fdbc ebp=0028fdc8 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
WINMM!timeSetTimerEvent+0xb:
745744d5 8b06            mov     eax,dword ptr [esi]  ds:0023:74597f00=00068db9
0:000> p
eax=00068db9 ebx=74597d80 ecx=00000020 edx=00000000 esi=74597f00 edi=00000001
eip=745744d7 esp=0028fdbc ebp=0028fdc8 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
WINMM!timeSetTimerEvent+0xd:
745744d7 b910270000      mov     ecx,2710h
0:000> p
eax=00068db9 ebx=74597d80 ecx=00002710 edx=00000000 esi=74597f00 edi=00000001
eip=745744dc esp=0028fdbc ebp=0028fdc8 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
WINMM!timeSetTimerEvent+0x12:
745744dc f7e1            mul     eax,ecx  429497 * 10000 => edx:eax

0:000> p
eax=00000a90 ebx=74597d80 ecx=00002710 edx=00000001 esi=74597f00 edi=00000001
eip=745744de esp=0028fdbc ebp=0028fdc8 iopl=0         ov up ei pl nz na pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000a07
WINMM!timeSetTimerEvent+0x14:
745744de 014620          add     dword ptr [esi+20h],eax ds:0023:74597f20=eb354f11

0:000> ? 00068db9 *00002710
Evaluate expression: 4294970000 = 00000001`00000a90

こちらは最初から 64-bit で計算を行っているために XP のようなオーバーフローは発生しません。

 

A. から D. までの 4 点について実装と動作を確認することができました。

 

今回のは鍵になる値が即値としてそのままコーディングされていたり、オーバーフローする部分が典型的な imul/mul の計算結果によるものでしたので比較的確認が容易だったと思います。シンボルも公開デバッグ シンボルで十分わかる内容でした。

 

もう少し詳細に timeSetEvent の呼び出しから関連する引数についてはすべてどのレジスタに入ったのか、何番目の引数に入れ直されて別の関数が呼ばれたのか、構造体らしいものに保存された場所など逐一解説したかったのですが、記事が非常に長くなるので省略させていただきました。

 

私たちは仕事でこのようなことを毎日やっております。また、私たちサポート エンジニアが Debugging Tools for Windows をどのように使っているかご紹介できたかなと思います。

 

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

Win7 のコーデック速報(デコーダ)

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

Win7 製品版に同梱されるコーデックについて早速お問い合わせが増えています。

一番ホットな話題は H.264, AAC, AC3 ですので、このあたりをまとめて表にしました。

ここでは再生に必要となるデコーダを取り上げています。

 

Video

Audio

MPEG2

H.264

AAC

AC3

Media Foundation

No

Yes 

Yes 

No 

DirectShow

Yes(注1)

Yes(注1)

Yes

Yes(注1)(注2)

(注1)Starter, Home Basic, サーバ SKU を除きます。

(注2)大人の事情により、サードパーティ製品からはAC3デコーダを利用いただけません。

これらのデコーダはDXVA に対応していますので、DXVA対応ハードウェアが利用可能な場合には、GPUでデインターレースや離散コサイン変換するといったハードウェア支援が利用されます。

詳しくは、MSDN ライブラリをご覧ください。

Supported Media Formats in Media Foundation

http://msdn.microsoft.com/en-us/library/dd757927(VS.85).aspx

Microsoft MPEG-2 Video Decoder (DirectShow)

http://msdn.microsoft.com/en-us/library/dd390679(VS.85).aspx

Microsoft MPEG-1/DD/AAC Audio Decoder (DirectShow)

http://msdn.microsoft.com/en-us/library/dd390676(VS.85).aspx

面白いところでは、SONY様のWalkman などのポータブルメディアデバイスをWin7 マシンにMTPで接続した場合、エクスプローラ上でデバイスのフォルダを開いてコンテンツをドラッグ&ドロップで放り込みますと、デバイスが対応しているフォーマットに自動変換された上で転送されます(通称シェルトランスコード)。このときMedia Foundation にてハードウェア支援を活用して高速にエンコードされます。とても便利な機能です。従来はWMPで転送するときに限って自動変換されていましたが、エクスプローラでも対応しました。

さて、今回はデコーダを取り上げましたが、次回はエンコーダやファイルコンテナ(マルチプレクサ、デマルチプレクサ)を含めてまとめたいと思います。

SDKのサポート状況

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

DirectX SDK Aug 2009 Update ならびに Windows SDK for Windows7 がリリースされたことに伴い、マルチメディア SDK のサポート状況に多少変化がありましたので、お知らせします。

   

まず、現時点でサポートが終了している SDK は以下の通りです。

  • DirectSound
    • 代替案として、XAudio2 と WASAPI をご紹介しています。
  • DirectDraw
    • 代替案として、Direct3D による2次元座標系への描画をご紹介しています。
  • DirectMusic
    • 代替案として、音声再生用途には XAudio2 と WASAPI、音声合成用途にはサードパーティの VST プラグインなどをご紹介しています。
  • DirectPlay
    • 代替案として、WinSock API や Firewall API をご紹介しています。
  • Managed DirectX
    • 代替案として、 オープンソースの SlimDX をご紹介しています。
  • DirectX8 以前
    • 代替案として、DirectX9 以降をご利用いただいています。

   

最新の SDK に含まれていない API はサポートが終了したとご理解ください。マルチメディアに関連する SDK には以下のものがあります。

  • Windows SDK
    • Windows のリリースに応じてリリースされます。最新版は Windows SDK for Windows7 です。
  • DirectX SDK
    • 一年に数回リリースされます。最新版は DirectX SDK (Aug 2009 Update) です。
  • Expression Encoder SDK
    • Expression Encoder のリリースに応じてリリースされます。最新版は Expression Encoder 3 SDK です。

   

次に、サポート外の使い方(シナリオ)がいくつかあります。

  • サービスアプリケーションで音声を再生する。
    • 代替案として、サービスでないプロセスとの間で通信を行い、そちらのプロセスから再生していただくことをご案内しています。
  • サービスアプリケーション/ASP.NET で DirectX (Direct2D以外) を使用する。
    • 代替案として、デスクトップにアクセス可能なアプリケーションから DirectX をご利用いただくことをご案内しています。Direct2D だけは、ソフトウェアラスタライザを使用する場合にはサービスアプリケーション上での動作もサポートされています。
  • サービスアプリケーション/ASP.NET で Windows Media Encoder SDK を使用する。
    • 代替案として、デスクトップにアクセス可能なアプリケーションから Windows Media Encoder SDKをご利用いただくことをご案内しています。
  • DirectShow を .NET から使用する。
    • 代替案として、サポートされている言語である C++ から利用いただくことをご案内しています。
  • SAPI5.1 エンジンを Windows Vista 以降で使用する。
    • 代替案として、 Windows XP を使用いただくことをご案内しています。
  • Windows 同梱の DirectShow フィルタ、DMO、MFT、ACM の登録を解除する。
    • 代替案として、これらの登録を解除せずにお使いいただくことをご案内しています。
  • サウンドデバイスのないマシンで Windows Media Player (WMP) を使用する。
    • 代替案として、サウンドデバイスのあるマシンをご利用いただくことをご案内しています。(WMPは動作要件としてサウンドデバイスが必須です。)
  • DirectShow で WMV Encoder DMO を利用してインターレースコンテンツをエンコードする。
    • 代替案として、Windows Media Format SDK を使用してエンコードする方法と、プログレッシブにデインターレースしてから WMV Encoder DMO に渡す方法、をご案内しています。
  • Windows XP で WPF 以外から EVR を使用する。
    • 代替案として、VMR の利用をご案内しています。

   

恐れ入りますが、ご理解のほどよろしくお願いいたします。

Expression Encoder 3

こんにちは、はらだんです。気が付いたら夏は終わってしまったようです。
海は!?山は!?な日々です。 MSDN では Windows 7 RTM も既に
公開されており、間もなく発売となる状況で WMP12 や Core Audio API、
Media Foundation、レガシーな Multimedia API などで各種お問い合わせが
来るようになってきた今日この頃です。Windows 7 関連の話題も等 Blog. にて
追々紹介していきたいと思います。

本日は Expression Encoder 3 をご紹介します。

現在すでにダウンロードが可能で試していただくことができます。
3 になって機能は確実に増えてきていますが、はらだん的な目玉機能は
Smooth Streamning のエンコード済みのコンテンツをエンコード ソースとして
利用可能になったこと。Expression Encoder 3 SDK にてライブ エンコードが
利用できることです。
ダウンロード版ではライセンスの都合上 H.264 などが使えなくなりますが、
機能的には製品版とほぼ同等となります。

Windows Media Encoder 9 の置き換えとして使えるかどうかという点で
ようやく機能がそろってきたというところかと思います。

SDK からライブ エンコードが出来るようなのでようやくこれを試すことが出来そうです。

Expression Encoder 3 のダウンロードはここから!

 

プログレッシブ ダウンロード のシークとソース フィルタの関係
 

こんにちは、はらだんです。本日はプログレッシブダウンロードの挙動についてお話しします。

 

Windows Media Service(WMS) によるストリーミングサービスではなく、Web サーバーに動画コンテンツを置き、これを再生する場合、WMP はストリーミングではなく、単純にダウンロードを行いながら再生を行います。

 

この場合コンテンツのビットレートには関係なく、可能な最大の速度でコンテンツを IE のキャッシュにダウンロードしつつ、WMP は先頭から再生を開始いたします。

 

コンテンツの任意の場所からの再生(シーク)、早送り、巻き戻しなどはできないのがプログレッシブダウンロードの特徴で、ストリーミングとの違いです。ただし、コンテンツが完全に IE のキャッシュに入ると、これはローカルコンテンツの再生となるので上記の制限はなくなります。

 

実際に使ってみると Windows XP の WMP ではシークができませんが、Windows Vista / Windows 7 の WMP ではシークが可能です。

 

実はこの違いは WMS が使うコンテンツのソースフィルタが XP と Vista 以降で異なることに起因しています。

 

XP の WMP では Windows Media Format SDK の WM ASF Reader フィルタが使用され、 Vista 以降では Media Foundation (MF) の機能を継承したいわば MF 版非同期ファイルソースフィルタが使用されます。

そしてこの MF 版非同期ファイルソースフィルタにはプログレッシブ ダウンロード時のシーク機能が実装されています。

 

なお、XP でもローカル キャッシュがある場合にはシーク可能です。これはローカル キャッシュから再生する場合には WM ASF Reader ではなく非同期ファイルソースフィルタが使用されるためです。この場合、読み込んでいるのはローカル ディスク上のファイルですので普通にシーク可能です。

 

ソースフィルタの使い分けをご検討の際にはこのような動作の違いがあることをご一考いただければと思います。

 

Tech Ed Japan 2009 始まっています。

こんばんは、はらだんです。

本日は Tech Ed 開催中のご連絡です。
Tech Ed Japan 2009 は有償のコンファレンスで、クローズなイベントとして行われていますが、
今年はなんと基調講演のライブ配信が行われます!

弊社最新製品、テクノロジーが紹介されますのでご覧いただければと思います。
もちろんこのBlogでも何度か紹介している Smooth Streaming にて配信されます!

オフィシャルサイトはこちら=> Tech Ed Japan 2009

はらだんも明日は午前中のみ会場にいる予定です。

KB 紹介 : DirectShow の脆弱性に関するセキュリティ更新プログラム MS09-028
 

こんにちは、はらだんです。今日は先日お伝えしておりましたサポート技術情報 971778 に対応した修正モジュールの公開をお知らせします。(前回の記事

 

971778 QuickTime のデコーダ フィルタの脆弱性の問題でした。今回の修正モジュールはこれに加えて 2 つの脆弱性を修正するものとなります。詳細については以下のセキュリティ情報をご覧ください。

 

マイクロソフトセキュリティ情報 MS09-028 - 緊急

Microsoft DirectShow の脆弱性により、リモートでコードが実行される (971633)

http://www.microsoft.com/japan/technet/security/bulletin/MS09-028.mspx

 

危険レベルは「緊急」となりますので、お手数ではございますが是非インストールして対策をお願いいたします。

timeSetEvent の制限事項と不具合について
 

    こんにちははらだんです。週末は雨というシーズンは終わりかな?という今日この頃です。いやもう終わってますね。週末雨の音を聞きながら部屋でごろごろしているのはわりと好きなのです。湿度が高くて暑いのはいやですが・・。

     

    さて、本日は Multimedia API mmsystem.h/winmm.lib)の timeSetEvent 関数についてのお話です。

     

    お題:timeSetEvent の引数、 uDelay (イベント遅延)の最大値について

     

    Windows XP timeSetEvent() 関数には不具合があります。Windows Vista timeSetEvent() には制限事項があります。

     

     

    Windows XP timeSetEvent() 関数について:

    MSDN timeSetEvent() の記述では「タイマでサポートされるイベント遅延の最小値から最大値までの範囲にない場合、関数はエラーを返します。」とあります。範囲はタイマー デバイスに依存するというわけですが、実際にはソフトウェアつまり API レベルで 1000 秒が最大という制限があります。

     

    しかし、Windows XP ではエラーを返さないにもかかわらず(実際にタイマーが設定されます)設定したイベント遅延よりもはるかに短い時間で発火する現象が発生することがあります。具体的には timeSetEvent の引数で TIME_PERIODIC を指定した場合イベント遅延時間は 429,496 ミリ秒が最大で、それより 1 ミリ秒大きくなるとオーバーフローによりイベント遅延時間が 1 ミリ秒に戻ります。

     

    これは引数で受け取った uDelay (ミリ秒単位)を内部で 100ns (ナノ秒)単位の値として計算する際に 32bit の整数であつかうのが原因です。

     

    429,496 (msec) = 4,294,960,000 (100nsec) = 0xFFFFE380

     

    これに 1 ミリ秒を加算すると

     

    429,497 (msec) = 4,294,970,000 (100nsec) = 0x100000A90

     

    となり、繰り上がってオーバーフローするので実際には 0xA90 (100ns) となってしまいます。

     

    わかりやすくおおむねの数値にすると約 7 9 秒が最大で、7 10 秒はオーバーフローして

    即イベントが発火します。

     

    Windows Vista timeSetEvent() 関数について:

    Windows Vista では実装が変わり、途中の計算で正しく 64bit であつかいます。上限はものすごい時間になるはずですが、実際は先に述べた 1000 秒に制限されます。つまり約 16 40 秒が上限となります。こちらは想定されている実装です。これ以上の時間を指定しようとするとタイマーは設定されません。

     

    その他の OS についてもまとめますと、以下のようになります。

     

    OS

    オーバーフローの発生

    1000 秒の制限

    Windows XP

    あり

    あり

    Windows Server 2003

    あり

    あり

    Windows Vista

    なし

    あり

    Windows Server 2008

    なし

    あり

     

    XP についてはイベントのコールバック関数内で回数をカウントして 5 分のイベントを 3 回数えて 15 分のイベント遅延とするなどの対策が必要となります。ご不便おかけして申し訳ございません。

     

    マルチメディア タイマーについては以下の記事もご参考ください。

    楽しいハック講座(1) マルチメディアタイマー 

     

    次回はこれを実際にデバッガで確認するデバッグ例を紹介したいと思います。

     

     

    ※ 2009 年 9 月 3 日 追記

    本件についてサポート技術情報が公開されましたのでお知らせいたします。

    timeSetEvent マルチメディア タイマーの使用方法

     

     

Smooth Streaming : マイケル・ジャクソンさん追悼の動画配信

こんにちは、はらだんです。 US PT 時間で 7 月 7 日 AM 10 時に IIS Smooth Streaming と Silverlight を使った Michael Jackson さん追悼の動画配信が公開されます。

http://inmusic.ca/news_and_features/michael_jackson_memorial

ロサンゼルスのStaples Centerで行われるそうです。日本で 7 月 8 日夜中の 2 時スタートです。

ご冥福をお祈りいたします。

Expression Encoder 2 SDK で連続エンコード プログラムを作る

    こんにちははらだんです。今日は昨晩遅かったために、起きたのが夕方の15:00でした…。この時間におきると本当に1 日損した気分になりますね。そうも言っていられないので洗濯を 1 回まわして京王線は府中駅まで出かけました。漫画と NHK 英会話のテキスト、ミニ四駆を購入してお茶して帰るのが目的です。

     

    漫画で読破というシリーズを見かけ 3 冊ほど買ってみました。名作と呼ばれる文学を漫画化したシリーズなのだそうです。はらだんはこれまで文学はあまり読んでいないので、原作と比べてどれほど駆け足になっているのか不明なのですが…。それから「暴れん坊少納言」(清少納言、この少女、いとツンデレなり。だそうです)を試しに 1 巻だけ買ってみました。

     

    そうそう、ミニ四駆は ILM チームのぴろとさんと時々遊びに行きます。はらだんは子供のころにミニ四駆で遊んでいないので、こういう世界は知りませんでした。本日は新しくタイガース モデルが発売されていたので買ってきました。同時に発売されたアバンテという車とどっちにするか迷いましたが・・。

     

    前振り長かったのですが、

    本日のお題:

    Expression Encoder 2 SDK を使って指定したフォルダ内のコンテンツを片端からエンコードするコマンドライン エンコーダ プログラム

    を作ってみます。簡単です。

     

    Expression Encoder のオブジェクトについては SDK のヘルプ ファイルがいまいちなので、以前の記事も参考にしてみてください。

    使用している言語は C# です。コマンドライン引数についてはエンコード元のファイルが保存されているフォルダ、エンコード後のファイルを保存するフォルダ、ビデオのビットレートを指定できるようにしてあります。パーサーはいい加減ですので、ちゃんと使ってみたい方はそれなりの実装とエンコード処理部分でもエラー処理を実装して頂けるとぐっと使いやすくなります。(と言って逃げる)

     

    実行方法はコマンド プロンプトから以下のように指定します。

    TestEncoder <ソースフォルダ> <出力フォルダ> [-b <ビットレート>]

     

     

    プログラムの処理

    ~~~~~~~~~~

    指定されたフォルダ内をサブフォルダも含めて巡回し、ファイルをすべて動画もしくは音声ファイルとみなし MediaItem に放り込みます。エラーが出たらそのファイルは「読めないコーデックのコンテンツ」として処理せずに飛ばします。(テキスト ファイルだとしてもお構いなしに MediaItem に放り込みます)

    出力先フォルダは指定してください。すでに同名のファイルが出力フォルダに出来ている場合は上書きされます。

     

    エンコードするコーデックは VC-1 メインプロファイルの CBR です。ソースコードの該当部分を変更すれば他の設定でもエンコードできます。入力は AVI,WMV,MPEG,WMA,WAV 等が使え(コーデックにもよります。)出力は動画は WMV に、音声は WMA になります。

     

     

    エンコード設定のパラメータについて設定範囲等 SDK HELP には書かれていない部分を以下に補足します。(本当に申し訳ない HELP ドキュメントです。)

     

    エンコードパラメータ

    ~~~~~~~~~~~~

    VideoProfile.BufferWindow

     ファイルの再生前にバッファに保存される秒数

     ms (ミリ秒)で設定します。範囲は 100 (0.1) 100000 (100)です。

     

    VideoProfile.Bitrate

     ビットレートの指定 

     4Kbps 20Mbps K(キロ)=1024 計算)の間で指定します。

     

    AudioProfile.Bitrate

     ビットレートの指定 

     4kbps 20Mbps ですが、コーデックの種類と SampleRate に依存したとびとびの値しか指定できません。例えば、5Kbps - 8kHz など。とびとびの値は 5 ,6 ,8, 10, 12, 16, 20, 22, 24, 32, 40, 48, 64, 80, 96, 128, 160, 192 (Kbps)ですが、 K(キロ) = 1000 計算です。具体的には 128Kbps 128*1000 です。128*1024 ではありません。

     

     

    using System;

    using System.IO;

    using Microsoft.Expression.Encoder;

    using Microsoft.Expression.Encoder.Profiles;

     

    namespace TestEncoder2

    {

        class Program

        {

            public static string SrcFolder, DstFolder;

            public static int BitRate=1024*1024; //1Mbps

     

            public static void DoEncode(string SrcFile)

            {

                Job MyJob;

                VideoProfile MyVideoProfile;

                MediaItem MyMediaItem;

     

                MyJob = new Job();

                try

                {

                    MyMediaItem = new MediaItem(SrcFile);

                }

                catch

                {   //コーデック知らないという場合など

                    Console.WriteLine("Error:"+SrcFile);

                    return;

                }

                MyJob.MediaItems.Add(MyMediaItem);

                MyVideoProfile = new VideoProfile();

     

                MyJob.OutputDirectory = DstFolder;  //出力フォルダ設定

                MyJob.CreateSubfolder = false;      //サブフォルダは作成しない

     

                //エンコード設定

                MyVideoProfile.FrameRate = 29.97;

                MyVideoProfile.KeyFrameSpacing = 5;

                MyVideoProfile.CodecProfile = VideoCodecProfile.Main;

                MyVideoProfile.Mode = VideoMode.Cbr;

                MyVideoProfile.BufferWindow = 5000;

                MyVideoProfile.Width = MyMediaItem.VideoProfile.Width;    // Src の Size

                MyVideoProfile.Height = MyMediaItem.VideoProfile.Height;  // Src の Size

                MyVideoProfile.Bitrate = 1024*1024;

                MyMediaItem.VideoProfile = MyVideoProfile;

     

                MyMediaItem.AudioProfile.Bitrate = 128*1000;

                MyMediaItem.AudioProfile.SampleRate = 44100;

     

                //エンコードします

                Console.WriteLine(SrcFile);

                MyJob.Encode();

           }

     

            public static void DirList(string RootDir)

            {

                //フォルダ内のすべてのファイル

                foreach (string file in Directory.GetFiles(RootDir))

                {

                    //Do Encode

                    DoEncode(file);

                }

                //サブフォルダ

                foreach (string folder in Directory.GetDirectories(RootDir))

                {

                    Console.WriteLine(folder);

                    DirList(folder);

                }

            }

     

            static void Main(string[] args)

            {

                //☆☆☆ コマンドライン引数のパーサは省略! ☆☆☆

                if (args.Length > 0)

                {

                    int index;

                    SrcFolder = args[0];

                    if (args.Length > 1)

                    {

                        index = 1;

                        while (index < args.Length)

                        {

                            if (args[index].Equals("-b") || args[index].Equals("-B"))

                            {

                                BitRate = int.Parse(args[index + 1])*1024;

                                            //Kbpsで入力するのでbpsに変換

                                if (BitRate < 4096) BitRate = 4096;

                                if (BitRate > 20 * 1024 * 1024) BitRate = 20 * 1024 * 1024;

                                index += 2;

                            }

                            else

                            {

                                //出力フォルダとみなす

                                DstFolder = args[index];

                                index++;

                            }

                        }

                    }

                    //フォルダ内のファイルを探索し順次エンコード処理を実行する

                    DirList(SrcFolder);

                }

            }

        }

    }

     

    次回はライブ エンコード モードを試したいですね。

KB紹介:WMP DVD再生中にディスプレイケーブルが抜けると落ちる件

こんにちははらだんです。花金(死語?)ということでハミレスやらコンビニ前でだべるなどという学生のようなことを久しぶりにしてしまいました。さて本日もサポート技術情報の紹介です。

 

DVD を再生中にディスプレイケーブルが抜けてしまうと  Windows Media Player(以下 WMP)が不正終了する問題です。(状況によりハングまたは壊れた画像が表示されます)普段ディスプレイケーブルを抜き差しすることは少ないと思いますので、そのようなシナリオはほとんどないかもしれません。

 

例えばノート PC DVD を再生し、それを据え置きの液晶モニタや液晶プロジェクターに一時的に接続して視聴している場合にはありそうです。

 

以下のサポート技術情報にて現象と対処について公開しています。この現象は WMP が正しくディスプレイケーブルの接続状態を監視できていないことが原因となります。現在のところこの問題は修正されていません。大変お手数おかけして申し訳ございませんが、以下の回避策を取って頂くことをおねがいします。ケーブルを再度接続した後に WMP を再起動します。

 

DVD 再生中にディスプレイケーブルが抜けると Windows Media Player が予期しない動作を起こす。

http://support.microsoft.com/kb/970378/ja

 

 

最近家の XBOX360 がただの DVD プレーヤーになっていることに気付いた。はらだんでした。

Windows Server 2008 に Windows Media Player 11 をインストールする方法

こんにちは、はらだんです。今日は Windows Server 2008 での Windows Media Player 11 関連のお話です。

 

ご使用になられた方はすでにお気づきのことと思いますが、Windows Server 2008 には Windows Media Player (以降 WMP )が既定ではインストールされません。

 

WMP がインストールされていないので、コーデックも入っていません。ですので、DirectShow を使用したアプリケーションもこのままでは動作しません。 

 

インストール使用として、Windows Media ホームの Web サイトに行っても WMP11 for Vista の説明と、for Windows XP しかなく、Windows Server 2008 用の WMP はぐぐってもbingっても見つからない状況です。 

 

と言うことで WMP をインストールする方法が分からないという話を時々聞きます。

回答は以下になります。

「機能の追加」でデスクトップエクスペリエンスをインストールする。

 

 

これで終わりただとさみしいので、もう少し追加情報を書きます!

 

Windows Server 2008 では サーバーの脆弱性に関するリスクを低減することを目的として、サーバー用途としては多くの場合必要のないアプリケーション(コンポーネント含む)や使わないサービスはインストールされないようになっています。

 

必要に応じて最低限のアプリケーションとサービスをインストールすることが出来ます。このおかげで CPU /メモリ リソースの効率化とサーバーの堅牢性を向上することができます。さらに使わない機能のためにセキュリティアップデートをするなどの不必要な保守作業を軽減出来ます。

 

通常サーバーで音楽を聞いたり動画を見ることはしないと思います。これが WMP が最初からインストールされていない理由となります。

しかし、Windows Media サービス 2008 を利用する場合、インストールは必須ではありませんが、公開ポイントの動作確認の際にあると便利です。

例えばクライアントに動画配信されない場合のトラブルシュートでは、どこまでコンテンツがストリーミングされているのか?を調べる最初の 1 歩となります。

 

つまり、まずサーバー上の WMP で再生できるかを確認し、次にサーバーと同じネットワーク内、次にルーター越し、とネットワーク上の距離をとって行きながら確認をすることで原因となる箇所を特定する作業が可能となります。

 

このような理由でインストールすることはお勧めではあるのですが、実際、本 Blog でも紹介してますように、Quartz.dll 等に脆弱性が発見されることも事実です。大変恐縮ですがその辺も含めて WMP をインストールするかどうかをご検討いただきたい次第です。

 

 MPEG2 デマルチプレクサがない!?

Windows Server 2008 WMP11 をインストールしても MPEG2 デマルチプレクサは含まれません。

MPEG2 コンテンツをサーバー上で視聴するには別途サードパーティ製のアプリケーション等を

インストールする必要があります。

 

サーバーで生活する以外でこのことが問題になるシナリオとしては、

MPEG2 のソースを WMV にエンコードし直して Windows Media サービスに配信する場合です。

しかし、エンコードはサーバーの負荷にもなり、配信に影響が出る可能性もあるので、別の PC でエンコードして WMS に配信もしくは共有フォルダに保存して頂くことを

お勧めします。

 

特記事項としましては Windows Vista から MPEG2 デマルチプレクサを持ってきて

使用することはライセンス違反となりますのでご注意ください。

 

 

 

それではみなさん、レッツらサーバー生活!(※推奨いたしません)

Windows Media Encoder 9 の Windows 7 サポートについて
こんにちははらだんです。今日は Windows Media Encoder 9 (以降 WME) のサポートについてです。結論をズバリ申し上げますと、WME Windows 7 での動作は保証されず、サポート対象外となります。

 

設計の古いアプリケーションのため、 Windows 7 では動作しないという報告もあります。(はらだんがβで試した際には動きました環境に依存するのかもしれません)現在 WME の新しいリリースはない状況で、これに変わる Windows 7 に対応したエンコーダーは Expression Encoder2 となります。

 

Expression Encoder 2 は有償のアプリケーションとなりますが、評価版がご利用になれます。評価版は 30 日の評価期限が切れた後 Express 版となり機能制限があるものの、継続して利用可能です。

 

WME WMV ファイルへのエンコードを行うアプリケーションではありますが、例えばキャプチャ デバイスから画像を入力し、エンコードしたものを Windows Media サービスに直接ストリーミングするといった動作が可能です。

Expression Encoder2 でもこれは実現できます。ただし XP などから Win7 へのエンコード&配信の環境の移行を考える場合、それまでご利用になられていたキャプチャ デバイスのドライバが Windows 7 に対応していなく、デバイスが使用できないという状況も考えられますので事前に確認されるのがよろしいかと思います。

 

話を WME にもどして、Windows 7 ではなく、Windows Vista で使用する場合には既知の不具合がありまして、以下のサポート技術情報にて修正モジュールの配布を行っています。お手数ですが Vista 環境で使用する場合には修正モジュールを適用してのご利用をおねがいします。

 

Windows Media Encoder 9 シリーズを Vista で使用すると問題が発生する可能性があります。

http://support.microsoft.com/kb/929182

 

 

~~~

先月なのですが、久しぶりにちゃりを買いました。ママチャリではなく、クロスバイクというのだそうですが、これがやたらスピードがでます。ブレーキも半端なく効きます。軽くて重心も高く、オートバイとは全然違うので怖いくらいです。

Windows Media Services 2008 for Windows Server 2008 SP1/SP2
こんにちは、はらだんです。今日はもう 1 件、Windows Media サービス 2008 のアップデートがありましたのでご紹介します。対象の OS が若干異なるために記事を分けました。

こちらの方は Windows Server 2008 SP1/SP2 用の WMS 2008 です。

 

これまでに公開されていたサポート技術情報とその修正モジュールの適用がされたインストール可能な WMS がリリースされました。

キャッシュ プロキシ プラグインの不具合により NAT を介した場合に 503 エラーが発生する

それから SP2 WMS 2008 をインストールすると動作しない不具合などがありました。

以下がダウンロード先です。

 

Windows Media Services 2008 for Windows Server 2008

http://www.microsoft.com/downloads/details.aspx?FamilyID=9ccf6312-723b-4577-be58-7caab2e1c5b7

 

503 エラーの問題は通常の配信シナリオで発生しうることなので、WMS 2008 をインストールした際には

上記サポート技術情報を適用する必要がありました。

 

~はらだん~

 

More Posts Next page »
Page view tracker