HTMLビデオタグを使用してビデオを再生しています。ビデオの再生中、jqueryまたはjavascriptを使用して、ビデオの現在のフレームが "currentTime"ではないようにしたい.
ビデオのfpsとcurrentTimeの計算を行うことで現在のフレームを取得できますが、正確なフレーム番号がわかりません。これを修正する方法はありますか?
私はその問題の原因を見つけました。ビデオを圧縮していたため、圧縮中にfpsが減少したため、正しいfpsを取得できませんでした。これで、1〜2フレームの差で取得できますが、それで問題ありません。助けてくれてありがとう。
以下のデモをご覧ください。 1つだけ、ビデオのframeRateを割り当てる必要があります。外部Jはすべてのものを管理し、フレーム番号を簡単に取得できます。
var currentFrame = $('#currentFrame');
var video = VideoFrame({
id : 'video',
frameRate: 29.97,
callback : function(frame) {
currentFrame.html(frame);
}
});
$('#play-pause').click(function(){
ChangeButtonText();
});
function ChangeButtonText(){
if(video.video.paused){
video.video.play();
video.listen('frame');
$("#play-pause").html('Pause');
}else{
video.video.pause();
video.stopListen();
$("#play-pause").html('Play');
}
}
<script src="https://rawgit.com/allensarkisyan/VideoFrame/master/VideoFrame.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="frame">
<span id="currentFrame">0</span>
</div>
<video height="180" width="100%" id="video">
<source src="http://www.w3schools.com/html/mov_bbb.mp4"></source>
</video>
<div id="controls">
<button id="play-pause">Play</button>
</div>
現在のフレームの画像:
function captureVideo(video) {
var canvas = document.createElement("canvas");
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
var canvasContext = canvas.getContext("2d");
canvasContext.drawImage(video, 0, 0);
return canvas.toDataURL('image/png');
}
現在の時刻:
var frameAfterSeek = Math.floor(_video.currentTime);
私の知る限り、ブラウザ間で標準のフレームレートが設定されているか、html5ビデオを使用してボックスから現在のフレームにアクセスする方法があります。あなたができることは、毎秒29.97フレームのテレビ標準フレームレートを使用し、それをビデオの現在の時間で単純に乗算することです:(vid.currentTime * 29.97).toPrecision(6)
。
これがu-に役立つことを願って
var vid = $('#video1')[0];
$('#btn').bind('click', function() {
$('#time').html((vid.currentTime * 29.97).toPrecision(6));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<button id="btn">Get Frame</button><p id="time"></p>
<video id="video1" controls tabindex="0" autobuffer preload>
<source type="video/webm; codecs="vp8, vorbis"" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.webm"></source>
<source type="video/ogg; codecs="theora, vorbis"" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.ogv"></source>
<source type="video/mp4; codecs="avc1.42E01E, mp4a.40.2"" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.mp4"></source>
<p>Sorry, your browser does not support the <video> element.</p>
</video>
Popcorn.capture と呼ばれる Popcorn.js プラグインがあり、HTML5ビデオの任意のフレームからポスターを作成できます。
一部のデモは here です。
ドメイン間で要求されたリソースのピクセルデータの読み取りを禁止するブラウザーによって課される制限があります(フレームの現在の値を記録するために canvas API を使用)。このアプローチを機能させるには、ソースビデオが、それを要求しているスクリプトおよびHTMLページと同じドメインでホストされている必要があります。
このプラグインを使用してポスターを作成するコードは非常に簡単です。
// This block of code must be run _after_ the DOM is ready
// This will capture the frame at the 10th second and create a poster
var video = Popcorn( "#video-id" );
// Once the video has loaded into memory, we can capture the poster
video.listen( "canplayall", function() {
this.currentTime( 10 ).capture();
});
このパッチを使用しようとしましたか? https://github.com/X3TechnologyGroup/VideoFrame
私はそれがあなたを助けると信じています。