WebCodecsãçšããWebã¢ããªã±ãŒã·ã§ã³ã§ã®å ç¢ãªãããªã»ãªãŒãã£ãªåæå®çŸã®ããã®å æ¬çã¬ã€ããæè¡è©³çްã課é¡ã倿§ãªãã©ãããã©ãŒã ã§ã®ã¹ã ãŒãºãªåçã®ããã®ãã¹ããã©ã¯ãã£ã¹ã解説ã
ããã³ããšã³ãWebCodecsãã¬ãŒã ã¬ãŒãåæïŒãããªã»ãªãŒãã£ãªåæç®¡çã®ãã¹ã¿ãŒ
WebCodecs APIã¯ãWebãã©ãŠã¶å ã§çŽæ¥ã¡ãã£ã¢ã®ãšã³ã³ãŒããšãã³ãŒããåäŸã®ãªãã¬ãã«ã§å¶åŸ¡ã§ããŸãããã®åŒ·åãªæ©èœã¯ãé«åºŠãªãããªã»ãªãŒãã£ãªåŠçãäœé å»¶ã¹ããªãŒãã³ã°ãã«ã¹ã¿ã ã¡ãã£ã¢ã¢ããªã±ãŒã·ã§ã³ã®æ©äŒãåãéããŸãããããã倧ããªåã«ã¯å€§ããªè²¬ä»»ã䌎ããŸããã¹ã ãŒãºã§ãããã§ãã·ã§ãã«ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããããã«ã¯ããããªãšãªãŒãã£ãªã®åæãç¹ã«ãã¬ãŒã ã¬ãŒãã®äžè²«æ§ã管çããããšãéèŠãªèª²é¡ãšãªããŸãã
課é¡ã®çè§£ïŒãªãåæãéèŠãªã®ã
ãããããããªã¢ããªã±ãŒã·ã§ã³ã«ãããŠããããªã¹ããªãŒã ãšãªãŒãã£ãªã¹ããªãŒã ã®ã·ãŒã ã¬ã¹ãªé£æºã¯äžå¯æ¬ ã§ãããããã®ã¹ããªãŒã ãåæãããèµ·ãããšãèŠèŽè ã¯é¡èã§ãã©ã¹ãã¬ãŒã·ã§ã³ã®ããŸãåé¡ã«çŽé¢ããŸãã
- ãªããã·ã³ã¯ãšã©ãŒïŒãã£ã©ã¯ã¿ãŒã®å£ã®åããã話ããŠããèšèãšãããã
- ãªãŒãã£ãªããªããïŒãªãŒãã£ãªãåŸã ã«ãããªã«é ããããå è¡ãããããã
- éåãéåãã®åçïŒãã¬ãŒã ã¬ãŒãã®äžäžèŽã«ããããããªãäžå®å®ã«èŠããã
ãããã®åé¡ã¯ãç¹ã«ãããªäŒè°ããªã³ã©ã€ã³ã²ãŒã ããªã¢ã«ã¿ã€ã ã¹ããªãŒãã³ã°ãªã©ã®ã€ã³ã¿ã©ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã«ãããŠãèŠèŽäœéšãèããæãªãå¯èœæ§ããããŸããåæããã®èŠå ã¯æ§ã ã§ãããå®ç§ãªåæã®éæã¯ç¶ç¶çãªæŠãã§ãã
- å€åãããããã¯ãŒã¯æ¡ä»¶ïŒãããã¯ãŒã¯é å»¶ã垯åå¹ ã®å€åã¯ããããªããã³ãªãŒãã£ãªãã±ããã®å°çæéã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- ãã³ãŒããšãšã³ã³ãŒãã®ãªãŒããŒãããïŒã¡ãã£ã¢ããã³ãŒãããã³ãšã³ã³ãŒãããããã«å¿ èŠãªåŠçæéã¯ãããã€ã¹ã䜿çšãããã³ãŒããã¯ã«ãã£ãŠç°ãªãå ŽåããããŸãã
- ã¯ããã¯ããªããïŒã¡ãã£ã¢ãã€ãã©ã€ã³ã«é¢äžããç°ãªãããã€ã¹ïŒäŸïŒãµãŒããŒããã©ãŠã¶ããªãŒãã£ãªåºåïŒã®ã¯ããã¯ã¯ãå®å šã«åæããŠããªãå¯èœæ§ããããŸãã
- ã¢ãããã£ããããã¬ãŒãïŒABRïŒïŒABRã¢ã«ãŽãªãºã ã§ç°ãªãå質ã¬ãã«ãåãæ¿ããéã«ãæ³šææ·±ãåŠçããªããšåæã®åé¡ãçºçããå¯èœæ§ããããŸãã
WebCodecsã®åœ¹å²
WebCodecsã¯ããããã®èª²é¡ãJavaScriptã§çŽæ¥åŠçããããã®ãã«ãã£ã³ã°ãããã¯ãæäŸããŸããåã ã®ãããªãã¬ãŒã ãšãªãŒãã£ãªãã£ã³ã¯ã®ãšã³ã³ãŒãããã³ãã³ãŒãã®ããã®äœã¬ãã«APIãå ¬éããéçºè ã«ã¡ãã£ã¢ãã€ãã©ã€ã³ã®ãã现ããªå¶åŸ¡ãå¯èœã«ããŸãã
WebCodecsã¯ãåæã®èª²é¡ã«å¯ŸåŠããããã«æ¬¡ã®ããã«åœ¹ç«ã¡ãŸãã
- æ£ç¢ºãªã¿ã€ã ã¹ã¿ã³ãå¶åŸ¡ïŒãã³ãŒããããåãããªãã¬ãŒã ãšãªãŒãã£ãªãã£ã³ã¯ã«ã¯ãã¿ã€ã ã¹ã¿ã³ããé¢é£ä»ããããŠãããåã¡ãã£ã¢èŠçŽ ã®ãã¬ãŒã³ããŒã·ã§ã³æéã远跡ã§ããŸãã
- ã«ã¹ã¿ã åçã¹ã±ãžã¥ãŒãªã³ã°ïŒWebCodecsã¯ã¡ãã£ã¢ã®ã¬ã³ããªã³ã°æ¹æ³ãèŠå®ããŸãããéçºè ã¯ãã¿ã€ã ã¹ã¿ã³ãã«åºã¥ããŠãããªãã¬ãŒã ãšãªãŒãã£ãªãã£ã³ã¯ãæ£ããæéã«è¡šç€ºãããããã«ãã«ã¹ã¿ã åçã¹ã±ãžã¥ãŒãªã³ã°ããžãã¯ãå®è£ ã§ããŸãã
- ãšã³ã³ãŒãããŒã¿ãžã®çŽæ¥ã¢ã¯ã»ã¹ïŒWebCodecsã¯ãšã³ã³ãŒãããŒã¿ã®æäœãå¯èœã«ããåæãšã©ãŒãè£åããããã®ãã¬ãŒã ããããããªãŒãã£ãªã¹ãã¬ãããªã©ã®é«åºŠãªæè¡ãå¯èœã«ããŸãã
ã³ã¢ã³ã³ã»ããïŒã¿ã€ã ã¹ã¿ã³ãããã¬ãŒã ã¬ãŒããã¯ããã¯ããªãã
ã¿ã€ã ã¹ã¿ã³ã
ã¿ã€ã ã¹ã¿ã³ãã¯ãããããåææŠç¥ã®åºç€ã§ããWebCodecsã§ã¯ãåVideoFrameããã³AudioDataãªããžã§ã¯ãã«ã¯timestampããããã£ãããããã€ã¯ãç§åäœã§æž¬å®ãããã¡ãã£ã¢èŠçŽ ã®æå³ããããã¬ãŒã³ããŒã·ã§ã³æéã衚ããŸãããããã®ã¿ã€ã ã¹ã¿ã³ãã®èµ·æºãšæå³ãçè§£ããããšãéèŠã§ãã
äŸãã°ããããªã¹ããªãŒã ã§ã¯ãã¿ã€ã ã¹ã¿ã³ãã¯éåžžããããªã®éå§æç¹ããã®ãã¬ãŒã ã®æå³ããã衚瀺æéã衚ããŸããåæ§ã«ããªãŒãã£ãªã¿ã€ã ã¹ã¿ã³ãã¯ããªãŒãã£ãªã¹ããªãŒã ã®éå§æç¹ããã®ãªãŒãã£ãªããŒã¿ã®éå§æéã瀺ããŸãããªãŒãã£ãªãšãããªã®ã¿ã€ã ã¹ã¿ã³ããæ£ç¢ºã«æ¯èŒããããã«ã¯ãäžè²«ããã¿ã€ã ã©ã€ã³ãç¶æããããšãéèŠã§ãã
ãªã¢ãŒããµãŒããŒãããããªããã³ãªãŒãã£ãªããŒã¿ãåä¿¡ããŠããã·ããªãªãèããŠã¿ãŸããããçæ³çã«ã¯ããµãŒããŒãäž¡æ¹ã®ã¹ããªãŒã ã«å¯ŸããŠäžè²«æ§ã®ããæ£ç¢ºãªã¿ã€ã ã¹ã¿ã³ããçæãã責任ãè² ãã¹ãã§ãããµãŒããŒãã¿ã€ã ã¹ã¿ã³ããæäŸããªãå ŽåããŸãã¯ã¿ã€ã ã¹ã¿ã³ããä¿¡é Œã§ããªãå ŽåãããŒã¿ã®å°çæéã«åºã¥ããŠç¬èªã®ã¿ã€ã ã¹ã¿ã³ãã¡ã«ããºã ãå®è£ ããå¿ èŠããããããããŸããã
ãã¬ãŒã ã¬ãŒã
ãã¬ãŒã ã¬ãŒããšã¯ã1ç§éã«è¡šç€ºããããããªãã¬ãŒã ã®æ°ïŒFPSïŒãæããŸããã¹ã ãŒãºãªãããªåçã«ã¯ãäžè²«ãããã¬ãŒã ã¬ãŒãã®ç¶æãäžå¯æ¬ ã§ããWebCodecsã§ã¯ããšã³ã³ãŒãäžããã³ãã³ãŒãäžã«ãã¬ãŒã ã¬ãŒãã«åœ±é¿ãäžããããšãã§ããŸããã³ãŒããã¯æ§æãªããžã§ã¯ãã«ãããåžæãããã¬ãŒã ã¬ãŒããèšå®ã§ããŸããããããå®éã®ãã¬ãŒã ã¬ãŒãã¯ããããªã³ã³ãã³ãã®è€éããããã€ã¹ã®åŠçèœåã«ãã£ãŠç°ãªãå ŽåããããŸãã
ãããªããã³ãŒãããéã«ã¯ãåãã¬ãŒã ã®å®éã®ãã³ãŒãæéã远跡ããããšãäžå¯æ¬ ã§ãããã¬ãŒã ã®ãã³ãŒãã«äºæ³ä»¥äžã®æéããããå Žåãäžè²«ããåçã¬ãŒããç¶æããããã«ãåŸç¶ã®ãã¬ãŒã ãããããããå¿ èŠããããããããŸãããããã«ã¯ãäºæ³ããããã¬ãŒã³ããŒã·ã§ã³æéïŒãã¬ãŒã ã¬ãŒãã«åºã¥ãïŒãšå®éã®ãã³ãŒãæéãæ¯èŒãããã¬ãŒã ã衚瀺ãããããããããããæ±ºå®ããããšãå«ãŸããŸãã
ã¯ããã¯ããªãã
ã¯ããã¯ããªãããšã¯ãç°ãªãããã€ã¹ãŸãã¯ããã»ã¹éã®ã¯ããã¯ãåŸã ã«ãããããšãæããŸããã¡ãã£ã¢åçã®æèã§ã¯ãã¯ããã¯ããªããã¯ããªãŒãã£ãªãšãããªãæéãšãšãã«åŸã ã«åæãããèµ·ããåå ãšãªãå¯èœæ§ããããŸããããã¯ããªãŒãã£ãªããã³ãããªãã³ãŒããŒããããã«ç°ãªãã¯ããã¯ã«åºã¥ããŠåäœããŠããå¯èœæ§ãããããã§ããã¯ããã¯ããªããã«å¯Ÿæããããã«ã¯ãããªãããè£åããããã«åçã¬ãŒãã宿çã«èª¿æŽããåæã¡ã«ããºã ãå®è£ ããããšãäžå¯æ¬ ã§ãã
äžè¬çãªææ³ã®1ã€ã¯ããªãŒãã£ãªãšãããªã®ã¿ã€ã ã¹ã¿ã³ãéã®å·®ãç£èŠããããã«å¿ããŠãªãŒãã£ãªåçã¬ãŒãã調æŽããããšã§ããäŸãã°ããªãŒãã£ãªãåžžã«ãããªããå è¡ããŠããå ŽåããªãŒãã£ãªåçã¬ãŒãããããã«é ãããŠåæãåãæ»ãããšãã§ããŸããéã«ããªãŒãã£ãªããããªã«é ããŠããå ŽåããªãŒãã£ãªåçã¬ãŒãããããã«éãããããšãã§ããŸãã
WebCodecsã«ãããã¬ãŒã ã¬ãŒãåæã®å®è£ ïŒã¹ããããã€ã¹ãããã¬ã€ã
WebCodecsã䜿çšããŠå ç¢ãªãã¬ãŒã ã¬ãŒãåæãå®è£ ããããã®å®è·µçãªã¬ã€ãã以äžã«ç€ºããŸãã
- ãããªããã³ãªãŒãã£ãªãã³ãŒããŒã®åæåïŒ
ãŸããå¿ èŠãªã³ãŒããã¯æ§æãæå®ããŠã
```javascript const videoDecoder = new VideoDecoder({ config: { codec: 'avc1.42E01E', // äŸïŒH.264 Baseline Profile codedWidth: 640, codedHeight: 480, framerate: 30, }, error: (e) => console.error('Video decoder error:', e), output: (frame) => { // ãã³ãŒãããããããªãã¬ãŒã ãåŠçããŸãïŒã¹ããã4ãåç §ïŒ handleDecodedVideoFrame(frame); }, }); const audioDecoder = new AudioDecoder({ config: { codec: 'opus', sampleRate: 48000, numberOfChannels: 2, }, error: (e) => console.error('Audio decoder error:', e), output: (audioData) => { // ãã³ãŒãããããªãŒãã£ãªããŒã¿ãåŠçããŸãïŒã¹ããã5ãåç §ïŒ handleDecodedAudioData(audioData); }, }); ```VideoDecoderããã³AudioDecoderã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãããããªãã³ãŒããŒã«èšå®ããããã¬ãŒã ã¬ãŒããããããªã¹ããªãŒã ã®äºæ³ããããã¬ãŒã ã¬ãŒããšäžèŽããŠããããšã確èªããŠãã ããã - ãšã³ã³ãŒããããã¡ãã£ã¢ããŒã¿ã®åä¿¡ïŒ
ãœãŒã¹ïŒäŸïŒãããã¯ãŒã¯ã¹ããªãŒã ããã¡ã€ã«ïŒãããšã³ã³ãŒãããããããªããã³ãªãŒãã£ãªããŒã¿ãååŸããŸãããã®ããŒã¿ã¯éåžžã
```javascript // äŸïŒWebSocketãããšã³ã³ãŒãããããããªãšãªãŒãã£ãªãã£ã³ã¯ãåä¿¡ socket.addEventListener('message', (event) => { const data = new Uint8Array(event.data); if (isVideoChunk(data)) { const chunk = new EncodedVideoChunk({ type: 'key', timestamp: getVideoTimestamp(data), data: data.slice(getVideoDataOffset(data)), }); videoDecoder.decode(chunk); } else if (isAudioChunk(data)) { const chunk = new EncodedAudioChunk({ type: 'key', timestamp: getAudioTimestamp(data), data: data.slice(getAudioDataOffset(data)), }); audioDecoder.decode(chunk); } }); ```EncodedVideoChunkããã³EncodedAudioChunkãªããžã§ã¯ãã®åœ¢åŒã«ãªããŸãã - ã¡ãã£ã¢ããŒã¿ã®ãã³ãŒãïŒ
decode()ã¡ãœããã䜿çšããŠããšã³ã³ãŒãããããããªããã³ãªãŒãã£ãªãã£ã³ã¯ãããããã®ãã³ãŒããŒã«æž¡ããŸãããã³ãŒããŒã¯éåæã«ããŒã¿ãåŠçããèšå®ãããåºåãã³ãã©ãŒãéããŠãã³ãŒãããããã¬ãŒã ãšãªãŒãã£ãªããŒã¿ãåºåããŸãã - ãã³ãŒãããããããªãã¬ãŒã ã®åŠçïŒ
ãããªãã³ãŒããŒã®åºåãã³ãã©ãŒã¯
```javascript let lastVideoTimestamp = 0; const frameInterval = 1000 / 30; // 30 FPSã®äºæ³éé function handleDecodedVideoFrame(frame) { const now = performance.now(); const expectedTimestamp = lastVideoTimestamp + frameInterval; const delay = now - expectedTimestamp; if (delay > 2 * frameInterval) { // ãã¬ãŒã ãå€§å¹ ã«é å»¶ããŠãããããããããããŸã frame.close(); console.warn('Dropping delayed video frame'); } else { // ãã¬ãŒã ã衚瀺ããŸãïŒäŸïŒãã£ã³ãã¹ã«æç»ïŒ presentVideoFrame(frame); } lastVideoTimestamp = now; } function presentVideoFrame(frame) { const canvas = document.getElementById('video-canvas'); const ctx = canvas.getContext('2d'); ctx.drawImage(frame, 0, 0, canvas.width, canvas.height); frame.close(); // ãã¬ãŒã ã®ãªãœãŒã¹ãè§£æŸããŸã } ```VideoFrameãªããžã§ã¯ããåãåããŸããããã§ããã¬ãŒã ã¬ãŒãåæã®ã³ã¢ããžãã¯ãå®è£ ããŸããèšå®ããããã¬ãŒã ã¬ãŒãã«åºã¥ããŠãåãã¬ãŒã ã®äºæ³ããããã¬ãŒã³ããŒã·ã§ã³æéã远跡ããŸããäºæ³ããããã¬ãŒã³ããŒã·ã§ã³æéãšãã¬ãŒã ããã³ãŒããããå®éã®æéãšã®å·®ãèšç®ããŸããå·®ãç¹å®ã®ãããå€ãè¶ ããå Žåã¯ãéåããé²ãããã«ãã¬ãŒã ãããããããããšãæ€èšããŠãã ããã - ãã³ãŒãããããªãŒãã£ãªããŒã¿ã®åŠçïŒ
ãªãŒãã£ãªãã³ãŒããŒã®åºåãã³ãã©ãŒã¯
```javascript const audioContext = new AudioContext(); let lastAudioTimestamp = 0; function handleDecodedAudioData(audioData) { const audioBuffer = audioContext.createBuffer( audioData.numberOfChannels, audioData.numberOfFrames, audioData.sampleRate ); for (let channel = 0; channel < audioData.numberOfChannels; channel++) { const channelData = audioBuffer.getChannelData(channel); audioData.copyTo(channelData, { planeIndex: channel }); } const source = audioContext.createBufferSource(); source.buffer = audioBuffer; source.connect(audioContext.destination); source.start(audioContext.currentTime + (audioData.timestamp - lastAudioTimestamp) / 1000000); lastAudioTimestamp = audioData.timestamp; } ```AudioDataãªããžã§ã¯ããåãåããŸãããããªãã¬ãŒã ãšåæ§ã«ãåãªãŒãã£ãªãã£ã³ã¯ã®äºæ³ããããã¬ãŒã³ããŒã·ã§ã³æéã远跡ããŸããAudioContextã䜿çšããŠãªãŒãã£ãªããŒã¿ã®åçãã¹ã±ãžã¥ãŒã«ããŸããã¯ããã¯ããªãããè£åãããããªã¹ããªãŒã ãšã®åæãç¶æããããã«ãAudioContextã®åçã¬ãŒãã調æŽã§ããŸãã - ã¯ããã¯ããªããè£åã®å®è£
ïŒ
ãªãŒãã£ãªãšãããªã®å¹³åã¿ã€ã ã¹ã¿ã³ãéã®å·®ã宿çã«ç£èŠããŸããå·®ãæéãšãšãã«äžè²«ããŠå¢å ãŸãã¯æžå°ããå Žåãã¯ããã¯ããªãããè£åããããã«ãªãŒãã£ãªåçã¬ãŒãã調æŽããŸããæ¥æ¿ãªå€åãé¿ããããã«ãå°ããªèª¿æŽä¿æ°ã䜿çšããŸãã
```javascript let audioVideoTimestampDifference = 0; let timestampSamples = []; const MAX_TIMESTAMP_SAMPLES = 100; function updateAudioVideoTimestampDifference(audioTimestamp, videoTimestamp) { const difference = audioTimestamp - videoTimestamp; timestampSamples.push(difference); if (timestampSamples.length > MAX_TIMESTAMP_SAMPLES) { timestampSamples.shift(); } audioVideoTimestampDifference = timestampSamples.reduce((a, b) => a + b, 0) / timestampSamples.length; // å¹³åå·®ã«åºã¥ããŠãªãŒãã£ãªåçã¬ãŒãã調æŽããŸã const playbackRateAdjustment = 1 + (audioVideoTimestampDifference / 1000000000); // å°ããªèª¿æŽä¿æ° audioContext.playbackRate.value = playbackRateAdjustment; } ```
åæã®ããã®é«åºŠãªãã¯ããã¯
ãã¬ãŒã ãããããšãªãŒãã£ãªã¹ãã¬ãã
åæãšã©ãŒã倧ããå Žåããã¬ãŒã ãããããšãªãŒãã£ãªã¹ãã¬ããã䜿çšããŠè£åã§ããŸãããã¬ãŒã ããããã¯ããããªããªãŒãã£ãªãšåæãããããã«ãããªãã¬ãŒã ãã¹ãããããããšãå«ã¿ãŸãããªãŒãã£ãªã¹ãã¬ããã¯ããããªã«åãããããã«ãªãŒãã£ãªåçããããã«éããããé ããããããããšãå«ã¿ãŸãããã ãããããã®ãã¯ããã¯ã¯ãç®ã«èŠããã¢ãŒãã£ãã¡ã¯ããå°å ¥ããå¯èœæ§ããããããæ§ããã«äœ¿çšããå¿ èŠããããŸãã
ã¢ãããã£ããããã¬ãŒãïŒABRïŒã®èæ ®äºé
ã¢ãããã£ããããã¬ãŒãã¹ããªãŒãã³ã°ã䜿çšããå Žåãç°ãªãå質ã¬ãã«ãåãæ¿ããããšã¯åæã®èª²é¡ãåŒãèµ·ããå¯èœæ§ããããŸããç°ãªãå質ã¬ãã«éã§ã¿ã€ã ã¹ã¿ã³ããäžè²«ããŠããããšã確èªããŠãã ãããå質ã¬ãã«ãåãæ¿ããéã«ã¯ãã·ãŒã ã¬ã¹ãªåæã確ä¿ããããã«ãåçäœçœ®ã®å°ããªèª¿æŽãå¿ èŠã«ãªãå ŽåããããŸãã
ãã³ãŒãã®ããã®ã¯ãŒã«ãŒã»ã¹ã¬ãã
ãããªãšãªãŒãã£ãªã®ãã³ãŒãã¯ãç¹ã«é«è§£å床ã³ã³ãã³ãã®å Žåãèšç®è² è·ãé«ãå¯èœæ§ããããŸããã¡ã€ã³ã¹ã¬ããã®ãããã¯ãUIã®é å»¶ãé²ãããã«ããã³ãŒãããã»ã¹ãã¯ãŒã«ãŒã»ã¹ã¬ããã«ãªãããŒãããããšãæ€èšããŠãã ãããããã«ããããã³ãŒããããã¯ã°ã©ãŠã³ãã§å®è¡ã§ããã¡ã€ã³ã¹ã¬ããã¯UIã®æŽæ°ããã®ä»ã®ã¿ã¹ã¯ãåŠçããããã«è§£æŸãããŸãã
ãã¹ããšãããã°
ããŸããŸãªããã€ã¹ããããã¯ãŒã¯æ¡ä»¶ã§å ç¢ãªåæã確ä¿ããã«ã¯ã培åºçãªãã¹ããäžå¯æ¬ ã§ããåæããžãã¯ã®ããã©ãŒãã³ã¹ãè©äŸ¡ããããã«ãããŸããŸãªãã¹ããããªãšãªãŒãã£ãªã¹ããªãŒã ã䜿çšããŠãã ããããªããã·ã³ã¯ãšã©ãŒããªãŒãã£ãªããªãããéåãéåãã®åçã«çްå¿ã®æ³šæãæã£ãŠãã ããã
åæã®åé¡ã®ãããã°ã¯å°é£ãªå ŽåããããŸãããã®ã³ã°ãšããã©ãŒãã³ã¹ç£èŠããŒã«ã䜿çšããŠããããªãã¬ãŒã ãšãªãŒãã£ãªãã£ã³ã¯ã®ã¿ã€ã ã¹ã¿ã³ãããã³ãŒãæéããªãŒãã£ãªåçã¬ãŒãã远跡ããŠãã ããããã®æ å ±ã¯ãåæãšã©ãŒã®æ ¹æ¬åå ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
WebCodecså®è£ ã®ããã®ã°ããŒãã«ãªèæ ®äºé
åœéåïŒi18nïŒ
WebCodecsã䜿çšããŠWebã¢ããªã±ãŒã·ã§ã³ãéçºããéã«ã¯ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«å¯Ÿå¿ããããã«åœéåã®åŽé¢ãèæ ®ããŠãã ãããããã«ã¯ä»¥äžãå«ãŸããŸãã
- èšèªãµããŒãïŒã¢ããªã±ãŒã·ã§ã³ããããã¹ãããã³ãªãŒãã£ãªã³ã³ãã³ããå«ãè€æ°ã®èšèªããµããŒãããŠããããšã確èªããŠãã ããã
- åå¹ãšãã£ãã·ã§ã³ïŒãããªã³ã³ãã³ããããå¹ åºããªãŒãã£ãšã³ã¹ã«å©çšã§ããããã«ãããŸããŸãªèšèªã®åå¹ãšãã£ãã·ã§ã³ã®ãµããŒããæäŸããŠãã ããã
- æåãšã³ã³ãŒãã£ã³ã°ïŒUTF-8ãšã³ã³ãŒãã£ã³ã°ã䜿çšããŠãããŸããŸãªèšèªã®æåãæ£ããåŠçããŠãã ããã
ã¢ã¯ã»ã·ããªãã£ïŒa11yïŒ
ã¢ã¯ã»ã·ããªãã£ã¯ãWebã¢ããªã±ãŒã·ã§ã³ãé害ãæã€äººã ãå©çšã§ããããã«ããããã«äžå¯æ¬ ã§ããWebCodecsãå®è£ ããéã«ã¯ãWebã³ã³ãã³ãã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ïŒWCAGïŒãªã©ã®ã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ã«ã¢ããªã±ãŒã·ã§ã³ãæºæ ããŠããããšã確èªããŠãã ãããããã«ã¯ä»¥äžãå«ãŸããŸãã
- ããŒããŒãããã²ãŒã·ã§ã³ïŒã¢ããªã±ãŒã·ã§ã³å ã®ãã¹ãŠã®ã€ã³ã¿ã©ã¯ãã£ãèŠçŽ ãããŒããŒãã䜿çšããŠã¢ã¯ã»ã¹ã§ããããã«ããŠãã ããã
- ã¹ã¯ãªãŒã³ãªãŒããŒäºææ§ïŒã¢ããªã±ãŒã·ã§ã³ããèŠèŠé害ã®ãã人ã ã䜿çšããã¹ã¯ãªãŒã³ãªãŒããŒãšäºææ§ãããããšã確èªããŠãã ããã
- è²ã®ã³ã³ãã©ã¹ãïŒããã¹ããšèæ¯ã®éã«ååãªè²ã®ã³ã³ãã©ã¹ãã䜿çšããŠãäœèŠåã®äººãã³ã³ãã³ããèªã¿ãããããŠãã ããã
倿§ãªããã€ã¹ã§ã®ããã©ãŒãã³ã¹æé©å
Webã¢ããªã±ãŒã·ã§ã³ã¯ããã€ãšã³ããã¹ã¯ãããããäœé»åã¢ãã€ã«ããã€ã¹ãŸã§ãå¹ åºãããã€ã¹ã§ããŸãæ©èœããå¿ èŠããããŸããWebCodecsãå®è£ ããéã«ã¯ãããã©ãŒãã³ã¹ã®ããã«ã³ãŒããæé©åããããŸããŸãªããã€ã¹ã§ã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããŠãã ãããããã«ã¯ä»¥äžãå«ãŸããŸãã
- ã³ãŒããã¯ã®éžæïŒã¿ãŒã²ããããã€ã¹ãšãããã¯ãŒã¯æ¡ä»¶ã«åºã¥ããŠé©åãªã³ãŒããã¯ãéžæããŠãã ãããäžéšã®ã³ãŒããã¯ã¯ãä»ã®ã³ãŒããã¯ãããèšç®å¹çãé«ãã§ãã
- è§£å床ã¹ã±ãŒãªã³ã°ïŒããã€ã¹ã®ç»é¢ãµã€ãºãšåŠçèœåã«åºã¥ããŠãããªè§£å床ãã¹ã±ãŒãªã³ã°ããŸãã
- ã¡ã¢ãªç®¡çïŒã¡ã¢ãªãªãŒã¯ãããã©ãŒãã³ã¹ã®åé¡ãåé¿ããããã«ãã¡ã¢ãªãå¹ççã«ç®¡çããŠãã ããã
çµè«
WebCodecsã§å ç¢ãªãããªã»ãªãŒãã£ãªåæãå®çŸããã«ã¯ãæ éãªèšç»ãå®è£ ããã¹ããå¿ èŠã§ããã¿ã€ã ã¹ã¿ã³ãããã¬ãŒã ã¬ãŒããã¯ããã¯ããªããã®ã³ã¢ã³ã³ã»ãããçè§£ãããã®èšäºã§æŠèª¬ããã¹ããããã€ã¹ãããã¬ã€ãã«åŸãããšã§ãããŸããŸãªãã©ãããã©ãŒã ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãããã·ãŒã ã¬ã¹ã§ãããã§ãã·ã§ãã«ãªã¡ãã£ã¢åçãšã¯ã¹ããªãšã³ã¹ãæäŸããWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããçã«å æ¬çã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªã¢ããªã±ãŒã·ã§ã³ãäœæããããã«ãåœéåãã¢ã¯ã»ã·ããªãã£ãããã©ãŒãã³ã¹æé©åãèæ ®ããããšãå¿ããªãã§ãã ãããWebCodecsã®åãæŽ»çšãããã©ãŠã¶ã§ã®ã¡ãã£ã¢åŠçã®æ°ããªå¯èœæ§ãè§£ãæŸã¡ãŸãããïŒ