CRI Sofdec  Last Updated: 2024-09-25 20:36 p
サンプル:シームレス連結再生
シームレス連結再生では、複数ファイルに分割されたムービーファイルをシームレスにつなげて再生することができます。
この機能を利用すると、ゲーム進行状況に応じて特定分割区間のムービーをプログラマブルに差し替えるといった演出や、 ユーザーが再生したいムービーのプレイリストを隙間なく再生するといった実装が可能です。

連結可能なムービーファイルの条件

複数のムービーファイルをシームレス連結再生する場合、連結するムービーファイル同士が以下の点で一致している必要があります。
  1. ビデオ解像度が同じ
  2. ビデオのフレームレートが同じ
  3. ビデオのコーデックが同じ
  4. オーディオおよび字幕のトラック構成が同じ

ファイル要求コールバック

#if 0
/* ムービーファイルの指定 */
criManaPlayer_SetFile(app_obj->player, NULL, USM_FILE);
#else
/* [連結再生] ファイル要求コールバックを登録する */
criManaPlayer_SetDataRequestCallback(app_obj->player, user_movie_request_callback_func, (void*)app_obj);
#endif
void criManaPlayer_SetDataRequestCallback(CriManaPlayerHn player, CriManaPlayerDataRequestCbFunc func, void *obj)
データ要求コールバックの登録
void criManaPlayer_SetFile(CriManaPlayerHn player, CriFsBinderHn bndrhn, const CriChar8 *path)
ムービーファイルの設定


通常再生では、再生開始前に criManaPlayer_SetFile 関数などでムービーのファイルパスを指定していましたが、連結再生時では ファイル要求コールバックを設定します。コールバックを登録すると、実施にファイルを読み込むタイミングでコールバックが呼び出されます。



/* [連結再生] ファイル要求コールバック定義 */
void user_movie_request_callback_func(void* obj, CriManaPlayerHn player)
{
AppObj *app_obj = (AppObj*)obj;
/* プレイリストの終端チェック */
if (app_obj->play_list_idx == app_obj->num_play_list) {
/* プレイリストを全て再生したのでファイルを登録せず再生終了。 */
/* このコールバック内でムービー登録をしなければ、PLAYENDになります。*/
return;
}
/* プレイリストのムービーを指定 */
criManaPlayer_SetFile(player, NULL, app_obj->play_list[app_obj->play_list_idx]);
/* プレイリストの再生インデックスをインクリメント */
app_obj->play_list_idx++;
return;
}
CriManaPlayerObj * CriManaPlayerHn
プレーヤーハンドル
Definition: cri_mana.h:841


ファイル要求コールバックの中で、 criManaPlayer_SetFile 関数や criManaPlayer_SetData 関数で次のムービーを指定すると、 自動的にムービーが連結されます。コールバック内で次のムービーを指定しなければ自動的にPLAYENDになります。 なお、プレイリストの管理はアプリケーション側で行って下さい。

連結再生中のムービー情報

/* [連結再生] */
/* 連結再生時では、ファイルを連結して次のムービー再生に移ると次のムービー情報が取得可能 */
criManaPlayer_GetMovieInfo(app_obj->player, &mvinf);
/* [連結再生] */
/* 実際に連結されたムービーの回数は、以下の変数から知ることが可能です */
frminf = &app_obj->frame_info;
concat_count = frminf->cnt_concatenated_movie;
/* [連結再生] 連結回数の表示 */
criFwPrt_DrawText(x, y, "Concat Count : %d", concat_count); y++; y++;
/* [連結再生] 現在再生中のムービー情報の表示 */
video = &mvinf.video_prm[0];
criFwPrt_DrawText(x, y, "<Playing Movie Info>"); y++;
criFwPrt_DrawText(x, y, "Size, Framerate : (%d x %d), %6.3f[fps]", video->width, video->height, (CriFloat32)video->framerate/1000.0f); y++;
criFwPrt_DrawText(x, y, "Frame No Per File : %d", frminf->frame_no_per_file); y++; /* 再生中のファイル内のフレーム番号 */
criFwPrt_DrawText(x, y, "Bitrate : %4.2f [Mbps]", (CriFloat32)mvinf.max_bitrate/1000000.0f); y++; y++;
CriBool criManaPlayer_GetMovieInfo(CriManaPlayerHn player, CriManaMovieInfo *mvinf)
ムービーヘッダー情報の取得


連結再生中のムービーがどのタイミングで切り替わったのかは、 CriManaFrameInfo 構造体のcnt_concatenated_movieメンバーで 判断します。また、連結再生中に criManaPlayer_GetMovieInfo 関数を呼び出すことで現在再生中のムービー情報を取得することが可能です。