タイトルの通りなんですが、動画像の読み込みをしたいのですが、C初心者なのでわかりません。アドバイスやサイトの紹介、なんでも結構ですのでどなたか教えて下さい。よろしくお願いします。
 形式はAVI、Mpegのどちらかでやろうと思ってます。

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

A 回答 (2件)

#1の方に倣って、OSはWindowsと仮定しますが。



一番手っ取り早いのは、やっぱしMCIを使うことではないかと。

mmsystem.hをインクルードし、winmm.libをリンクしておき、
mciSendString関数を使えば、mpegでもAVIでも扱えます。

詳しい解説は参考URLをどうぞ。

参考URL:http://www2s.biglobe.ne.jp/~maekawa/dev/vc/mci/
    • good
    • 0

こんにちは、honiyonです。



 OSは何でしょうか?

 Windowsであれば、WindowsMediaやActiveMovieを利用するのが一番簡単です。
 ActiveXを利用し、WindowsMediaや、ActiveMovieを取り込み、制御できるようになります。

 私は C/C++でこれを利用したことがないので詳しいインポート手順は説明できないですが...(^^;

 簡単な使用方法ですが、WindowsMediaをインポートしたら、
  WindowsMedia.FileName = "hoge.avi";
  WindowsMedia.Play();
 で再生できます。

 上記の通り WindowsMediaはクラスです。 ひょっとしたら Cでは無理で、C++になるかもしれません。
 因みに、C++ Builderであれば、ActiveXを利用するためのウィザードがあり、それを使ってインストールをし、WindowsMediaをウインドウに置くだけで即利用可能です。 Visual C++でも同様の機能があるかもしれません。

 その他OSでの楽の仕方はわかりません(^^; 1からAVIやMPEGの仕組みを勉強して、自力で再生プログラムを作る必要があるかもしれません。

 参考になれば幸いです(..
    • good
    • 0

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

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

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

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

Q[困ってます]仕様通りにどなたかcodingしていただけませんか

以下の入力ファイルの
3行目~5行目までを配列として
抜き出してファイルに出力する
やり方教えていただけませんか。
====入力ファイル=====
fa dajid fajoj
ac fajfka
2 7 10
3 8 11
4 9 12
5 6 7
=====================
====出力ファイル=====
2
3
4
7
8
9
10
11
12
=====================
初心者で、急にC言語が必要になり困っています。
どうかご教授よろしくお願いします。

Aベストアンサー

サンプルを作ってみました。
splitは、文字列を指定した区切り文字で切り出し文字列の(ポインタの)配列を作ります。
//--------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef char** StringArray;

StringArray split(char *str, char *delimiter){
char *text, *p, *first, **array;
int c;
StringArray ret;

text=strdup(str);
if(text==NULL) return NULL;
for(c=0,p=text;NULL!=(p=strtok(p, delimiter));p=NULL, c++)//要素数を数える
if(c==0) first=p; //有効なトークンの最初

ret=(StringArray)malloc(sizeof(char*)*c+1);//+1 for NULL(最後)
if(ret==NULL){
free(text);
return NULL;
}
strcpy(text, str+(text-first));//頭出しした文字列で本番
array=ret;

for(p=text;NULL!=(p=strtok(p, delimiter));p=NULL){
*array++=p;
}
*array=NULL;
return ret;
}

void free4split(StringArray sa){
char **array=sa;

if(sa!=NULL){
free(array[0]);//保持してる文字列の解放
free(sa); //配列の解放
}
}

void main(void){
FILE *fp;
StringArray store[3]; //3行分
char buff[1024];
int line=0, i, j;

fp=fopen("in.txt","r");
while(NULL!=fgets(buff, 1024, fp)){
line++;
if(3 <=line && line <= 5){
store[line-3]=split(buff," \t\r\n");
}
}
fclose(fp);
fp=fopen("out.txt","w");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
char **sa;
sa=store[j];
fprintf(fp, "%s\n", sa[i]);
}
}
fclose(fp);
for(i=0;i<3;i++)
free4split(store[i]);
}

サンプルを作ってみました。
splitは、文字列を指定した区切り文字で切り出し文字列の(ポインタの)配列を作ります。
//--------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef char** StringArray;

StringArray split(char *str, char *delimiter){
char *text, *p, *first, **array;
int c;
StringArray ret;

text=strdup(str);
if(text==NULL) return NULL;
for(c=0,p=text;NULL!=...続きを読む

QAVIファイルを読み込む方法

C++でプログラミング中の者です。
使っているコンポーネントはanimate、MediaPlayer、Edit、Botton、OpenDialogです。
OpenDialogで選択したファイル名をEditに表示させ、Mediaplayerを使ってAnimateに表示させるプログラミングをしたいと思っています。
なかなかうまくいかないので、アドバイスお願いいたします。

次のは現在のプログラムです。


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//OpenDialog1->DefaultExt = "AVI";
//OpenDialog1->FileName = "*.avi";

if(OpenDialog1->Execute()==true){ // ファイル名が選択されたときに実行する処理 
Edit1->Text=OpenDialog1->FileName; //Edit1に選択したファイル名を表示

//Animate1->Active=LoadFromFile(OpenDialog1->FileName);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
MediaPlayer1->Open();
MediaPlayer1->Play();
}
//----------------------------------

よろしくお願いします。

C++でプログラミング中の者です。
使っているコンポーネントはanimate、MediaPlayer、Edit、Botton、OpenDialogです。
OpenDialogで選択したファイル名をEditに表示させ、Mediaplayerを使ってAnimateに表示させるプログラミングをしたいと思っています。
なかなかうまくいかないので、アドバイスお願いいたします。

次のは現在のプログラムです。


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource...続きを読む

Aベストアンサー

C++Builer5 しか手元にないので、違うかもしれません。

TAnimate を使う必用はないと思います。
TMediaPlayer の Display プロパティに入れるものは、なんらかのウィンドウなので、TPanel あたりを貼り付けて使用したらいいんじゃないでしょうか。

Edit1 は、ファイル名を表示させるだけにして、

if(OpenDialog1->Execute()==true){
Edit1->Text=OpenDialog1->FileName;
MediaPlayer1->FileName = OpenDialog1->FileName;
MediaPlayer1->Open();
}

として再生ボタンを押せば、一応再生されると思います。
ちょっと試した感じでは、指定したサイズで再生することができませんでしたが、何か方法があるか、もしくは無いのかわかりません。

少し話がかわりますが、C++Builder5 だと、DirectShow のオーバーレイ表示に対応していないので、負荷が高くなって再生時にコマ落ち、音飛びなどが発生していました。C++Builder6 で対応されているならばいいのですが・・・

C++Builer5 しか手元にないので、違うかもしれません。

TAnimate を使う必用はないと思います。
TMediaPlayer の Display プロパティに入れるものは、なんらかのウィンドウなので、TPanel あたりを貼り付けて使用したらいいんじゃないでしょうか。

Edit1 は、ファイル名を表示させるだけにして、

if(OpenDialog1->Execute()==true){
Edit1->Text=OpenDialog1->FileName;
MediaPlayer1->FileName = OpenDialog1->FileName;
MediaPlayer1->Open();
}

として再生ボタンを押せば、一応再生されると...続きを読む

Qエクセル形式のファイルの読み込み

C言語で、エクセル形式のファイルの読み込みの仕方を教えてほしいです。

CSV形式のファイルにするまでは分かっているのですが、そこからどのように読み込めば良いのか分かりません。

何か分かりやすく解説されている本、またはサイトがありましたら教えて下さい。

テキスト形式のファイルの読み込みはやった事があるのですが、同じようなやり方でできますか?

Aベストアンサー

大体以下の様なフローにします。
1)CSVファイルをテキストファイルの読み込みと同じようにOPENする
2)テキストファイルを1行読み込む
3)読み込んだ行を","で分離して、セルデータを取り出す。
4)1行の最後まで、3)を続ける
5)ファイルの終わりまで2~4)を続ける
==>
 此処で、文字列の分離する方法として、c言語ならばstrtokが便利に使用できます。

