CRI Sofdec  Last Updated: 2024-04-17 11:21 p
CRI Sofdec のフレームの間引き処理の種類について
CRI Sofdec ではオーディオとビデオの同期調整のため、フレームの間引き処理を行うAPIを設けております。
フレームの間引き処理は2種類に大別されます。
  • Sofdec スキップフレーム
  • Sofdec ドロップフレーム
ターゲット、ビデオコーデックに応じてアプリ側で設定、調整を行うことでオーディオとビデオの同期調整を行いながら長時間の動画再生を行うことが可能となります。

Sofdec スキップフレームついて

デコードスキップ

CRI Mana ランタイム内部でフレームのデコード処理のスキップを要求、処理する仕組みがあります。
(本項ではデコードスキップと記述します)
再生負荷による処理落ちが発生するような場合に必要な枚数分をデコードスキップすることにより
ビデオフレームの見た目はガタツキ(コマが飛び)ますが、音飛びを防ぎやすくなります。

デコードスキップの実行は以下の2種類の方法があります。
  • 自動デコードスキップ:CRI Manaランタイム内部で自動的に行う
  • 手動デコードスキップ:アプリから明示的にデコードスキップを要求して行う
また、デコードスキップを使用可能なビデオコーデックとプラットフォームは以下の通りです。
  • ビデオコーデック:Sofdec.Prime
    • 全プラットフォームで使用可能
  • ビデオコーデック:H.264
    • Android のみ使用可能

自動デコードスキップ

自動デコードスキップはランタイム内部で自動的に判定をしてフレームをスキップする機能です。

デコードスキップフラグは端末のスペックが一意に定まらないようなターゲットにおいてデフォルト有効になっております。
例えば以下のターゲットではデフォルト有効となります。
  • PC
  • Mac
  • iOS
  • Android
自動デコードスキップの有効か無効かにする設定や取得には以下の関数を使用してください。

手動デコードスキップ

デコードスキップをアプリから手動で要求することも可能です。
アプリで以下の関数を実行することで1フレーム分のスキップを要求することになります。
自動デコードスキップが有効時には使用しないようにして下さい。
併用すると過剰にデコードスキップをしてしまう可能性があります。

補足

デコードスキップが発生したカウントは、 criManaPlayer_ReferFrame で取得した CriManaFrameInfo.cnt_skipped_frames を参照して確認することができます。

Sofdecドロップフレームついて

アプリ側で取得したフレームを描画、表示せずに明示的に破棄することを本項では Sofdec ドロップフレームと定義します。

アプリ側で criManaPlayer_ReferFrame で取得したフレームについて
criManaPlayer_ShouldDropFrame を呼び出してフレームが破棄すべきかどうか返り値で判定します。
また、破棄すべきドロップフレームには引数の CriManaShouldDropFrameReason から判定した理由についても情報を取得でき、
それに応じて細かい制御を行うことも可能です。
判定理由には以下の種類があります。
それぞれについて詳しくは下記で説明します。

遅延判定

CRIMANA_DROP_FRAME_REASON_DROP_DELAY は CriManaPlayer の再生時刻に対してユーザーで設定した閾値よりフレーム時刻が遅延していると判定された時に得られます。
この場合、以下のいずれかの対処を行うことで、遅延を解消することができます。

連結判定

Sofdec のループ再生/連結再生では極力オーディオとビデオの尺を揃えてエンコードを行うことを推奨しています。

しかしながら、多くの場合若干の尺ズレがあることは避けられません。
そのような Sofdec ファイルをループ再生/連結再生を有効にして長時間再生するとAV同期ズレが累積してカクツキが発生したり、再生が止まってしまうケースがあります。

CRIMANA_DROP_FRAME_REASON_DROP_CONCATENATION が得られた時は、上記のようにAV同期ズレが累積している状態になっています。
この時、フレーム破棄 criManaPlayer_DiscardFrame を行いAV同期ズレを解消することで、停止等の致命的な問題を抑制することができます。
覚え書き
注意
  • この判定を用いてフレーム破棄などの調整を行っても、オーディオとビデオの尺差や再生負荷の状況によってはズレをカバーしきれず、連結部でカクツキなどが発生してしまう場合があります。
  • オーディオがビデオより短い尺のケースで尺差が大きい場合(フレームレート、ビデオフレームから換算して3フレームを超えるような尺差の場合)はライブラリ内部でカバーできないと判断し、エラー:E2022091301Mが発生します。

    上記のような場合、素材ファイルの尺を調整(尺を極力合わせる、オーディオをビデオより尺を長くするなど)し、再エンコードを試みてください。