CRI Sofdec
Last Updated: 2024-09-25 20:36 p
日本語
English
中文
CRI Sofdec のフレームの間引き処理の種類について
CRI Sofdec ではオーディオとビデオの同期調整のため、フレームの間引き処理を行うAPIを設けております。
フレームの間引き処理は2種類に大別されます。
Sofdec スキップフレーム
Sofdec ドロップフレーム
ターゲット、ビデオコーデックに応じてアプリ側で設定、調整を行うことでオーディオとビデオの同期調整を行いながら長時間の動画再生を行うことが可能となります。
Sofdec スキップフレームついて
デコードスキップ
CRI Mana ランタイム内部でフレームのデコード処理のスキップを要求、処理する仕組みがあります。
(本項ではデコードスキップと記述します)
再生負荷による処理落ちが発生するような場合に必要な枚数分をデコードスキップすることにより
ビデオフレームの見た目はガタツキ(コマが飛び)ますが、音飛びを防ぎやすくなります。
デコードスキップの実行は以下の2種類の方法があります。
自動デコードスキップ:CRI Manaランタイム内部で自動的に行う
手動デコードスキップ:アプリから明示的にデコードスキップを要求して行う
また、デコードスキップを使用可能なビデオコーデックとプラットフォームは以下の通りです。
ビデオコーデック:Sofdec.Prime
全プラットフォームで使用可能
ビデオコーデック:H.264
Android のみ使用可能
自動デコードスキップ
自動デコードスキップはランタイム内部で自動的に判定をしてフレームをスキップする機能です。
デコードスキップフラグは端末のスペックが一意に定まらないようなターゲットにおいてデフォルト有効になっております。
例えば以下のターゲットではデフォルト有効となります。
PC
Mac
iOS
Android
自動デコードスキップの有効か無効かにする設定や取得には以下の関数を使用してください。
criMana_SetDecodeSkipFlag
criMana_GetDecodeSkipFlag
手動デコードスキップ
デコードスキップをアプリから手動で要求することも可能です。
アプリで以下の関数を実行することで1フレーム分のスキップを要求することになります。
criManaPlayer_ExecuteAutoSkip
自動デコードスキップが有効時には使用しないようにして下さい。
併用すると過剰にデコードスキップをしてしまう可能性があります。
補足
デコードスキップが発生したカウントは、
criManaPlayer_ReferFrame
で取得した
CriManaFrameInfo.cnt_skipped_frames
を参照して確認することができます。
Sofdecドロップフレームついて
アプリ側で取得したフレームを描画、表示せずに明示的に破棄することを本項では Sofdec ドロップフレームと定義します。
アプリ側で
criManaPlayer_ReferFrame
で取得したフレームについて
criManaPlayer_ShouldDropFrame
を呼び出してフレームが破棄すべきかどうか返り値で判定します。
また、破棄すべきドロップフレームには引数の
CriManaShouldDropFrameReason
から判定した理由についても情報を取得でき、
それに応じて細かい制御を行うことも可能です。
判定理由には以下の種類があります。
CriManaShouldDropFrameReason
CRIMANA_DROP_FRAME_REASON_DROP_DELAY
CRIMANA_DROP_FRAME_REASON_DROP_CONCATENATION
それぞれについて詳しくは下記で説明します。
遅延判定
CRIMANA_DROP_FRAME_REASON_DROP_DELAY
は CriManaPlayer の再生時刻に対してユーザーで設定した閾値よりフレーム時刻が遅延していると判定された時に得られます。
この場合、以下のいずれかの対処を行うことで、遅延を解消することができます。
自動デコードスキップ
を使用する。
利用できるプラットフォームの場合はこちらの制御を推奨します。遅延を検知した時にアプリ側で対処は必要ありません。
手動デコードスキップ
を行う。
フレーム破棄
criManaPlayer_DiscardFrame
を行う。
連結判定
Sofdec のループ再生/連結再生では極力オーディオとビデオの尺を揃えてエンコードを行うことを推奨しています。
しかしながら、多くの場合若干の尺ズレがあることは避けられません。
そのような Sofdec ファイルをループ再生/連結再生を有効にして長時間再生するとAV同期ズレが累積してカクツキが発生したり、再生が止まってしまうケースがあります。
CRIMANA_DROP_FRAME_REASON_DROP_CONCATENATION
が得られた時は、上記のようにAV同期ズレが累積している状態になっています。
この時、フレーム破棄
criManaPlayer_DiscardFrame
を行いAV同期ズレを解消することで、停止等の致命的な問題を抑制することができます。
覚え書き
ランタイムが
CRIMANA_DROP_FRAME_REASON_DROP_CONCATENATION
の判定を行うためには、
criManaPlayer_SetAudioBaseConcatenation
で設定を有効にする必要があります。
合わせて
criManaPlayer_ShouldDropFrame
のリファレンスマニュアルもご参照ください。
注意
この判定を用いてフレーム破棄などの調整を行っても、オーディオとビデオの尺差や再生負荷の状況によってはズレをカバーしきれず、連結部でカクツキなどが発生してしまう場合があります。
オーディオがビデオより短い尺のケースで尺差が大きい場合(フレームレート、ビデオフレームから換算して3フレームを超えるような尺差の場合)はライブラリ内部でカバーできないと判断し、エラー:E2022091301Mが発生します。
上記のような場合、素材ファイルの尺を調整(尺を極力合わせる、オーディオをビデオより尺を長くするなど)し、再エンコードを試みてください。
Copyright (c) CRI Middleware Co., Ltd. 1.9.1