2

「標準的な方法」でループFLVを再生しています。

    netstream.addEventListener(NetStatusEvent.NET_STATUS, onStatus);

..。

    public function onStatus(item:Object):void {
        if (item.info.code == "NetStream.Play.Stop") {
            if (loop) netstream.seek(0);
        }

Flash CS 5.5オーサリングツール(テストムービーまたはデバッグムービー)を介して再生すると、ビデオはシームレスにループします。だが!ブラウザまたはスタンドアロンのデバッグFlashプレーヤー(両方ともv.11.2.202.233)で再生すると、ビデオが「巻き戻される」前に約1秒の異常な一時停止が発生します。

これは最新のFlashプレーヤーのバグですか?

4

5 に答える 5

10

同じ問題を抱えている人は、前述のコードを次のように変更してみてください。

public function onStatus(item:Object):void {
    if (item.info.code == "NetStream.Buffer.Empty") {
        if (loop) netstream.seek(0);
    }

ちらつきを取り除きます。「NetStream.Play.Stop」を聞くとちらつきが発生します。

何も埋め込む必要はありません。これは、IOS、Android、およびPCで問題なく機能します。

于 2012-09-20T08:02:26.677 に答える
3

これは、FlashPlayer11以降およびAIR3以降の既知のバグです。バグレポートはこちらです。賛成してください:https ://bugbase.adobe.com/index.cfm?event = bug&id = 3349340

シームレスなループを作成する既知の回避策:

1)ビデオをSWFに埋め込みます。理想的ではなく、場合によっては不可能です。

2)デュアルNetSteamオブジェクトを作成し、それらを切り替えます。2つのNetStreamsオブジェクトの最初のns1が終了時に発生するイベントの例:

if (e.info.code == "NetStream.Play.Stop"){
 vid.attachNetStream(ns2);
 ns2.resume();
 activeNs = ns2;
 ns1.seek(0);
 ns1.pause();
}

他のイベントリスナーでns1をns2に置き換えます。オブジェクトとハンドラーの役に立たない複製ですが、そこに行きます。

3)AIR 2.x / Flash Player 10.xを使用します(Linuxユーザーを除いて、実際にはソリューションではありません)

于 2013-10-24T22:45:10.947 に答える
1

Flash10からFlash11への移行時にこれに気づきました。Flash10はシームレスにループしますが、NetStream.Play.Stopからseek(0)を呼び出すと、Flash11のストールは約1秒になります。

SWFにメディアを埋め込むことは私たちの選択肢ではありません。

次のコードは、よりシームレスなループを提供します-それでも完璧ではありませんが、はるかに優れています。

var mStream:NetStream;
var mDuration:Number;

...

addEventListener(Event.ENTER_FRAME, onEnterFrame);

...

function onEnterFrame(e:Event):void
{
    if( mStream.time > (mDuration-0.05) )
    { 
        if( mLooping )
        {
            mStream.seek(0);
        }
    }
}

function onMetaData(info:Object)
{
    mDuration = info.duration;
}

それが役に立てば幸い。

于 2012-05-02T00:45:25.227 に答える
1

FLVPlaybackコンポーネントといくつかのヒントを使用してこれを達成したようです。

さらに、デスクトップ、iPhone 4S、3GSでシームレスに動作します。(AIRアプリ経由)

_videoFLV = new FLVPlayback();
_videoFLV.fullScreenTakeOver = false;
_videoFLV.autoPlay = false;
_videoFLV.autoRewind = true;
_videoFLV.isLive = false;
_videoFLV.skin = null;
_videoFLV.y = 150;
_videoFLV.bufferTime = .1;
_videoFLV.width = 320;
_videoFLV.height = 320;
_videoFLV.addEventListener(MetadataEvent.CUE_POINT, video_cp_listener, false, 0, true);
_videoFLV.source = "includes/10sec.flv"; 
addChild(_videoFLV);

リスナー機能付き...

function video_cp_listener(eventObject:MetadataEvent):void {
    if (eventObject.info.name == "endpoint") {
    _videoFLV.seek(0);
    _videoFLV.play();
    }
}

重要なのは、flvファイルと一致するように幅と高さを設定する必要があると思います。つまり、スケーリングは一切ありません。

flvには、ファイルの終わりの1フレーム前に「endpoint」という名前のキューポイントが追加されています(開始フレームと終了フレームが同じであると仮定すると、これが必要になります)。これは、AdobeMediaEncoderを使用して追加しました。

于 2012-11-01T19:38:59.247 に答える
0

flvをシームレスにループする唯一の方法は、swf内に埋め込むことです。これはMovieClipに変換され、play()、stop()、nextFrame()、prevFrame()などで処理されます。

Flashオーサリングツールに埋め込む場合(ステージ上でflvファイルをドラッグする場合)、必ず次を選択してください。

  • 「FLVをSWFに埋め込みます...」
  • シンボルタイプ:「ムービークリップ」
  • すべてチェック済み:「インスタンスをステージに配置」、「タイムラインを拡張...」、「オーディオを含める」
于 2012-04-26T06:11:57.553 に答える