ここでは、mpgファイルからあるフレームの画像をppmファイルとして出力する
プログラムを作成します。ソースはここ。
汚いソースなんでドキュメントを読んでもらった方かいいかも。^^;
/****
usage:
mpeg_lib-mpg2ppm <mpg file> <frame> <ppm file>
compile:
cc -o mpeg_lib-mpg2ppm mpeg_lib-mpg2ppm.c -lmpeg
*****/
#include <stdio.h>
#include <stdlib.h>
#include <mpeg.h>
int main(int argc, char **argv)
{
int i;
int frame; /* 出力フレーム番号 */
int current_frame; /* 現在のフレーム番号 */
char *data; /* 画像読み込み用データ */
FILE *mpeg_fp; /* mpg用ファイル */
FILE *ppm_fp; /* ppm用ファイル */
ImageDesc img; /* MPEG Library用画像情報 */
Boolean moreframes = TRUE; /* まだ読み込んでないフレームがあるか? */
/* mpgファイルをオープン */
mpeg_fp = fopen(argv[1], "r");
/* 出力フレーム番号を取得 */
frame = atoi(argv[2]);
/* MPEG Libraryのオプション指定(フルカラー) */
SetMPEGOption(MPEG_DITHER, FULL_COLOR_DITHER);
/* mpgファイルをオープン(MPG library) */
OpenMPEG(mpeg_fp, &img);
/* 1フレーム分のデータ領域を確保 */
data = (char *)malloc(img.Size);
current_frame = 0;
/* まだ読み込んでいないフレームがあれば */
while (moreframes){
/* 1フレーム分読み込み */
moreframes = GetMPEGFrame(data);
/* 現在のフレームが出力フレームと同一なら */
if (current_frame == frame){
/* ppmファイルをオープン */
ppm_fp = fopen(argv[3], "w");
/* ppmファイルのヘッダを出力 */
fprintf(ppm_fp, "P6\n%d %d\n255\n", img.Width, img.Height);
/* ppmファイルのデータを出力 */
for (i = 0; i < img.Width * img.Height; i++){
fwrite(&(data[4 * i]), 1, 3, ppm_fp);
}
fclose(ppm_fp);
free(data);
break;
}
current_frame++;
}
/* mpgファイルをクローズ(MPEG library) */
CloseMPEG();
fclose(mpeg_fp);
return 0;
}
以上。その他の細かいところはdoc/mpeg_lib.psを見て下さい。