Last modified 4 years ago Last modified on 04/23/13 20:44:34

ビデオファイルの入出力

準備

mist/io/video.hは,http://ffmpeg.mplayerhq.hu/ で公開されている FFmpeg(libavformat,libavcodec)が必要となります. それらのの構築方法とリンク方法は、http://ffmpeg.zeranoe.com/ を参考にしてください. また,http://ffmpeg.zeranoe.com/builds/ ではあらかじめコンパイルしたバイナリも公開されていますので,自分でビルドするのは無理という方は,ダウンロードしてみてください.

ビデオファイルの読み込み

ビデオファイルを読み込みたい場合は #include <mist/io/video.h> をインクルードして,必要なところで次のように書けばOKです.

mist::video::decoder iv;
mist::array2< unsigned char > in_img;
iv.open( "入力MPEGファイル名" );
iv.read( in_img );

ビデオファイルへの書き込み

書き込みはほとんど同じ手順で実行でき,こんな感じで書けます.

mist::video::encoder ov;
mist::array2< unsigned char > out_img;
ov.open( "出力MPEGファイル名" );
if( ov.write( out_img ) )
{
    std::cout << "書き込みに成功!!" << std::endl;
}
else
{
    std::cout << "書き込みに失敗!!" << std::endl;
}

write 関数では,出力する際のパラメータ(ビットレート,GOPサイズ,...)を指定することはできません.mist::video::encoderオブジェクトのコンストラクタにてパラメータを指定してください. コンストラクタでは,画像の圧縮率や品質などのパラメータを指定することができるので,利用したい画像用の書き込み関数を ドキュメント で調べて利用してください.

mist::video::raw::encoder や mist::video::mpeg4::encoder を使うと出力ビデオファイルで使用するコーデック等を簡単に指定することもできます.

ビデオファイルの読み込みサンプル

#include <mist/io/bmp.h>
#include <mist/io/video.h>

int main( int argc, char *argv[] )
{   
    mist::array2< mist::rgb< unsigned char > > img;
    mist::video::decoder iv( "input.avi" );

    iv.dump( );
    char fname[ 256 ];
    int i = 0;
    while( !iv.is_eof( ) )
    {
        iv >> img;
        sprintf( fname, "%04d.bmp", i++ );
        mist::write_bmp( img, fname );
    }
    iv.close( );

    return( 0 );
}

ビデオファイルの読み込みと書き込みのサンプル

#include <mist/io/bmp.h>
#include <mist/io/video.h>

int main( int argc, char *argv[] )
{   
    mist::array2< mist::rgb< unsigned char > > img;
    mist::video::decoder iv( "input.avi" );

    // コンストラクタの引数を変更して圧縮パラメータの変更
    // (【注意!】ストリームを開く前に変更しなければならない)
    mist::video::mpeg1::encoder ov( "output.mpg", 320, 240 );
    ov.dump( );

    while( !iv.is_eof( ) )
    {
        // ビデオストリーム上での再生位置(秒)を表示
        std::cout << iv.time( ) << std::endl;
        iv >> img;
        /* ここで img に何らかの画像処理を施すことも可能 */
        ov << img;
    }

    ov.close( );
    iv.close( );

    return( 0 );
}

コンパイルエラーに対する対処

error: 'UINT64_C' was not declared in this scope

のようなエラーが発生する場合は,プリプロセッサに

__STDC_CONSTANT_MACROS

を定義してください.GCCのコンパイラオプションで指定する場合は,

-D__STDC_CONSTANT_MACROS

を指定してください.