ホームページ ウェブフロントエンド H5 チュートリアル HTML5: Canvas を使用してビデオをリアルタイムで処理する

HTML5: Canvas を使用してビデオをリアルタイムで処理する

May 28, 2018 pm 05:58 PM
html html5

ドキュメントの内容

この記事で使用しているXHTMLドキュメントは以下のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style>
body {
background: black;
color:#CCCCCC;
}
#c2 {
background-image: url(foo.png);
background-repeat: no-repeat;
}
p {
float: left;
border :1px solid #444444;
padding:10px;
margin: 10px;
background:#3B3B3B;
}
</style>
<script type="text/javascript;version=1.8" src="main.js"></script>
</head>

<body onload="processor.doLoad()">
<p>
<video id="video" src="video.ogv" controls="true"/>
</p>
<p>
<canvas id="c1" width="160" height="96"/>
<canvas id="c2" width="160" height="96"/>
</p>
</body>
</html>
ログイン後にコピー

上記のコードの重要な部分は次のとおりです:

1. ID がそれぞれ c1 と c2 の 2 つのキャンバス要素を作成します。 c1 は現在のフレームの元のビデオを表示するために使用され、c2 はクロマキー特殊効果を実行した後にビデオを表示するために使用されます。c2 にはビデオの背景色の部分を置き換えるために使用される静止画像がプリロードされます。

2. JavaScript コードは main.js ファイルからインポートされます。このスクリプトは JavaScript 1.8 の機能を使用するため、スクリプトをインポートするときにバージョンが 22 行目で指定されます。

3. Web ページが読み込まれると、main.js のprocessor.doLoad() メソッドが実行されます。

JavaScript コード

main.js の JS コードには 3 つのメソッドが含まれています。

クロマキーの初期化

doLoad() メソッドは、XHTML ドキュメントが最初にロードされるときに呼び出されます。このメソッドの目的は、クロマキー処理コードに必要な変数を準備し、ユーザーがビデオの再生を開始したときを検出できるようにイベント リスナーを設定することです。

doLoad: function() {
this.video = document.getElementById("video");
this.c1 = document.getElementById("c1");
this.ctx1 = this.c1.getContext("2d");
this.c2 = document.getElementById("c2");
this.ctx2 = this.c2.getContext("2d");
let self = this;
this.video.addEventListener("play", function() {
self.width = self.video.videoWidth / 2;
self.height = self.video.videoHeight / 2;
self.timerCallback();
}, false);
},
ログイン後にコピー

このコードは、XHTML ドキュメント内の video 要素と 2 つの Canvas 要素への参照を取得し、さらに 2 つのキャンバスのグラフィックス コンテキストへの参照も取得します。これらは、クロマキー効果を実装するときに使用されます。

addEventListener() はビデオ要素をリッスンし、ユーザーがビデオの再生ボタンを押したときに呼び出されます。ユーザーの再生を処理するために、このコードはビデオの幅と高さを取得して半分にし (クロマキー効果を実行するときにビデオのサイズを半分にします)、次に timerCallback() メソッドを呼び出してビデオ キャプチャを開始します。および視覚効果の計算。

タイマー コールバック

タイマー コールバック関数は、ビデオの再生開始時 (「再生」イベントの発生時) に呼び出され、ビデオの各フレームにキーイング効果を実装するための独自の定期的な呼び出しを担当します。

timerCallback: function() {
if (this.video.paused || this.video.ended) {
return;
}
this.computeFrame();
let self = this;
setTimeout(function () {
self.timerCallback();
}, 0);
},
ログイン後にコピー

コールバック関数は、まずビデオが再生されているかどうかを確認し、再生されていない場合は何もせず、すぐに戻ります。

次に、computeFrame() メソッドを呼び出します。これにより、現在のビデオ フレームにクロマキー特殊効果が実行されます。

コールバック関数が最後に行うことは、できるだけ早く再呼び出しできるように setTimeout() を呼び出すことです。実際の環境では、ビデオのフレーム レートに基づいて呼び出し頻度を設定することがあります。

ビデオ フレーム データの処理

computeFrame() メソッドは、以下に示すように、実際には各フレームのデータを取得し、クロマキー特殊効果を実行する役割を果たします。

computeFrame: function() {
this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
let frame = this.ctx1.getImageData(0, 0, this.width, this.height);
let l = frame.data.length / 4;

for (let i = 0; i < l; i++) {
let r = frame.data[i * 4 + 0];
let g = frame.data[i * 4 + 1];
let b = frame.data[i * 4 + 2];
if (g > 100 && r > 100 && b < 43)
frame.data[i * 4 + 3] = 0;
}
this.ctx2.putImageData(frame, 0, 0);
return;
}
ログイン後にコピー

呼び出されると、video 要素は次のように最新のビデオ フレーム データを表示します:

HTML5: Canvas を使用してビデオをリアルタイムで処理する

2 行目で、ビデオ フレームが最初のキャンバスのグラフィックス コンテキスト ctx1 に高さと幅でコピーされます。値は、前に保存したフレームの半分のサイズとして指定されます。 video 要素を描画コンテキストのdrawImage() メソッドに渡すことで、現在のビデオ フレームを描画できることに注意してください。結果は次のようになります:

HTML5: Canvas を使用してビデオをリアルタイムで処理する

コードの 3 行目は、最初のキャンバス コンテキストの getImageData() メソッドを呼び出して、現在のビデオ フレームの元の画像データのコピーを取得します。生の 32 ビット ピクセル画像データが提供されるので、それを操作できます。コードの 4 行目では、フレーム画像データの全長を 4 で割ることにより、画像内の総ピクセル数を計算します。

コードの 6 行目は、すべてのピクセルをループし、各ピクセルの赤、緑、青の値を取得し、事前定義された背景色と比較します。これらの背景色は、インポートされた背景画像に置き換えられます。 foo.png。

背景として検出された各ピクセルについて、そのアルファ値をゼロに置き換え、ピクセルが完全に透明であることを示します。その結果、最終イメージの背景部分は 100% 透明になり、13 行目でターゲットのコンテキストに描画されると、コンテンツが静的な背景に重ね合わされるという効果が得られます。

結果の画像は次のようになります:

HTML5: Canvas を使用してビデオをリアルタイムで処理する

ビデオの再生中にこれを繰り返し実行すると、フレームごとに処理され、クロマキー効果が表示されます。

HTML5 の詳細については、Canvas を使用してビデオをリアルタイムで処理する、PHP 中国語 Web サイトに注目してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLの表の境界線 HTMLの表の境界線 Sep 04, 2024 pm 04:49 PM

HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML のネストされたテーブル HTML のネストされたテーブル Sep 04, 2024 pm 04:49 PM

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML 左マージン HTML 左マージン Sep 04, 2024 pm 04:48 PM

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

HTML テーブルのレイアウト HTML テーブルのレイアウト Sep 04, 2024 pm 04:54 PM

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML 順序付きリスト HTML 順序付きリスト Sep 04, 2024 pm 04:43 PM

HTML 順序付きリストのガイド。ここでは、HTML 順序付きリストと型の導入とその例についても説明します。

HTML 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

HTML入力プレースホルダー HTML入力プレースホルダー Sep 04, 2024 pm 04:54 PM

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

See all articles