gooID利用規約 改定のお知らせ

みなさんはじめまして。

今回、AVIファイルを開き、ヘッダー及びBMPデータをバイナリ形式で書き込んでいくプログラムを作成しようと考えています。

AVIを開く時点での、AVIファイルのヘッダーのビット配列がわかりやすい表などで乗っているサイトをご存知の方おりましたら教えていただけないでしょうか。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

AVIファイルの構造ならば,このあたりが見やすいのではないでしょうか.


・「AVIファイルの内部構造」
http://www.usagi-goten.com/jp/AVI_structure.html
詳しくはこことか
・「AVIファイルフォーマット」
http://mksoft.hp.infoseek.co.jp/doc/avifileforma …
ここなど
・MSDN:「AVI RIFF ファイルのリファレンス」
http://msdn.microsoft.com/ja-jp/library/cc352264 …

--
(以下,蛇足
AVIの各コーデックの読み込み方法を既に把握されている場合はお読み飛ばし下さい.


ただ,一口にAVIファイルといっても,実体(データ部のコーデック)はファイルによって千差万別です.
読み込みプログラムを自作するならば,各コーデックの詳細を知り,個別対応しなければなりません.
・「CODEC in DreamCafe」
http://www4.airnet.ne.jp/snowy/codec.html
たとえば,上記ページのコーデックはすべてAVIファイルです.
お手持ちのファイルのコーデックを知りたい場合は,コーデック調査ツールを使用するのがよいでしょう.
・窓の杜:「真空波動研SuperLite」
http://www.forest.impress.co.jp/lib/pic/video/vd …

--
自作で各コーデックの読み込みに対応する以外には,以下の二つの方策が考えられます.

1.無圧縮AVIへの変換

コーデック変換ツールなどを使用して,動画データを無圧縮AVIに変換します.自作プログラムでは無圧縮形式だけに対応します.
無圧縮AVIならば,実体はビットマップの連続なので,ご質問文中の想定した仕様に対応するのも楽でしょう.
・コーデック変換ツール「TMPGEnc 無料版」
http://www.tmpgenc.net/ja/j_main.html

2.既存ライブラリの使用

OpenCVなどの画像処理ライブラリを使用すれば,ヘッダーの構造やデータ部のコーデックを意識することなく,動画の読み込み,画像の書き出しプログラムの作成が可能です(ただし,世の中すべてのコーデックに対応できるわけではありません.代表的な物のみです).
・「opencv.jp」
http://opencv.jp/
・OpenCVチュートリアル「OpenCV@Chihara-Lab.」
http://chihara.naist.jp/opencv/
・サンプルプログラム:AVIの読み込み
http://chihara.naist.jp/opencv/?%C6%B0%B2%E8%A5% …

他にも,「DirectX」や「Video for Windows」などのマルチメディアAPIを使用しても対応可能です.
Web検索すれば,関連情報が出てくるでしょう.

--
以上,参考になりましたら幸いです.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
お礼が遅くなってしまい、申し訳ありません。

AVIフォーマットのページ大変参考にさせていただきました、
都合上ライブラリが使用できなくなり、AVI自作を模索しておりました。

現在も作成中ですが、ヘッダーに関しては問題なくできそうです。
本当にありがとうございました。

お礼日時:2009/11/16 22:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q連番bmpをaviなどにする方法

1024×768のbmp(30fps)を、なるべく高画質でaviなどの動画にしたいです。

フリーのソフト、XPで動くオススメの物を教えて下さい。

またやり方などもあれば載せていただけると幸いです。

Aベストアンサー

aviUtlで読み込んで未圧縮AVIで出力すれば無劣化です。
容量はおおきいですが・・。
http://spring-fragrance.mints.ne.jp/aviutl/

aviUtlを起動
ファイル→開く
一番若い番号の画像を選択→開く
・・・で動画として読み込めます。

あとはAVI出力すればOK

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q無圧縮のAVIって?

 MPEG2の動画をそのまま保存するととても容量が大きいので、圧縮したいのですが、きれいに保存したいならAVIの無圧縮が良いよとアドバイスを頂いたことがあるんですが、無圧縮のAVIがよく解かりません。
 普段使っている携帯動画変換君というソフトでAVIというのはとても画像が粗くなるんですが、無圧縮のAVIというのはどういうソフトを使えばいいのでしょうか?。

Aベストアンサー

無圧縮AVI意外は何らかの方式で圧縮されています。更にメジャーな圧縮方式は非可逆圧縮なので(程度の差はあるが)画質は低下します。
非可逆圧縮で有名なのはJPEG画像です。JPEGは人間の目では識別できない色の違いを省略することでファイルサイズを縮小しています。つまり、画質は悪くなる。MPEG2やDivX等のMPEGベースの動画もほぼ同じ原理です。

MPEG2の動画を無圧縮AVIに変換しても元動画以上に画質が向上するわけではありません。失われた情報はどのような手段を講じても元通りには出来ません。つまり、画質が良くなるわけではない。

無圧縮AVIはMPEG2等の圧縮する元に使用すれば変換した後の動画の画質はやろうとしている場合の画質よりも高画質です。

つまり、大元となる動画ソースがない限り再圧縮する場合は画質を犠牲にしなくてはいけません。

DVカメラをパソコンに取り込む場合は、可逆圧縮か無圧縮形式の筈です。可逆圧縮は画質低下がありません。

更に画質の要素り一つとして画面サイズがありますが、携帯機器向けの動画は画面サイズ(画像サイズ)がDVDビデオの4分の1以下です。これをパソコンの画面で拡大表示すれば画質が悪く見えるのは至極当然のこと。
720*480のMPEG2ファイルを携帯向け機器のMPEG4(3gpp等)に変換し携帯機器で視聴すれば画質低下はまず気になりません。

無圧縮AVIは720*480の画面サイズで保存すると1分で1GBくらいになります(多分)。

無圧縮AVI意外は何らかの方式で圧縮されています。更にメジャーな圧縮方式は非可逆圧縮なので(程度の差はあるが)画質は低下します。
非可逆圧縮で有名なのはJPEG画像です。JPEGは人間の目では識別できない色の違いを省略することでファイルサイズを縮小しています。つまり、画質は悪くなる。MPEG2やDivX等のMPEGベースの動画もほぼ同じ原理です。

MPEG2の動画を無圧縮AVIに変換しても元動画以上に画質が向上するわけではありません。失われた情報はどのような手段を講じても元通りには出来ません。つまり、画...続きを読む

QOpenCVでの動画出力

現在VisualStudio2008とOpenCVを用いて、USBカメラから得られた映像をavi形式で保存しようとしています。
プログラムは以下のサイトを参考にしました。
http://chihara.naist.jp/opencv/?%A5%AD%A5%E3%A5%D7%A5%C1%A5%E3%A1%F5%C6%B0%B2%E8%A5%D5%A5%A1%A5%A4%A5%EB%BD%D0%CE%CF

プログラムを実際に動かしてみたところ確かに出力はされているのですが、映像がとても速いです(実際には20秒程なのに1,2秒で再生されてしまいます)。
この現象を回避する方法がありましたら是非教えていただきたいです。
よろしくお願いします。

Aベストアンサー

おそらく,USBカメラからキャプチャしたデータが2フレーム/秒など,
フレームレートの遅いビデオデータなのでしょう(カクカクしてませんか?).
その状態でデフォルト設定で書き込みすると,15フレーム/秒で保存され,早送り状態になってしまいます.

回避策ですが,以下で行けないでしょうか.
(USBカメラが手元にないので未検証です)

1.cvCaptureFromCAM関数の後で,cvGetCaptureProperty関数を実行して,キャプチャのフレームレート(CV_CAP_PROP_FPS)を取得する.
(おそらく2とか出てくるはず)

2.cvCreateVideoWriter関数で,fpsの設定を15ではなく,上で取得したフレームレートを代入する様に変える.

関数仕様は以下にあります.
http://opencv.jp/opencv-1.0.0/document/opencvref_highgui_video.html
cvCreateVideoWriterのfps値が任意の小さな値に変えられるのかどうかも未検証です.
駄目ならば,かなり乱暴ですが,cvWriteFrameを10連続くらいで実行してみては(要は,10倍速になってしまうなら,同じ画を10回並べてしまう).

おそらく,USBカメラからキャプチャしたデータが2フレーム/秒など,
フレームレートの遅いビデオデータなのでしょう(カクカクしてませんか?).
その状態でデフォルト設定で書き込みすると,15フレーム/秒で保存され,早送り状態になってしまいます.

回避策ですが,以下で行けないでしょうか.
(USBカメラが手元にないので未検証です)

1.cvCaptureFromCAM関数の後で,cvGetCaptureProperty関数を実行して,キャプチャのフレームレート(CV_CAP_PROP_FPS)を取得する.
(おそらく2とか出てくるはず)...続きを読む

Qwsprintf関数の使い方について

いつもお世話になっております。
 
いまいち、分からなくて質問しました。
 
 
int hp=60;

としたとき、
 
TextOut(.............,hp,lstrlen(hp));

としようと思ってたんですけど、
 
文字がでないので、
 
 
wsprintf((LPWSTR)nowhp,"%d",hp);

としたら、エラーがでて実行できませんでした。
 
TextOut関数で、60とだしたいのですが、
その後の処理で値が変わってくるので
 
TextOut(......................,TEXT("60")..........)
 
ともできず、困っています。 
 
 
要は
wsprintfに値を格納して
その後の処理で
 
hp-=10
 
としても、
wsprintfでnowhpに値を格納し
TextOutで50と表示されるようにしたいのです。
 
 
うまく説明できませんが、↑のようにする方法を
 
教えてください。
 
お願いします。

Aベストアンサー

なんか怪しげなキャストが見えますが……。

wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。
int WINAPI wsprintfA (char *, const char *, ...);
int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...);
なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。
TCHAR nowhp[11];
wsprintf(nowhp, TEXT("%d"), hp);

