2017-06-09 12 views
2

HTML5ビデオで実行されたシークを追跡したい。このためには、シークレットシークレットポジションを知る必要があります。 2つ目は些細なことです(1つはseekedイベントに耳を傾けなければなりません)。最初の取得方法はわかりません。過去には HTML5ビデオ:シーク元位置から取得

は、私が カスタムコントロールを使用しましたので、私は、私がレンダリングされたプログレスバーまたは任意の mousedownイベントを聞いたとき、それは、シークするために変更する直前に手動で currentTimeを救うことができます。

今、私は標準コントロールでそれをやりたかったが、この最後にプレイしたポジションをキャプチャできません。

外の制御領域を選択するときに、私もvideo要素にmousedownイベントをリッスンするようにしようとしたが、それが唯一の火災...

let video = document.getElementsByTagName('video')[0]; 
 
let list = document.getElementsByTagName('ul')[0]; 
 

 

 
function log(name, time) { 
 
    let li = document.createElement('li'); 
 
    li.textContent = name + ': ' + time; 
 
    list.appendChild(li); 
 
} 
 

 
video.addEventListener('seeked', e => { 
 
    log('seeked', e.target.currentTime); 
 
}); 
 

 
video.addEventListener('mousedown', e => { 
 
    log('mousedown', e.target.currentTime); 
 
});
<video width="300" src="http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4" controls></video> 
 
<ul> 
 
</ul>

ありがとうございます!

+0

ここにコードを掲載する必要があります。明日は消える。 – Rob

+0

感謝@ロブ、@doutriforceを知らなかった! – nerestaren

答えて

1

timeupdateイベントを使用して現在の時刻を追跡し、seekedイベントが発生したときに最新の現在時刻を知ることができます。

ここで問題になるのは、少なくともChromeがtimeupdateをトリガーする直前にseekedがこのアプローチを壊すことになることです。しかし、今度は、seekingイベントを使用して、現在の時刻を追跡するのを止めるべき時を知ることができます。

唯一の欠点は、ユーザーがマルチプルでビデオがまだロードされていないポイントを探す場合、最初のシーク開始位置になります。

let currentVideoTime = 0; 
let saveCurrentTime = true; 

video.addEventListener('seeked', e => { 
    log('seeked (started at ' + currentVideoTime + ')', e.target.currentTime); 
    saveCurrentTime = true; 
}); 

video.addEventListener('seeking', e => { 
    log('seeking', e.target.currentTime); 
    saveCurrentTime = false; 
}); 

video.addEventListener('timeupdate', e => { 
    log('timeupdate', e.target.currentTime); 
    if(saveCurrentTime) 
    currentVideoTime = e.target.currentTime; 
}); 
+0

あなたの答えをありがとう。残念ながら、私はすでにこれまでと非常に似た何かを試していましたが、うまくいきませんでした。あなたのアイデアは、少なくともChrome 58でも動作しません。 なぜですか? 'seeking'イベントが発生するか、' seeking'プロパティがtrueに設定される前に 'currentTime'が更新されます。 https://jsfiddle.net/94st7zzm/1/ – nerestaren

+0

私にはこれが動作します。これがログに記録されます: "(複数回答)..|求める:149.301882 | timeupdate:149.301882 |捜した(**は0 **で始まった):149.301882 | timeupdate:149.301882 "、もう一度やり直すと再び動作します:" seeking:286.161941 | timeupdate:286.161941 |追求されました(**開始日:149.301882 **):286.161941 | timeupdate:286.161941 " – Luizgrs

+0

私は見ています**あなたはビデオを再生していますか**ビデオでこれをやっていますか?**一時停止**? – nerestaren

0

私の問題は、それが解雇だときseekingでも、video_element.currentTimeはすでに時間「へのシーク」に更新されていることです。

私はそれを行う方法は、(そのtimeupdateを除いて十分な頻度で発生しません[を、時には20代の?時々1msの?多分負荷に依存?]私はちょうど100 fpsのためのtimerを設定し、ポーリングのみtimeupdateを追跡することによって、基本的ですcurrentTime。それは前回「大幅に」変更された場合は、私が求める前提としています。FWIW。

それはseekingイベントより先にtimeupdate「時々」火災(残念)ように見えるん。それは対前方のかどうかの違いを作るかもしれませんバックワードシークまたは若干の奇数

関連する問題