2013/01/25(Fri)C#からDirectShowを使って動画のビットマップのポインタを得てDirect3Dでムービーテクスチャにもできる動画再生ライブラリを作ったのでNYSLで公開しました。

はてブ数 2013/01/25 23:36 プログラミング::C# つーさ

本日(じゃないけど)のアウトプット。
動画プレーヤーつくりました。

今更DirectShowのSampleGrabberを使えるようになってみたり。
再生するというよりは、ビットマップのポインタを得てぐりぐり加工する向けですな。

    /// 
    /// DirectShowのSampleGrabberGraph を使ってメディアファイルを再生するサンプル。
    /// SampleGrabberを使うメリットは、ビデオもオーディオもデコード後のデータのポインタが得られることで、
    /// Marshal.Copyなどでbyte[]にコピーするなり、unsafeコンテキストを使うなりで手軽に加工することができる。
    /// ゲームアプリなどではDynamicTextureに転送することで簡単にムービーテクスチャを作ることもできる。
    /// VMR9を使った方がパフォーマンスが出るが、Device LostがOSのバージョンごとに挙動が違ったりで対応しきれない。
    /// カスタムレンダラを作るのが最良の方法なのだろうけれど、C#のみでカスタムレンダラを作るのは至難の業。
    /// Enter:開く, Space:再生/一時停止, Escape:停止 ←/→:5秒シーク
    /// 

例によってソースをNYSLで公開してます。
https://github.com/ttsuki/ttsuki/tree/master/WindowsUtil/DirectShow/

例によって、このコードをあなたのプログラムにコピペすると、
特にアセンブリを追加することなくEXE単体で動画再生ができます。
DirectShow.net とか使ってない。

C#の動画再生あれこれと言えば……。

たとえば、Managed DirectXには AudioVideoPlayback というクラスがあって、
実はManaged Direct3Dのテクスチャに転送する機能もついていることにはいるんですが、
強制的に、画面のFPSが動画のFPSに合わせられてしまったりするので、
(ただ再生するならそれでいいですが、ゲーム中のテクスチャとして使うには)非常に扱いが難しいです。

VMR9を使うと動画のフレームを描画したテクスチャを直接受け取ることができなくもないんですが、
これまた動画のレンダリング中(テクスチャを投入してから、次のフレーム時刻になって、テクスチャ描画されて戻ってくるまで)は、
描画スレッド側でDirect3DのAPIが呼べないため、60FPSを維持しながら動画再生するのはなかなか至難の業っぽく。
動画に1FPSの区間があったりすると、ゲームアプリ側も巻き込まれて1FPSになるんですよね、はい。

また、VMR9はDevice Lostしたとき、Pinを切ってDirect3DをResetしてPinをつなぐとWinXPでは動いていたんですが、
Win8にしたらそのコードではCOMExceptionが出るようなので、結局Graphをいったん破棄してとか。
当時はDirectShowに対する知識も浅かったので(未だに浅いですが)使い方間違ってたかもなぁ……。

という感じで一周してきて、結局頼れるのはSampleGrabberですね!

Media Foundation API とか使うとmp4とかも開けるようになるみたいで、そっちも使えてみたいなぁ。
APIのネーミングとかをさらっと見た感じでは、
DirectShowで言うグラフのようにトポロジを構成してデータを流すっぽいんですが。

2013/01/02(Wed)1月2日

はてブ数 2013/01/02 5:51 未分類 つーさ

片田舎のちょっとした森で迷子の少女と出会う。

少女はなんか鋭利な王冠のようなものを被っていたのだが、
なんか尖っていて、この辺で着けてるのは危ないなと思ったので、
没収することにした。

帰る場所もなく帰る方法もなく、
正体を隠したまま僕と一緒に暮らすことになる少女。

どれくらい時が流れたかわからないが、
僕も、夕食の時に知らない男の話をされて不機嫌になるくらいに
少女のことを気に入り始めていた。むむーっ。
死んだ父の友人だといって寂しげに笑うので、
死んだ父に免じて許してやることにする。

村の暮らしにも慣れた頃に、帰らなければいけない理由ができる。
詳細は知らんけど、なんか帰らなければいけないらしい。
なんかこの子との生活もいいなぁと思っていたからちょっと残念。

いざ、旅立ちの朝、
本当はお前を殺しに来たのだと正体を明かして涙する少女。

きょうがくのじじつ!

実はラスボスであるところの魔王様(少女)が
勇者(僕)の寝首をかきに来ているのだが、
それを僕は知るよしもなかった。

魔王様は相手を魅了して自分の思いのままに操る能力を持っていて、
勇者のことを殺すチャンスはいくらもあったのに、
一緒に暮らすうちに逆に僕に惹かれ始めてしまったらしい。

魔力の大部分が僕が取り上げた王冠にあったことも教えてくれる。
いつか私を倒しにくることがあれば、と自分の住んでいる城に張り巡らされている罠の詳細を事細かに教えてくれる。

??? これは会いに来てと言ってるのか?

住んでいたところに帰るには、空高く上る必要があるというので、
見晴らしのよい緑の丘から、ちゅーいんぐばるーん を使う。
# 実は僕は駄菓子を使って戦う勇者だったのだ!
が、実際2メートルぐらい上がったところで急に彼女の姿は消えた。

見えなくなるまで高く上っていくことを想像していた僕は、
思わず「そんな高さでいいのかよ!」と声に出して突っ込んでしまう。
ばるーんだけが飛んでいく。 ※ ばるーんは非常に高価だ……!

 

そこで目が覚めた。 なんだこの初夢。

今日から仕事です……。

2013/01/01(Tue)あけましておめでとうごじあます

はてブ数 2013/01/01 15:51 ご案内 つーさ

新年のネタを考える暇もなく19113年が幕を開けてしまいました。

昨年中は本ブログにたくさんのコメントをありがとうございました。

本年はもっともっといろんなことをアウトプットできるように、
頑張って参りますので、つーさのくーかんをよろしくお願い申し上げます。

19113年 元日 寝正月を過ごして元旦と書けなくなってしまった つーさ