ビデオファイルの入出力 - mist-team/mist GitHub Wiki
準備
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
を指定してください.