mpeg_lib サンプルソース
ここでは、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を見て下さい。

[戻る]