ただし,
MSDN: wsprintf function (Windows)
http://msdn.microsoft.com/es-ar/library/ms647550
には,wsprintfは使うな,と書いてありますので,
TCHAR nowhp[11];
if (FAILED(StringCbPrintf(nowhp, sizeof(nowhp) / sizeof(nowhp[0]), TEXT("%d"), hp))
{
// 失敗時処理
}
のようにした方がよいでしょう。

なんか怪しげなキャストが見えますが……。

wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。
int WINAPI wsprintfA (char *, const char *, ...);
int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...);
なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。
TCHAR nowhp[11];
wsprintf(nowhp, TEXT("%d"), hp);

ただし,
MSDN: wsprintf function (Windows)
http://msdn.microsoft.com/es-ar/library/ms647550
には,wsprintfは使うな,と書いてありますので...続きを読む

Qディスク上のサイズとサイズはどうして違うんですか?

ファイルのプロパティ「全般」タブに表示されている「サイズ」と「ディスク上のサイズ」は、どっちが本当のサイズなのでしょうか?
どうしてサイズが違うのですか?
メールでファイルを送るときは、どっちのサイズを見ればいいのでしょうか?
これについて詳しく解説しているページがあったら、それもぜひ教えて下さい。
よろしくお願いします。

Aベストアンサー

