CRI Sofdec  Last Updated: 2024-09-25 20:36 p
再生速度の変更
Sofdecでは、 criManaPlayer_SetSpeed 関数、または criMana_AdvanceManualTimer 関数や criManaPlayer_SetUserTime 関数で再生速度をコントロールすることができます。
またタイムストレッチ機能を使用すると、音声付きムービーを再生する際に音声のピッチを変えずに再生速度を変更できます。使用しない場合は再生速度に応じて音声のピッチが変化します。
タイムストレッチ機能を使用する場合に可能な再生速度は0.5~2.0倍で、使用しない場合や音声をOFFにして再生する場合では再生速度に制限はありません。
変更可能な再生速度
再生方法 再生速度制限
タイムストレッチ機能使用 0.5 ~ 2.0 倍
タイムストレッチ機能不使用 または 音声OFF 制限なし
ただしどちらの場合においても、1.0倍より速い再生速度で再生する場合(早回し)は、何点か条件をクリアする必要があります。
ここでは早回しを行う方法と、タイムストレッチ機能の使用方法について説明します。

早回しの方法

早回し時の条件
早回しを行う際に、ネックとなるのはデコード性能とメインループの周期です。
例えば30fpsムービーを倍速再生する場合、次の2つの条件をクリアする必要があります。
  • 条件1:メインループ(描画ループ)が60fpsで組まれている(秒間60フレーム描画できる)
  • 条件2:倍の速度で再生しても、デコードが間に合う
メインループの周期がムービーと同じ場合、表示スキップかデコードスキップを行わない限り、早回しは出来ませんのでご注意ください。
また、デコード性能が足りない場合も、設定した速度で早回しが出来ない要因となります。その場合はムービーの解像度やフレームレートを落として負荷を調整してください。
表示スキップによる早回し
フレームプールに溜まっているデコード済フレームのうち、表示タイミングに間に合ってない何枚かは表示させずに捨て、間に合っている1枚を表示するようにすることでメインループとムービーのフレームレートが同じ場合でも早回しを実現することが可能です。
この時は再生速度を上げる分デコードが先行する必要があるため、デコード性能に加えてフレームプールの数にもご注意ください。
早回しの上限値はメインループ周期とムービーのfpsの組み合わせ、デコード性能、フレームプールの数によって異なります。
デコードスキップによる早回し
  • Sofdec.Prime
    Sofdec.Primeではメインループがムービーのフレームレートと同じ場合でも、デコードスキップ機能を有効にすることで早回しを実現することが可能です。
    コンソール機ではデコードスキップはデフォルト無効になっていますので、 criMana_SetDecodeSkipFlag 関数でスキップ機能を有効にしてください。
    ただし、スキップできるフレーム枚数には制限があるため、現状2.6倍程度がデコードスキップによる早回しの上限値になります。
  • H.264/VP9/AV1
    H.264/VP9/AV1コーデックによる再生では仕様上デコードスキップを行う事ができません。
    全てのフレームについてデコード、取得を行う必要があります。
    デコードスキップによる早回し再生を行う事ができないため、
    これらのコーデックで早回しの演出をしたい場合はアプリケーション側で表示スキップ
    (取得したフレームを描画せずにそのまま破棄するといった対応)を行うといった形で
    実現できないかお試し下さい。
注意:
早回しの上限値を超えて再生速度を設定すると、早回しは実現しないのにプレーヤーの時刻はその再生速度のまま進み続けるといった現象が発生します。
実現が難しい再生速度での再生は基本的に避けてください。
再生途中からの再生速度の変更
音つきムービーの場合は再生途中からの速度変更はできません。
音がない場合であれば、再生中に criManaPlayer_SetSpeed 関数を呼び出して動的な速度変更が可能です。

音声のタイムストレッチ

CriManaPlayerHn の作成時にコンフィグで CriManaPlayerConfig::use_atomex_player をCRI_TRUEにすると、 criManaPlayer_SetSpeed 関数で再生速度を変更した際にAtomライブラリのタイムストレッチ機能を使用するようになり、ムービーの音声のピッチが変わらずに再生されます。
タイムストレッチ機能を使用する際に設定可能な再生速度は0.5~2.0倍です。
タイムストレッチ付きで再生速度を変更したい場合は、以下のようなコードでタイムストレッチを有効にしてください。
CriManaPlayerHn mana_player;
CriAtomExPlayerHn atomex_player;
/* Atomライブラリのタイムストレッチ機能を使用するように設定 */
config.use_atomex_player = CRI_TRUE;
mana_player = criManaPlayer_CreateWithConfig(&config, NULL, 0);
/* 再生速度の設定 */
criManaPlayer_SetSpeed(mana_player, 2, 1);
/* (中略) - 音声付きムービーのファイル指定等 - */
/* 音声付きムービーの場合、タイムストレッチ機能を使用し2倍速で再生開始 */
criManaPlayer_Start(app_obj->player);
CriManaPlayerHn criManaPlayer_CreateWithConfig(const CriManaPlayerConfig *config, void *work, CriSint32 work_size)
Manaプレーヤーの作成(コンフィグ指定つき)
void criManaPlayer_SetSpeed(CriManaPlayerHn player, CriSint32 speed_numerator, CriSint32 speed_denominator)
再生速度の設定
void criManaPlayer_Start(CriManaPlayerHn player)
再生開始
#define criManaPlayer_SetDefaultHandleConfig(p_config)
プレーヤー作成用コンフィグ構造体にデフォルト値をセット
Definition: cri_mana.h:188
CriManaPlayerObj * CriManaPlayerHn
プレーヤーハンドル
Definition: cri_mana.h:841
プレーヤー作成用コンフィグ構造体
Definition: cri_mana.h:778
CriBool use_atomex_player
サウンド再生に criAtomExPlayer を使用するためのフラグです
Definition: cri_mana.h:804
タイムストレッチ時の音声の品質設定
タイムストレッチの品質を調整したい場合は、CriManaPlayerHn 内部で使用している CriAtomExPlayerHn を参照し、AtomライブラリのAPIを使用することで設定してください。
タイムストレッチの品質は以下のようなコードで設定できます。
atomex_player = criManaPlayer_GetAtomExPlayer(mana_player);
/* タイムストレッチの品質を最大(10)に設定 (初期設定: 2) */
criAtomExPlayer_SetDspParameter(aatomex_player, CRIATOMDSP_TIMESTRETCH_PARAM_QUALITY, 10);
criAtomExPlayer_UpdateAll(atomex_player);
注意:
タイムストレッチの品質は高く設定するほどCPU負荷が高くなりますのでご注意ください。