0

adobe airで動画を見るアプリを作りたいです。優先順位は、seek(framneNumber) を使用して非常に細かい粒度でシークすることです。FLVPyebackAS3.swc の FLVPlayback オブジェクトを使用しています。

import fl.video.FLVPlayback;

まず第一に、シークの精度を理解していません。それは本当に任意のフレームにあるのか、それとも GOF (ビデオ圧縮で使用されるフレームのグループ - エンコーディング) の I フレームにあるのかだけです。

次に、フレーム内をシークするクリーンな方法を探しています。私はこのコードを使用しました:

    private function getFrameRate():int {
        if(playerFLV.metadataLoaded) return playerFLV.metadata.videoframerate;
        else return -1;
    }

    private function seek(frame:int):void {
        if(getFrameRate()>0)
            playerFLV.seek( frame / getFrameRate() );
    }

しかし、時にはそれは十分に正確ではないようです

4

1 に答える 1

1

seek(time:Number) 関数は時間 int を想定しており、その精度は 3 桁のミリ秒に制限されています。上記の計算では、フレームがその範囲外になる可能性があります。

簡単な確認として、getFrameRate() が何かを返していることを確認してください。それはすべきではありません:

if(playerFLV.metadataLoaded) return playerFLV.metadata.framerate;

metadata.framerate は flv フレームレートを提供します。オーディオを気にしない場合は、次を使用してみてください。

playerFLV.metadata.videodatarate

2 部構成の質問については、次のとおりです。

RE- まず第一に、シークの精度を理解していません。それは実際には任意のフレームにあるのか、それとも GOF (ビデオ圧縮で使用されるフレームのグループ - エンコーディング) の I フレームにあるのかだけです。

ビデオがプログレッシブ ダウンロードの場合:

Seek は時間をシークし、再生コンポーネントはその後の最初のキーフレームを表示します。

ビデオがストリーミングされている場合:

FMS は、その時点で必要なキー フレームを生成します。

ファイルサイズを気にしない場合の別の解決策は、flv をより多くのキーフレームでエンコードすることです。または、ビデオのエンコーディングを制御し、それらがプログレッシブである場合は、ビデオを探したいすべてのフレームに Que ポイントを追加することをお勧めします。に。

于 2012-04-29T15:30:05.007 に答える