- PR -

C# 複数のbitmapオブジェクトから動画ファイルを作成したい

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-02-09 01:00
C#で動画ファイルを生成する簡単な方法を知りたいです。
.NET Framework標準で該当する機能が無い場合、市販のライブラリを購入しようと考えています。推奨品をご紹介いただければありがたいです。

前提条件
・開発環境 Visual Studio 2003 .NET
・開発言語 C#
・ターゲット環境 WindowsXP Pro SP2 (RAM 512MB)
・bitmapオブジェクトは全て(Width=640,Hight=240,24bitRGB,非圧縮bmp)
・約60枚程度のmitmapオブジェクトを1枚の動画ファイルとして保存する
・動画ファイルの形式はaviあるいはmpegのどちらでも良い
・音声は無し。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-02-09 10:31
.Net Frameworkには動画ファイルを作るための機能は用意されていません。
したがってVideo for Windows APIを直接呼び出すか、あるいはその他のツールを使うことになるでしょう。
引用:

・動画ファイルの形式はaviあるいはmpegのどちらでも良い
・音声は無し。


AVI形式はファイルへの格納方法だけを規定しており、動画や音声のエンコード形式は自由に選べる。サードパーティ製のCODECをインストールしなければ再生できないエンコード方式も含め多々あるので、対応したいCODECを明確にしないとアドバイスをしずらい。CODECさえインストールされていれば、APIを使って作成できる。
MPEGってMPEG1、MPEG2のどっち?どのMPEGの話か教えてくれないと、これもアドバイスしずらい。
質問内容から、もしかして動画のファイル形式に疎いのではないかと言う気がします。なぜAVIかMPEGを選択したのかを含めて質問すると、有益な回答を得られるかも。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-09 11:41
BITMAP からAVIなら、Video for Windowsと思います。(甕星さんと同じですね・・)
個人的にC#での実装経験はありません。
↓など・・
http://www.mapletown.net/~nekora/soft/howto/avi.html

他に経験上、
AVI->MPEG1
AVI->MPEG2
MPG2->MPEG1
をしたことがあります。
使用したライブラリは「MP-Factory Ver3.2/KDDI研究所」
http://avs.kddlabs.co.jp/mpeg/mpfs32/index.html

(※記憶では、変換するエンコード入力ソースは
AVI,MPEG1,MPEG2,BIMAP,YCデータだったと思いますので可能かもしれません。かなり高価です)
MP-Factoryは現行はVer.4が出ていて、MPEG4も対応してます。↓
http://w3-mcgav.kddilabs.jp/mpeg/mpfs40/index.html

調べただけですが、↓というものもありました。(私は使用経験はありません。)
http://www.codeproject.com/cs/media/aviFileWrapper.asp

この程度しか情報は持ち合わせてませんが、
BITMAP->AVIだけならフリーでも出回っているようです。



[ メッセージ編集済み 編集者: xxななおxx 編集日時 2005-02-09 12:29 ]
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-02-09 13:16
ご回答ありがとうございます。

動画の扱いは初めてなので最適な方法が分かりません。
aviは特定のCODECを含んだ仕様だとばかり思っていました。(間違っていましたが)
CODECにこだわりはありませんが、基本知識が不足している中での開発なので、簡単に済ませることを最優先に考えています。手が抜けるなら、ライブラリの購入も検討します。(値段にもよりますが)


開発目的
計測で得られた複数の静止画(bitmapファイル)から動画を得たいです。
現在は、とりあえず複数のbitmapファイルをパラパラ漫画の要領でpicturebox表示しています。静止画ファイルの数が増えるため管理が面倒です。無劣化の単一の動画ファイルで管理できれば管理が楽になります。
複数のbitmapファイルを手動で動画ファイルに変換するフリーソフトはありますが、既にメモリー上にbitmapオブジェクトが生成できているので、これをC#で動画形式のstreamに変換できれば便利です。

CODECについて
基本的にCODECは何でも良いです。
強いて言えば、下記要件満たしていることが希望です。

・C#での開発が簡単なもの(VC++の経験無し)
・WindowsXP標準のアプリケーションで再生できる。(例 WindowsMediaPlayer9)
・WindowsFormで再生できる(表示用コントロールがある)。
・無劣化(圧縮されていなくても良い)
・汎用で広く出回っているものCODEC
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-09 16:36
AVIに限りますが、
私的には昔の話で、ImageGearという画像コンポーネントを使用したことがあります。
現状のバージョンは試していませんが、ビットマップポインタから画像取得は
昔からできていますので、AVIへの書き出しが可能か?を問い合わせてみたらどうでしょうか?

http://www.proton.co.jp/products/imagegear/kinou.html


ちょっときになる点がいくつかあります。
単純に動画に変換するとおっしゃっていますが、
計測に要求されるレベルは?どうなんでしょうか?

[計測周期]
60枚の画像のサンプリング間隔にも依存すると思います。
サンプリング間隔がmsec単位で短いのであれば、
最初から動画で撮影したほうがいいと思います。

サンプリング周期が長い場合には、(秒・時間単位)
動画にコンバートするフレームレートはどうされるつもりでしょうか?
ノーマル状態では動画は、30frame/secのですから再生するにも難しいので、
フレームレートは任意に設定でき、.NET対応のSDK等を探すことになります。

