CRI Sofdec  Last Updated: 2024-09-25 20:36 p
サンプル : マルチリンガル再生
本サンプルプログラムでは、マルチリンガルに対応したムービー再生について説明します。
CRI Manaライブラリでは、字幕の取得機能とサブオーディオ同時再生機能の二つをマルチリンガル用にサポートしています。

サブオーディオ同時再生とは

サブオーディオトラック再生には、まず複数のオーディオトラックが入ったムービーファイルを用意します。 この複数トラックあるムービーを再生したときに、再生中のオーディオトラックに対して同時に任意のオーディオトラックをサブオーディオトラックとして重ねて再生する機能です。
そのため、5.1chオーディオと同時にサブオーディオとしてボイストラックを再生することで、 マルチリンガルサラウンド再生が実現できます。


サブオーディオイメージ図

以下にサブオーディオ再生を行うためのサンプルコードを示します。

1.サブオーディオトラックの指定
/* サブオーディオトラックの設定 */
criManaPlayer_SetSubAudioTrack(app_obj->player, app_obj->cur_subaudio_track_no);
/* 再生用ワークバッファーの設定 */
{
criManaPlayer_GetPlaybackWorkParam(app_obj->player, &config_basic, &config_ex);
/* criManaPlayer_SetSubAudioTrack で指定したオーディオトラックが 有効なトラック */
/* ならば、config_exにサブオーディオパラメーターがセットされます */
criFwPrt_DebugPrintf("----------------------\n");
criFwPrt_DebugPrintf("Subaudio Track # : %d\n", app_obj->cur_subaudio_track_no);
criFwPrt_DebugPrintf(" - channels : %d\n", config_ex.sub_audio_params.num_channels);
criFwPrt_DebugPrintf(" - samplingrate : %d\n", config_ex.sub_audio_params.sampling_rate);
criFwPrt_DebugPrintf("----------------------\n");
criManaPlayer_SetPlaybackWork(app_obj->player, &config_basic, &config_ex, NULL, 0);
}
void criManaPlayer_SetPlaybackWork(CriManaPlayerHn player, const CriManaPlaybackBasicWorkConfig *config_basic, const CriManaPlaybackExWorkConfig *config_ex, void *work, CriSint32 work_size)
再生ワーク領域の設定
CriBool criManaPlayer_GetPlaybackWorkParam(CriManaPlayerHn player, CriManaPlaybackBasicWorkConfig *config_basic, CriManaPlaybackExWorkConfig *config_ex)
再生ワークパラメーター構造体の取得
void criManaPlayer_SetSubAudioTrack(CriManaPlayerHn player, CriSint32 track)
サブオーディオトラック番号の設定
CriUint32 num_channels
Definition: cri_mana.h:937
CriUint32 sampling_rate
Definition: cri_mana.h:933
再生ワーク用パラメーター構造体 (基本)
Definition: cri_mana.h:1019
再生ワーク用パラメーター構造体(拡張)
Definition: cri_mana.h:1050
CriManaPlaybackAudioParams sub_audio_params
Definition: cri_mana.h:1053


サブオーディオトラックの指定は、ヘッダー解析前/再生開始前に criManaPlayer_SetSubAudioTrack 関数で行ないます。 有効なトラックを設定すると、 criManaPlayer_GetPlaybackWorkParam で取得した CriManaPlaybackExWorkConfig 構造体に、指定したトラックの再生ワークパラメーターが反映されます。


なお、ユーザーアロケーターを登録している場合は criManaPlayer_SetPlaybackWork 関数を呼び出す必要はありません。 有効なサブオーディオトラックが指定されていれば自動的にライブラリ内部でワークバッファーを確保します。


サブオーディオの設定に関わらず、サブオーディオトラック再生機能自体を無効にしたい場合は、::criManaPlayer_SetPlaybackWork 関数に渡す拡張再生ワーク用パラメーター構造体をNULLで渡すか、その内部の sub_audio_params 構造体の使用フラグをFALSEにします。

2.サブオーディオトラックの管理
CRI Manaライブラリ側では、ムービーファイル内のオーディオトラックに対してメインオーディオかサブオーディオかの区別は しません。どのトラックをサブオーディオとして鳴らすかはアプリケーション側で管理します。

3.サブオーディオトラックの切替
複数の言語ごとにサブオーディオトラックを用意している状態で、ムービーの再生中にサブオーディオトラックを 切り替えたい場合は、一度ムービー再生を停止してからサブオーディオトラックを再設定し、ムービー再生を開始してください。
オーディオを切り替えた時点から再生を再開したい場合、最後に取得したフレーム番号を記録してシーク再生します。

字幕

CRI Manaライブラリでは、あらかじめエンコード時に埋め込んだ字幕情報をランタイム時に取得することができます。

1.字幕の有無の確認
ムービーの中に字幕データが入っているかどうかは、再生開始前にムービー情報を見ることで確認できます。
CriManaMovieInfo 構造体の字幕関連メンバー変数
変数名 説明
num_subtitle_channels ムービーファイルの中に入っている字幕チャンネル数。
max_subtitle_size 字幕データの最大サイズです。字幕用に確保するバッファーサイズの参考にしてください。

2.取得する字幕チャンネルの指定
/* 字幕の設定 */
if (app_obj->mvinf.num_subtitle_channels > 0) {
criManaPlayerSetSubtitleChannel(app_obj->player, app_obj->cur_subtitle_channel_no);
}


criManaPlayer_SetSubtitleChannel 関数を使って、取得したい字幕チャンネル番号を設定します。 この関数はサブオーディオのトラック指定とは違い、再生中でも字幕チャンネル番号を切り替えることができます。 ただし再生中に字幕チャンネルを切り替えた場合、実際に字幕が切り替わるのは、次の字幕データからになります。


もしも指定した字幕チャンネルにデータが存在しない場合は、字幕が取得できません。

3.字幕データの取得
/* 字幕の取得 */
criManaPlayer_GetSubtitleOnTime(app_obj->player, app_obj->subtitle_buffer, sizeof(app_obj->subtitle_buffer));
CriUint32 criManaPlayer_GetSubtitleOnTime(CriManaPlayerHn player, CriUint8 *bufptr, CriUint32 bufsize)
字幕の取得


criManaPlayer_GetSubtitleOnTime 関数は、アプリケーションが確保したバッファーに現在の再生時刻に表示すべき字幕データを 取得します。引数で指定したバッファーサイズよりも字幕データのほうが大きかった場合は、バッファーサイズ分だけを取得して、 残りは破棄します。
表示すべき字幕データが無い場合は、字幕用バッファーはゼロクリアされます。 そのため、アプリケーションは字幕用バッファーの内容を表示し続けることで字幕再生が可能です。


なお、字幕チャンネルを設定した場合、ムービー再生中はムービー再生中は必ずアプリケーションのメインループから上記字幕 取得関数を呼び出してください。字幕チャンネルが有効になった状態で字幕を取得しない場合、字幕データが消費できず、 再生が止まります。

4.字幕データの描画処理
CRI Mana ライブラリは字幕の描画処理を行いません。 字幕の描画はフォントの処理を含めてアプリケーションで行ってください。 本サンプルプログラムでは、簡単のため、ムービーの描画ウィンドウではなく、デバッグ情報表示用のウィンドウに字幕内容をテキストとして表示しています。