<strtok例>
#include <stdio.h>
#include <string.h>

int main(void)
{
char str[] = "ABCD,ef,1234,G";
char *tp;

/* ,を区切りに文字列を抽出 */
tp = strtok( str, "," );
puts( tp );
while ( tp != NULL ) {
tp = strtok( NULL," ." );
if ( tp != NULL ) puts( tp );
}

return 0;
}
【実行結果】
ABCD
ef
1234
G
(注意)
 エクセルデータをcsvに出力した場合、データ内に,が有ったりした場合、上記の例ではうまく行きません。エクセルデータにはどの様な文字が含まれているか、事前に調査する事が必要です。また、文字列など""で囲まれていたりしますので、分離したデータから""を取り除くなどの処理が必要かも知れません。
 データに,がある場合、区切りを<tab>にしたテキスト出力をして、データを読み込む方式もあります。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtok.html

大体以下の様なフローにします。
1)CSVファイルをテキストファイルの読み込みと同じようにOPENする
2)テキストファイルを1行読み込む
3)読み込んだ行を","で分離して、セルデータを取り出す。
4)1行の最後まで、3)を続ける
5)ファイルの終わりまで2~4)を続ける
==>
 此処で、文字列の分離する方法として、c言語ならばstrtokが便利に使用できます。

<strtok例>
#include <stdio.h>
#include <string.h>