「サイズ」はファイルの本当の大きさ、
「ディスク上のサイズ」はファイルが記録されているクラスタを合計した大きさです、
OSはファイルを幾つかのクラスタ(OSが管理するハードディスク上のブロック
の最小単位)を使ってHDDなどのメディアに保存します、

基本的に今のWindowsでは4KBのクラスタサイズで管理しているので例え1バイトのファイルでも「ディスク上のサイズ」4KBのサイズになってしまいます、
つまり常に「ディスク上のサイズ」の方が大きくなっているはずです、

メールに添付する場合は「サイズ」を確認するだけでOKです。

Qドラッグ&ドロップで読み込むことは・・・

exeファイルにファイルを直接ドラッグ&ドロップをして、
ファイルを読み込むことっていうのはできるのでしょうか?
できるのであれば、どのような方法を用いればよいか教えてください。

Aベストアンサー

#2さんの例はGUIアプリですね。
コマンドラインプログラムの場合は、

int main(int argc,char **argv)
{ if(argc>1) printf("filename of drag&drop is [%s]\n",argv[1]);
}

読み込むなら argv[1] をfopenすればいいでしょう。

QAVIFileInitに関して

Video for WindowsでAVIを扱うプログラムを作成したいのですが、AVIFileInit()による初期化処理に関してわからないところがあります。

それは、「AVIFileInit()による初期化は何を単位に行えばよいか」ということです。
いろいろと調べていると、「AVIFileInit()の呼び出し回数と同じだけ、AVIFileExit()を呼ぶ必要がある」と書かれているので、初期化処理を複数回呼び出す可能性があるとも思えるのですが、自分のプログラムにおいて複数回AVIFileInit()を呼び出すと、エラーが発生してしまいます。(2回目の初期化のあと、AVIFileOpenを呼ぶとエラーとなります。)

単一のアプリの場合は、複数回呼び出してはいけないのでしょうか。

また、AVIファイルを扱うDLLを複数作成してアプリから呼び出し、さらにアプリでもDLL処理とは別のところでVFWによるAVI処理を行うといった場合には、初期化処理はどこで行うべきなのでしょうか。

ご存知の方が見えましたらお教えください。

開発環境はWindows2000+VisualC++6SP5です。

Video for WindowsでAVIを扱うプログラムを作成したいのですが、AVIFileInit()による初期化処理に関してわからないところがあります。

それは、「AVIFileInit()による初期化は何を単位に行えばよいか」ということです。
いろいろと調べていると、「AVIFileInit()の呼び出し回数と同じだけ、AVIFileExit()を呼ぶ必要がある」と書かれているので、初期化処理を複数回呼び出す可能性があるとも思えるのですが、自分のプログラムにおいて複数回AVIFileInit()を呼び出すと、エラーが発生してしまいます。(2回目の初...続きを読む

Aベストアンサー

これまでの経験からすると、AVIFileInit()の呼び出しは、プログラムの初期化時に一度だけ行えばよろしいかと存じます。
同じく、AVIFileExit()の呼出は、プログラムの終了時に一度だけ行えば問題ありません。

AVIファイルを扱うDLLを複数利用する場合でも同じです。DLLを利用するアプリケーション側で、一度ずつAVIFileInit()/Exit()を呼べば問題ありません。

この場合、DLL内でAVIFileInit()/Exit()を呼び出す必要はありません。

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。


人気Q&Aランキング

おすすめ情報