このサンプルプログラムでは、ムービーファイル内の任意のビデオフレーム位置にシークする方法を紹介しています。 シーク再生に関する概要は
シーク再生とは を参照してください。
プログラムの流れ
サンプルプログラムが行っている基本的なステップは下記のようになります。
- メタデータ用メモリアロケーター関数の登録
- シーク位置を設定して再生開始
1.メタデータ用メモリアロケーター関数の登録
CriManaPlayerHn criManaPlayer_Create(void *work, CriSint32 work_size)
Manaプレーヤーの作成(コンフィグ指定なし)
void criManaPlayer_SetMetaDataWorkAllocator(CriManaPlayerHn player, CriManaMetaMallocFunc allocfunc, CriManaMetaFreeFunc freefunc, void *obj, CriManaMetaFlag meta_flag)
メタデータ用アロケーターの登録
@ CRIMANA_META_FLAG_ALL
Definition: cri_mana.h:482
シーク再生を行うには、ヘッダー解析を行う前に
criManaPlayer_SetMetaDataWorkAllocator 関数でメタデータ用の アロケーターを、通常のアロケーターとは別に必ず登録します。アロケーターは
criMana_SetUserAllocator 関数で登録するアロケーターと同じ ものでも問題ありません。ただし、マルチスレッド動作時にはメタデータ用のアロケーターが別スレッドから呼び出されることに注意してください。
アロケーターを登録しない場合はシーク再生が行えません。
2.シーク位置を設定して再生開始
if (app_obj->mvinf.seekinfo_flag == CRI_TRUE) {
}
void criManaPlayer_Start(CriManaPlayerHn player)
再生開始
void criManaPlayer_SetSeekPosition(CriManaPlayerHn player, CriSint32 seek_frame_no)
シーク位置の設定
基本はフレーム番号を基準としたシーク位置指定となります。不正なシーク位置を指定した場合は先頭からのシークとなります。
criManaPlayer_CalcFrameNoFromTime 関数を使うと、時刻からフレーム番号に変換できますので、サンプルプログラムのように時刻を基準にしたシークも可能です。
- 補足:
- ムービーにシークに必要なシークテーブル情報(メタデータ)が含まれているかどうかは、ムービー情報構造体の'seekinfo_flag'メンバー でチェックすることが可能です。ただし、現在のエンコーダーはムービーに必ずシークテーブル情報を埋め込むため、基本的にはチェックする必要はありません。