[計測精度]
要求精度が640×240画像のどの程度なのか、
1ピクセル単位での計測?
見た目にはっきりわかる程度?
どんな変化状態を観察するのかにも依存します。

現在、要求されていることは、”無劣化”ということなので
厳密に言えば”AVIの無劣化”しかないです。
”AVI圧縮”は不可という条件がつきますので、
無圧縮等、任意に圧縮設定可能なSDKとなりますよね?
(勝手に決めうちで圧縮してしまうフリーのようなSDKは不可)
↓(参考)

http://oshiete1.goo.ne.jp/kotaeru.php3?q=963934

http://www5c.biglobe.ne.jp/~mei/rp/mpeg.htm

[動画再生]
一般の再生ソフト(MS-MediaPlayerなど)では、
動画のコマ戻し・コマ送りができないと思います。(ボタンもない)
自作で、MediaPlayerの動画再生に使用しているDirectXのSDKを使用して、
1コマ単位でフレームを前後させようとしても、
1コマという精度を保証できるAPIはありませんでした。(←DirectX8.0 SDKの時代の話です。
※タイムコードでもっとも近い場所を表示するという方法があるが確実性がなかったです・・)

また、動画ファイルの再生に関しても
どのデコードソフトか・またはデコード用のボードを使用するかで、
画質や再生機能(スロー・コマ送りなど)も違いがあります。
っと、いろいろ条件が出てくると思いますが?

やはり、画質評価基準が無いので、”VC++の経験無し”でも
Video for Windows APIを使かってみてからの方が良いのでは?
と思ってしまいます。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-02-09 18:24
引用:

ひろしさんの書き込み (2005-02-09 13:16) より:
・WindowsXP標準のアプリケーションで再生できる。(例 WindowsMediaPlayer9)
・無劣化(圧縮されていなくても良い)
・汎用で広く出回っているものCODEC


上記の3つの条件を満たすCODECってかなり限られると思います。たぶん、Microsoft RLE Codecぐらいしか無いと思う。

ちなみにMPEGは「Windows標準では対応しない」「不可逆圧縮なんで劣化する」ため条件を満たさないです。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-09 23:12
手法は提案するものは、以前に投稿したものしかありませんが
動画変換に関してコメント。


CODECいついてはクセや特徴がいろいろありますので調べる必要があります。
http://www4.airnet.ne.jp/snowy/codec.html
http://nippon.dip.jp/~nippon/codec/video-codec.htm

MPEGに関しては、MPEG-1形式はWindowsの標準で再生できます。
MPEG-2はデコードエンジンがインストールされていればMediaPlayerでも再生できます。
市販品なら、
・WinDVD
・PowerDVD
・Elecard 等
をインストールすればよいだけです。


本題と少しずれますが、動画にするファイル形式ついて。
命題は「静止画を動画にすればよい」
理由は、「ファイル管理上の都合」、
となるので、なんとなく時系列で計測画像が変化している様子が分かれば良い程度とすれば、非圧縮(無劣化)の形式にこだわる理由は全くありません。MPEGでも十分です。

MPEGが圧縮だから画像が悪いという考えは正しくないです。
MPEG形式は二次加工を繰り返す場合に不利ですが、
MPEG-2形式のIフレーム(イントラフレーム)のみで動画にコンバートしたものと、
AVI非圧縮にしたものを再生してみて、どちらか区別のつく人は世の中にそういません。
(※私は、MPEG-2のIBBP形式でもAVI非圧縮と区別ができませんが・・・。)

根本的に、せっかく原本のBITMAP形式のファイルを動画に変換して保存することで、
「コマ落ちしてカクカク再生する」
「細かいフレーム単位で見れなくなる」
「BITMAPでははっきり見えた計測情報が動画にしたことで欠損する」
ということが起こりえるということを認識してファイル形式を検討した方が良いと思います。
動画変換するということは再現性が厳密に確保できないデータとなる可能性があることを忘れないでください。しかも60フレームしかない動画を作成しようとしてるのですから。
そのためにも、メモリBITMAPではなく、
BITMAPファイルにしてから少なくともAVI(圧縮)・AVI(非圧縮)・MPEG-1程度を作成し、MediaPlayerで見て検討することをお奨めします。

ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-02-10 13:58
ご回答ありがとうございます。

★CODECについて

今回は「見るためだけでなく、解析データの原本として保存しておきたい」という要件があります。よって、(1)無劣化であること。(2)データ構造が単純で1ピクセルごとの輝度値が配列に取り出せること。を優先しようと考えています。無圧縮aviが今回の要件に一番向いていると感じました。

★再び質問(無圧縮aviファイルについて)

Q1.非圧縮aviファイルの内部フォーマットの詳細を知りたい。
   (構造が単純なら自分でヘッダーを作成しても良い)
   (インターネットになければ、書籍でも良い)

Q2.C#による開発の助けとなる推奨ライブラリ、SDK等を知りたい。
   (Video for Windowsより楽なものありますか?C++不勉強なので…)

元画像(RGB24bit・60枚)は下記(a)(b)どちらの形式ででも用意できる状態にあります。
(a) 非圧縮Bitmapオブジェクト
(b) 輝度配列byte[640,240,3,60] (幅,高さ,RGB,フィールド番号)

上記(a)(b)どちらをつかっても良いからC#で非圧縮aviファイルを作成するのが課題です。最適な解決策をアドバイスいただければありがたいです。

スキルアップ/キャリアアップ(JOB@IT)