1

みなさんこんにちは!

わかりました...私はこの問題で文字通り何週間も頭を壁にぶつけてきましたが、問題をうまく解決した答えをまだ見つけることができません.

FLA を作成し、インスタンス名が videoPlay の FLV コンポーネントをステージに配置しました。

videoPlay は、イベント キュー ポイントが埋め込まれたストリーミング FLV にパスされます。キュー ポイントには、ナレーション 1 からナレーション 16 まで順番に番号が付けられます。

リスナー オブジェクトを作成しました。

     var videoPlayCuePointListener:Object = new Object();

キュー ポイントのイベント リスナー:

   videoPlayCuePointListener.cuePoint = function(eventObject:Object):Void{
   if(eventObject.info.name == "narration1"){_root.cc_box.cc_txt.htmlText = cueTxt1);}
   else if(eventObject.info.name == "narration2"){_root.cc_box.cc_txt.htmlText = cueTxt2);}
   etc, through narration16 }

など、ナレーションを通じて 16。

次に、イベント リスナーをステージ上の FLV コンポーネントにアタッチしました。

   videoPlay.addEventListener("cuePoint", videoPlayCuePointListener);

これはすべて非常にうまく機能します。FLV が再生されると、各イベント キュー ポイントが正しいテキストを cc_txt ダイナミック テキスト ボックスに送信します。

私が抱えている問題は、ユーザーがタイムラインをスクラブしたときにイベントを発生できるように、FLV 再生ヘッドに最も近いキュー ポイントを見つけることができないことです。

最終的に問題を投稿することを決定する前に、可能な限り徹底的に調査しましたが、ウェブ全体で発見された findNearestCuePoint に関するドキュメントとさまざまな投稿が多数の例を提供していますが、成功した例は 1 つもありません。

オブジェクト (nearestCue) を作成し、nearestCue に videoPlay.findNearestCuePoint(videoPlay.playheadTime) の値を与えるリスナーを videoPlay に追加しようとしました。次に、nearestCue の名前、ラベルなどを読み上げます。ダイスはありません。

私がレビューした投稿(多くの投稿)で提案されたものは何も答えを提供していません.

これは達成するのが最も簡単なことのように思えますが、私は一度も成功していません.

提案や支援をいただければ幸いです。

お時間をいただきありがとうございます!

4

2 に答える 2

1

長い間 AS2 に触れていません。基本的なテストを行ったところ、findNearestCuePoint が機能しました。FLVPlayback コンポーネントを使用していますね。これが私が試したことです:

videoPlayer.autoPlay = false;
onEnterFrame = function():Void{
    videoPlayer.seekPercent(_xmouse/Stage.width * 100);
    videoPlayer.play();
    trace(videoPlayer.findNearestCuePoint(videoPlayer.playheadTime).name);
}

推奨される方法は、再生ヘッドがその値を変更した後にトリガーされるplayheadUpdateハンドラーで最も近いキュー ポイントを見つけることです。(例: 1. 再生ヘッドに移動するよう指示する、2. 再生ヘッドが実際に値を変更する、3. playheadUpdate が呼び出される)

より基本的なアプローチは次のとおりです。

onEnterFrame = function():Void{
    if(videoPlayer.metadata) trace(videoPlayer.findNearestCuePoint(_xmouse/Stage.width * videoPlayer.metadata.duration).name);
}

私のテストでは、4 つのキュー ポイントを追加しました。それらをすべて試しました:アクションスクリプト/イベント/ナビゲーション。奇妙なことに、videoPlayer または videoPlayer.metadata を介して cuePoints プロパティにアクセスしようとしたときに、8 つの未定義オブジェクトの配列を取得し、トレースしたときの配列の長さは 4 でした。問題が何であるかわからない、おそらくエンコーディング/コーデックとas2の互換性、よくわからない.

とにかく... cuePoints 配列を取得している限り、それらすべてをループして、各キューポイント時間と現在時間の間の最小絶対差を取得することにより、最も近いものを手動で見つけることができます。

function getClosestCuePoint(cuePoints:Array,time:Number):Object{
    var numCuePoints:Number = cuePoints.length;
    var minDist:Number = 100000000,result:Object;
    for(var i:Number = 0 ; i < numCuePoints ; i++){
        if(Math.abs(cuePoints[i].time - time) < minDist){
            minDist = Math.abs(cuePoints[i].time - time);
            result = cuePoints[i];
        }
    }
    return result;
}

モックアップの例を次に示します。画面上のいくつかのボックスがキュー ポイントであり、_xmouse の位置が再生ヘッド時間であると仮定しましょう。新しいドキュメントでこれを試してください:

//fake cue points
var numCuePoints:Number = 5;
var cuePoints = [];
for(var i:Number = 0 ; i < numCuePoints ; i++) cuePoints[i] = {name:'narration ' + (i+1),time: 10 + (80 + Math.random() * 20) * i}
//visual hint - separated from the cue points
for(var i:Number = 0 ; i < numCuePoints ; i++) drawBox(this,0x009900,10,15,cuePoints[i].time,Stage.width * .5);
var playhead:TextField = drawText(this,'playhead');

//playhead update
onEnterFrame = function():Void{
    playhead._x = _xmouse;
    playhead.setTextFormat(new TextFormat('Verdana',11));
    playhead.text = 'time: ' + _xmouse+' / cue ' + getClosestCuePoint(cuePoints,_xmouse).name;
}
//find the shortest marker within the shortest distance from the current value
function getClosestCuePoint(cuePoints:Array,time:Number):Object{
    var numCuePoints:Number = cuePoints.length;
    var minDist:Number = 100000000,result:Object;
    for(var i:Number = 0 ; i < numCuePoints ; i++){
        if(Math.abs(cuePoints[i].time - time) < minDist){
            minDist = Math.abs(cuePoints[i].time - time);
            result = cuePoints[i];
        }
    }
    return result;
}
//utils
function drawBox(target:MovieClip,color:Number,width:Number,height:Number,x:Number,y:Number):Void{
    target.lineStyle(3,color);
    target.moveTo(x,y);
    target.lineTo(x+width,y);
    target.lineTo(x+width,y+height);
    target.lineTo(x,y+height);
    target.lineTo(x,y);
}
function drawText(target:MovieClip,name:String):TextField{
    var result:TextField = target.createTextField(name,target.getNextHighestDepth(),0,Stage.width * .5-20,100,20);
    result.autoSize = 'left';
    result.border = true;
    result.selectable = false;
    return result;
}

HTH

于 2011-08-11T07:37:09.047 に答える
0

ジョージ、

私はこの問題を発見したと信じており、以前の投稿であなたが取り上げたものだったと思いますが、偶然にそれを見逃してしまいました.

私が使用していた F4V には、Adobe Media Encoder を使用してキュー ポイントが埋め込まれていました...そしてそれが問題全体でした。

戻ってキュー ポイントを XML にエクスポートし、F4V からそれらを取り除き、それらなしで再エンコードしました。次に、XML を編集してすべてのイベント キュー ポイントをアクション スクリプトに変更し、FLV コンポーネント プロパティ ダイアログを使用してそれらを FLA ファイルにインポートしました。

Presto、驚くべきことに、キューポイントを見つけてトレースし、あらゆる目的に使用するのに問題はありませんでした.

したがって、将来的には、[プロパティ] ダイアログでキュー ポイントを設定し、それらをアクション スクリプトに設定することを忘れないようにする必要があります。これまでのところ、変更を行ってからすべての F4V ファイルで問題なく動作しています。

丁寧なご回答とフォローありがとうございます!

于 2011-08-18T11:59:41.013 に答える