CRI Sofdec  Last Updated: 2024-09-25 20:36 p
サンプル: シーク再生
このサンプルプログラムでは、ムービーファイル内の任意のビデオフレーム位置にシークする方法を紹介しています。 シーク再生に関する概要はシーク再生とは を参照してください。

プログラムの流れ

サンプルプログラムが行っている基本的なステップは下記のようになります。
  1. メタデータ用メモリアロケーター関数の登録
  2. シーク位置を設定して再生開始

1.メタデータ用メモリアロケーター関数の登録
/* プレーヤーの作成 */
app_obj->player = criManaPlayer_Create(NULL, 0);
/* メタデータ用メモリ関数の登録 */
/* シーク再生を行う場合、必ず登録を行ってください */
criManaPlayer_SetMetaDataWorkAllocator(app_obj->player, user_alloc, user_free, NULL, CRIMANA_META_FLAG_ALL);
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) {
criManaPlayer_SetSeekPosition(app_obj->player, app_obj->seek_frame_no);
}
/* ムービー再生の開始 */
criManaPlayer_Start(app_obj->player);
void criManaPlayer_Start(CriManaPlayerHn player)
再生開始
void criManaPlayer_SetSeekPosition(CriManaPlayerHn player, CriSint32 seek_frame_no)
シーク位置の設定


シーク再生を行う場合は、 criManaPlayer_Start 、あるいは criManaPlayer_Prepare 関数を呼び出す前に、 criManaPlayer_SetSeekPosition 関数でシーク位置を決定します。


基本はフレーム番号を基準としたシーク位置指定となります。不正なシーク位置を指定した場合は先頭からのシークとなります。


criManaPlayer_CalcFrameNoFromTime 関数を使うと、時刻からフレーム番号に変換できますので、サンプルプログラムのように時刻を基準にしたシークも可能です。


補足:
ムービーにシークに必要なシークテーブル情報(メタデータ)が含まれているかどうかは、ムービー情報構造体の'seekinfo_flag'メンバー でチェックすることが可能です。ただし、現在のエンコーダーはムービーに必ずシークテーブル情報を埋め込むため、基本的にはチェックする必要はありません。