HLS.js使用ガイドとベストプラクティス
HLS.jsの動作原理、活用シーン、メリット・デメリットを深く解説。完全なコード例とよくある問題の解決策を提供します。
続きを読む →基礎から応用まで、Web動画再生の技術体系を網羅的に理解
HTML5が登場する前、Webでの動画再生は主にFlashやQuickTimeなどのサードパーティプラグインに依存していました。HTML5ではネイティブの <video> タグが導入され、ブラウザでの動画再生がネイティブでサポートされるようになりました。これはWeb動画の歴史における重要なマイルストーンです。
videoタグを使って動画を再生するのは非常に簡単で、数行のコードで実現できます:
<video src="video.mp4" controls width="640" height="360">
お使いのブラウザは動画再生に対応していません
</video>
ブラウザによって対応している動画フォーマットが異なり、これは初期のHTML5動画が直面した最大の課題でした:
すべてのブラウザに対応するため、sourceタグを使用して複数のフォーマットを提供できます:
<video controls>
<source src="video.mp4" type="video/mp4">
<source src="video.webm" type="video/webm">
お使いのブラウザは動画再生に対応していません
</video>
ネイティブvideoタグはシンプルで使いやすい一方、明らかな限界もあります:
Media Source Extensions(MSE)はW3Cが策定したAPI標準で、JavaScriptがメディアデータを動的にvideoタグに注入できるようにし、ストリーミング配信を実現します。MSEは現代のWeb動画再生のコア技術であり、HLS.jsやdash.jsなどのプレーヤーはすべてMSEをベースに実装されています。
MSEの基本的なワークフローは以下の通りです:
const video = document.querySelector('video');
const mediaSource = new MediaSource();
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function() {
const sourceBuffer = mediaSource.addSourceBuffer('video/mp4; codecs="avc1.42E01E, mp4a.40.2"');
fetch('video-chunk.mp4')
.then(response => response.arrayBuffer())
.then(data => {
sourceBuffer.appendBuffer(data);
});
});
Encrypted Media Extensions(EME)は、DRM(デジタル著作権管理)で保護されたメディアコンテンツを再生するための重要なAPIです。Netflix、YouTube Premium、Disney+などの動画サイトは、動画コンテンツの海賊版対策としてEMEを使用しています。
ブラウザやデバイスによって対応しているDRMシステムが異なります:
const video = document.querySelector('video');
navigator.requestMediaKeySystemAccess('com.widevine.alpha', [
{
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
}
]).then(access => {
return access.createMediaKeys();
}).then(mediaKeys => {
return video.setMediaKeys(mediaKeys);
}).then(() => {
video.src = 'encrypted-video.mp4';
video.play();
});
WebCodecsはブラウザが提供する低レベルAPIで、Web開発者がブラウザに内蔵されたメディアコーデックに直接アクセスできるようにします。MSEと比較して、WebCodecsはより低レベルで柔軟性が高く、パフォーマンスも優れており、Web動画技術の将来の方向性です。
const decoder = new VideoDecoder({
output: frame => {
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
ctx.drawImage(frame, 0, 0);
frame.close();
},
error: e => console.error(e)
});
decoder.configure({
codec: 'vp09.00.10.08',
codedWidth: 1280,
codedHeight: 720
});
fetch('encoded-chunk.vp9')
.then(res => res.arrayBuffer())
.then(data => {
const chunk = new EncodedVideoChunk({
type: 'key',
timestamp: 0,
data: data
});
decoder.decode(chunk);
});
Flash Playerを代表として、ブラウザ自体は動画に対応しておらず、サードパーティ製プラグインのインストールが必要でした。メリットはフォーマットが統一され機能が豊富なこと、デメリットはセキュリティ面の脆弱性、低パフォーマンス、モバイルデバイス非対応でした。
HTML5 videoタグが登場し、ブラウザがネイティブで動画再生に対応しました。メリットはプラグイン不要でパフォーマンスが良いこと、デメリットはストリーミングとDRMに非対応で、フォーマットが統一されていないことでした。
MSEとEMEが標準化され、ストリーミング配信とDRMが可能になりました。HLS.js、dash.jsなどMSEベースのプレーヤーが多数登場し、Web動画の体験が大幅に向上しました。アダプティブビットレートや暗号化再生が標準機能となりました。
WebCodecs APIが低レベルなコーデック機能を提供し、WebAssemblyのパフォーマンスが大幅に向上しました。ブラウザでより複雑な動画処理が可能になり、クラウドゲーミング、動画編集、リアルタイム通信などのアプリケーションが盛んに発展しています。
ブラウザ動画再生技術は、プラグインからネイティブへ、単純な再生からストリーミングへ、固定フォーマットから柔軟な制御へと進化してきました。HTML5 videoタグが基礎であり、MSEがストリーミング再生を可能にし、EMEがコンテンツ保護を実現し、WebCodecsがより広範な可能性を切り開いています。
これらの技術原理を理解することで、Web動画プレーヤーの仕組みをより深く理解できます。これらの技術の実際の効果を体験したい方は、M3U8オンラインプレーヤーをご利用ください。HLS.jsとMSE技術をベースに実装されており、ブラウザで直接HLSストリーミングを再生できます。
その他の役立つ記事とツール