int main(void)
{
char str[] = "ABCD,...続きを読む

Q非省略形式のIPv6アドレスを省略形式に変換

非省略形式のIPv6アドレスを省略形式のIPv6アドレスに変換するプログラムのサンプルを探しているのですがよいものはないでしょうか。
bashかC言語で書かれたものを探しています。

Aベストアンサー

http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/inet_pton.3.html

Qはじめての動画像処理

はじめての動画像処理
http://www.cqpub.co.jp/shoseki/mycomputer/pic019/

こちらの7章list701.cppのプログラムを使っています。
このプログラムでは、フレームごとに画像の各特徴量を計算し、外部ファイルに結果を出力しています。
buffer(各rgbの値が格納されている)の数値を使って計算をするだけなので、これでは実行結果で表示させる画像は何も変化が得られず、ただフレームごとに画像を描画しているだけです。

私が行いたいことは、bufferに数値を代入して、表示させるビットマップの結果を変えることなのです。
例えば、画像中の白い部分を赤色に変更して結果をフレームごとに表示するなどです。
その場合、

buffer[ij*3]=255
buffer[ij*3+1]=0
buffer[ij*3+2]=0

という代入の表記を書き、その後InvalidateRectで再描画を促して結果を反映させようとしたのですが、

error C2064: 1 引数を取り込む関数には評価されません。

と出てしまいうまく行うことができませんでした。bufferはBYTE型で定義してあったのですが、そこに整数を格納しようとしていることがいけないのでしょうか?
計算結果を反映させた動画の表示方法があれば教えていただきたいです。
動画像処理は初めてでかなり困っています; よろしくお願いします。

はじめての動画像処理
http://www.cqpub.co.jp/shoseki/mycomputer/pic019/

こちらの7章list701.cppのプログラムを使っています。
このプログラムでは、フレームごとに画像の各特徴量を計算し、外部ファイルに結果を出力しています。
buffer(各rgbの値が格納されている)の数値を使って計算をするだけなので、これでは実行結果で表示させる画像は何も変化が得られず、ただフレームごとに画像を描画しているだけです。

私が行いたいことは、bufferに数値を代入して、表示させるビットマップの結果を変えることな...続きを読む

Aベストアンサー

>int ij=i*width+j;
>int rr = img00.lpBmpData[ij*3];
>int gg = img00.lpBmpData[ij*3+1];
>int bb = img00.lpBmpData[ij*3+2];
>if(rr==255 && gg==255 && bb==255){
>img00.lpBmpData [(i+3)(j+3)*3]=255;
>img00.lpBmpData [(i+3)(j+3)*3+1]=0;
>img00.lpBmpData [(i+3)(j+3)*3+2]=0;
>}

1.読み込み・判断してるデータ位置と書き換えしてる位置が一致してません
2.転記ミスなのかもしれませんが元々のソースのコメントでも
  データ配列は BGR のはずですがなぜかこのソースの
  コメントでは勝手に RGB に変えてます
  (BMPファイルのデータ配列は BGR が正解です)
3.(i+3)(j+3)*3 なんて書き方は出来ません
(何で突然こんな話が出てるのでしょうか?)
4.上記を全て直したとして赤色にセットしているのではなくて
青色にセットしていることになります

一番最初に書いてあったようにもともとのオリジナルに対して
代入を加えただけですか?
何か他の部分に要らない加工をしている気がします
転記コードやその内容を見てそのようにやっているといわれてること事態が
疑わしくなってしまうのですが

元々書かれているコード部分
bb = buffer[ ij * 3 ] ;// b
gg = buffer[ ij * 3 +1 ] ;// g
rr = buffer[ ij * 3 +2 ] ;// r
の下に
if ((bb==255) && (gg==255) &&(rr==255)) {
bb = buffer[ ij * 3 ] = 0;// b
gg = buffer[ ij * 3 +1 ] = 0 ;// g
rr = buffer[ ij * 3 +2 ] = 255 ;// r
}

と付け足すだけで動きませんか?

>int ij=i*width+j;
>int rr = img00.lpBmpData[ij*3];
>int gg = img00.lpBmpData[ij*3+1];
>int bb = img00.lpBmpData[ij*3+2];
>if(rr==255 && gg==255 && bb==255){
>img00.lpBmpData [(i+3)(j+3)*3]=255;
>img00.lpBmpData [(i+3)(j+3)*3+1]=0;
>img00.lpBmpData [(i+3)(j+3)*3+2]=0;
>}

1.読み込み・判断してるデータ位置と書き換えしてる位置が一致してません
2.転記ミスなのかもしれませんが元々のソースのコメントでも
  データ配列は BGR のはずですがなぜかこのソースの
  コ...続きを読む


人気Q&Aランキング

おすすめ情報