ããã³ããšã³ãWebCodecsã®ãã¬ãŒã ã¬ãŒãå¶åŸ¡ãæ·±ãæãäžããWebã¢ããªã±ãŒã·ã§ã³ã§ã¹ã ãŒãºãã€å¹ççãªãããªåçãå®çŸããããã®ãããªãã¬ãŒã ã¿ã€ãã³ã°ç®¡çæè¡ãæ¢ããŸãã
ããã³ããšã³ãWebCodecsãã¬ãŒã ã¬ãŒãå¶åŸ¡ïŒãããªãã¬ãŒã ã¿ã€ãã³ã°ç®¡çã®ç¿åŸ
WebCodecs APIã¯ãWebã¢ããªã±ãŒã·ã§ã³ã«ããããããªåŠçã®æ¹æ³ã«é©åœããããããŠããŸããããã«ãããéçºè ã¯ãã©ãŠã¶ã®åºç€ãšãªãã¡ãã£ã¢ã³ãŒããã¯ã«çŽæ¥ã¢ã¯ã»ã¹ã§ãã以åã¯ãã€ãã£ãæè¡ã§ããäžå¯èœã ã£ã匷åã§å¹ççãªãããªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããããªåŠçã®éèŠãªåŽé¢ã®äžã€ããã¬ãŒã ã¬ãŒãå¶åŸ¡ã§ããããããç¿åŸããããšã¯ãã¹ã ãŒãºã§äžè²«ããèŠèŽäœéšãæäŸããããã«äžå¯æ¬ ã§ãããã®èšäºã§ã¯ãWebCodecsã«ããããã¬ãŒã ã¬ãŒãå¶åŸ¡ã®è€éããããããªãã¬ãŒã ã¿ã€ãã³ã°ç®¡çã«çŠç¹ãåœãŠãŠæ¢ããŸãã
ãã¬ãŒã ã¬ãŒããšãã®éèŠæ§ã®çè§£
ãã¬ãŒã ã¬ãŒãã¯ã1ç§ãããã®ãã¬ãŒã æ°ïŒFPSïŒã§æž¬å®ãããåãã®é¯èŠãçã¿åºãããã«1ç§éã«è¡šç€ºããã鿢ç»åã®æ°ã決å®ããŸããäžè¬çã«ããã¬ãŒã ã¬ãŒããé«ãã»ã©ãããªã¯æ»ããã«ãªããäœããšåçãã«ã¯ã«ã¯ããããéåãããããããšããããŸãã人éã®ç®ã¯ãéåžž24 FPS以äžã®é«ããã¬ãŒã ã¬ãŒãã§åããããæ»ããã«ç¥èŠããŸãããããªã²ãŒã ã§ã¯ãããå¿çæ§ãé«ãæ²¡å ¥æã®ããäœéšã®ããã«ããã°ãã°60 FPS以äžãç®æšãšããŸãã
WebCodecsã§ã¯ãæãŸãããã¬ãŒã ã¬ãŒããéæããããšã¯å¿ ãããç°¡åã§ã¯ãããŸããããããã¯ãŒã¯ç¶æ³ãåŠçèœåããããªã³ã³ãã³ãã®è€éããªã©ã®èŠå ããå®éã®ãã¬ãŒã ã¬ãŒãã«åœ±é¿ãäžããå¯èœæ§ããããŸããå€åããæ¡ä»¶äžã§ãäžè²«æ§ã®ããèŠèŠçã«å¿«é©ãªåçäœéšãç¶æããããã«ã¯ããã¬ãŒã ã¿ã€ãã³ã°ãé©åã«ç®¡çããããšãéèŠã§ãã
WebCodecsïŒç°¡åãªæŠèŠ
ãã¬ãŒã ã¬ãŒãå¶åŸ¡ã«æ·±ãå ¥ãåã«ãWebCodecs APIã®äž»èŠã³ã³ããŒãã³ããç°¡åã«åŸ©ç¿ããŸãããïŒ
VideoEncoderïŒçã®ãããªãã¬ãŒã ãå§çž®ããããããªããŒã¿ã«ãšã³ã³ãŒãããŸããVideoDecoderïŒå§çž®ããããããªããŒã¿ãçã®ãããªãã¬ãŒã ã«ãã³ãŒãããŸããEncodedVideoChunkïŒåäžã®ãšã³ã³ãŒãããããããªãã¬ãŒã ã衚ããŸããVideoFrameïŒåäžã®ãã³ãŒãããããããªãã¬ãŒã ã衚ããŸããMediaStreamTrackProcessorïŒMediaStreamTrackïŒäŸïŒãŠã§ãã«ã¡ã©ãç»é¢ãã£ããã£ããïŒãåŠçããçã®ãããªãã¬ãŒã ãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
ãããã®ã³ã³ããŒãã³ãã䜿çšããããšã§ãéçºè ã¯ãšã³ã³ãŒãããã³ãŒãããã©ã³ã¹ã³ãŒãã£ã³ã°ããããªãšãã§ã¯ãã®é©çšãªã©ãããŸããŸãªæäœãå®è¡ããã«ã¹ã¿ã ãããªãã€ãã©ã€ã³ãæ§ç¯ã§ããŸãã
WebCodecsã«ããããã¬ãŒã ã¿ã€ãã³ã°ç®¡çæè¡
ãã¬ãŒã ã¿ã€ãã³ã°ç®¡çã«ã¯ããã¬ãŒã ããã€ãã©ã®ãããã®é »åºŠã§ãã³ãŒããã衚瀺ãããããå¶åŸ¡ããããšãå«ãŸããŸããWebCodecsã§æ£ç¢ºãªãã¬ãŒã ã¬ãŒãå¶åŸ¡ãå®çŸããããã«äœ¿çšã§ããããã€ãã®æè¡ã以äžã«ç€ºããŸãïŒ
1. ãã¬ãŒã³ããŒã·ã§ã³ã¿ã€ã ã¹ã¿ã³ãïŒPTSïŒã®æŽ»çš
WebCodecsã®åVideoFrameãªããžã§ã¯ãã«ã¯ããã¬ãŒã³ããŒã·ã§ã³ã¿ã€ã ã¹ã¿ã³ãïŒPTSïŒãšããŠãç¥ãããtimestampããããã£ããããŸããPTSã¯ããããªã¹ããªãŒã ã®éå§ãåºæºãšããŠããã¬ãŒã ããã€è¡šç€ºãããã¹ããã瀺ããŸããåæãç¶æããåçã®åé¡ãåé¿ããããã«ã¯ãPTSã®é©åãªåŠçãäžå¯æ¬ ã§ãã
äŸïŒãã¬ãŒã ã¬ãŒãã30 FPSã®ãããªããã³ãŒãããŠãããšããŸããé£ç¶ãããã¬ãŒã éã®æåŸ ãããPTSã®å¢åã¯çŽ33.33ããªç§ïŒ1000ms / 30 FPSïŒã«ãªããŸãããã¬ãŒã ã®PTSããã®æåŸ å€ããå€§å¹ ã«ãããŠããå Žåãã¿ã€ãã³ã°ã®åé¡ããã¬ãŒã èœã¡ã瀺ããŠããå¯èœæ§ããããŸãã
å®è£ ïŒ
let lastTimestamp = null;
decoder.decode = (chunk) => {
decoder.decode(chunk, {
keyFrame: chunk.type === "key",
});
};
decoder.configure({
codec: codecString,
codedWidth: width,
codedHeight: height,
description: init.decoderConfig.description,
optimizeForLatency: true,
hardwareAcceleration: "prefer-hardware",
error: (e) => console.error(e),
output: (frame) => {
if (lastTimestamp !== null) {
const expectedDelta = 1000 / frameRate; // Milliseconds per frame
const actualDelta = frame.timestamp - lastTimestamp;
const deltaError = Math.abs(actualDelta - expectedDelta);
if (deltaError > expectedDelta / 4) {
console.warn("Frame timing issue: Expected delta:", expectedDelta, "Actual delta:", actualDelta);
}
}
lastTimestamp = frame.timestamp;
renderFrame(frame);
frame.close();
},
});
ãã®äŸã§ã¯ããããªã®ãã¬ãŒã ã¬ãŒãã«åºã¥ããŠæåŸ ãããPTSã®å¢åãèšç®ãããããé£ç¶ãããã¬ãŒã éã®å®éã®PTSã®å·®ãšæ¯èŒããŸããå·®ãç¹å®ã®ãããå€ãè¶ ããå Žåãæœåšçãªã¿ã€ãã³ã°ã®åé¡ã瀺ãèŠåããã°ã«èšé²ãããŸãã
2. requestAnimationFrameã䜿çšããã¹ã ãŒãºãªã¬ã³ããªã³ã°
requestAnimationFrame APIã¯ã次ã®åæç»ã®åã«å®è¡ãããã³ãŒã«ããã¯ãã¹ã±ãžã¥ãŒã«ãããã©ãŠã¶æäŸã®é¢æ°ã§ããããã¯ãã¬ã³ããªã³ã°ããã©ãŠã¶ã®ãªãã¬ãã·ã¥ã¬ãŒãïŒéåžž60 Hz以äžïŒãšåæããããããWebã¢ããªã±ãŒã·ã§ã³ã§è¡šç€ºãæŽæ°ããæšå¥šãããæ¹æ³ã§ãã
ãããªãã¬ãŒã ã衚瀺ããããã«requestAnimationFrameã䜿çšããããšã§ãã¬ã³ããªã³ã°ãã¹ã ãŒãºã«ãªãããã¢ãªã³ã°ãã¹ã¿ãã¿ãªã³ã°ãåé¿ã§ããŸãããã³ãŒãããããšããã«ãã¬ãŒã ãçŽæ¥ã¬ã³ããªã³ã°ãã代ããã«ããããããã¥ãŒã«å
¥ããrequestAnimationFrameã䜿çšããŠé©åãªã¿ã€ãã³ã°ã§è¡šç€ºããããšãã§ããŸãã
äŸïŒ
let frameQueue = [];
let isRendering = false;
function renderFrame(frame) {
frameQueue.push(frame);
if (!isRendering) {
isRendering = true;
requestAnimationFrame(displayFrames);
}
}
function displayFrames() {
if (frameQueue.length > 0) {
const frame = frameQueue.shift();
// Render the frame to the canvas or other display element
drawImage(frame);
frame.close();
requestAnimationFrame(displayFrames); //Schedule next frame
} else {
isRendering = false;
}
}
ãã®äŸã§ã¯ãrenderFrame颿°ãåãã³ãŒãããããã¬ãŒã ããã¥ãŒã«è¿œå ããŸããrequestAnimationFrameã«ãã£ãŠåŒã³åºãããdisplayFrames颿°ã¯ããã¬ãŒã ãããã¥ãŒããŠã¬ã³ããªã³ã°ããŸããããã«ããããã¬ãŒã ããã©ãŠã¶ã®ãªãã¬ãã·ã¥ã¬ãŒããšåæããŠè¡šç€ºãããããšãä¿èšŒãããŸãã
3. ãã¬ãŒã ã¬ãŒããªããã¿ãŒã®å®è£
å Žåã«ãã£ãŠã¯ããããªãœãŒã¹ã®ãã¬ãŒã ã¬ãŒããé«ãå Žåã§ãããã¬ãŒã ã¬ãŒããç¹å®ã®å€ã«å¶éãããããšããããŸããããã¯ãCPU䜿çšçãåæžãããããããªåçãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®èŠçŽ ãšåæããããããã®ã«åœ¹ç«ã¡ãŸãã
ãã¬ãŒã ã¬ãŒããªããã¿ãŒã¯ãæåŸã®ãã¬ãŒã ã衚瀺ãããŠããã®çµéæéã远跡ããæãŸãããã¬ãŒã ã¬ãŒããæºããã®ã«ååãªæéãçµéããå Žåã«ã®ã¿æ°ãããã¬ãŒã ãã¬ã³ããªã³ã°ããããšã§å®è£ ã§ããŸãã
äŸïŒ
const targetFPS = 30;
const frameInterval = 1000 / targetFPS; // Milliseconds per frame
let lastFrameTime = 0;
function renderFrame(frame) {
const now = performance.now();
const elapsed = now - lastFrameTime;
if (elapsed >= frameInterval) {
// Render the frame
drawImage(frame);
frame.close();
lastFrameTime = now - (elapsed % frameInterval); // Adjust for drift
}
}
ãã®äŸã§ã¯ãã¿ãŒã²ãããã¬ãŒã ã¬ãŒãã«å¿
èŠãªæéééãèšç®ããæåŸã®ãã¬ãŒã ããã®çµéæéããã®éé以äžã®å Žåã«ã®ã¿ãã¬ãŒã ãã¬ã³ããªã³ã°ããŸããelapsed % frameIntervalã®èª¿æŽã¯ãããªãããé²ããé·æã«ããã£ãŠäžè²«ãããã¬ãŒã ã¬ãŒããç¶æããããã«éèŠã§ãã
4. ã¢ãããã£ããã¬ãŒã ã¬ãŒãå¶åŸ¡
å®éã®ã·ããªãªã§ã¯ããããã¯ãŒã¯ç¶æ³ãåŠçèœåãå€åããå®éã®ãã¬ãŒã ã¬ãŒãã«ã°ãã€ããçããããšããããŸããã¢ãããã£ããã¬ãŒã ã¬ãŒãå¶åŸ¡ã¯ããããã®ç¶æ³ã«åºã¥ããŠãã¬ãŒã ã¬ãŒããåçã«èª¿æŽããã¹ã ãŒãºãªåçäœéšãç¶æããããšãå«ã¿ãŸãã
ã¢ãããã£ããã¬ãŒã ã¬ãŒãå¶åŸ¡ã®æè¡ïŒ
- ãã¬ãŒã ããããïŒã·ã¹ãã ãéè² è·ã®å ŽåãåŠçè² è·ã軜æžããããã«ãã¬ãŒã ãéžæçã«ããããã§ããŸããããã¯ãéèŠåºŠã®äœãã³ã³ãã³ããæã€ãã¬ãŒã ãã¹ãããããããããŒãã¬ãŒã ãåªå ãããããããšã§è¡ããŸãã
- è§£å床ã¹ã±ãŒãªã³ã°ïŒãã³ãŒãåŠçãé ãå Žåããããªã®è§£å床ãäžããŠããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããããã«ãããåŠçããå¿ èŠã®ããããŒã¿éãæžããäžè²«ãããã¬ãŒã ã¬ãŒããç¶æããã®ã«åœ¹ç«ã¡ãŸãã
- ãããã¬ãŒãé©å¿ïŒãããã¯ãŒã¯åž¯åå¹ ãéãããŠããå ŽåãããŠã³ããŒãããå¿ èŠã®ããããŒã¿éãæžããããã«ãããäœããããã¬ãŒãã®ãããªã¹ããªãŒã ã«åãæ¿ããããšãã§ããŸããããã«ããããããã¡ãªã³ã°ãé²ããããã¹ã ãŒãºãªåçäœéšãä¿èšŒã§ããŸãã
- ãã³ãŒããŒèšå®ã®èª¿æŽïŒäžéšã®ãã³ãŒããŒã§ã¯ãããã©ãŒãã³ã¹ç¹æ§ã調æŽããããã«ã©ã³ã¿ã€ã ã§ã®åèšå®ãå¯èœã§ãã
äŸïŒãã¬ãŒã ããããïŒïŒ
let frameCounter = 0;
const dropEveryNFrames = 2; // Drop every other frame
function renderFrame(frame) {
frameCounter++;
if (frameCounter % dropEveryNFrames === 0) {
//Drop this frame
frame.close();
return;
}
// Render the frame
drawImage(frame);
frame.close();
}
5. ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ã®ç£èŠ
ãã¬ãŒã ã¬ãŒãã广çã«ç®¡çããããã©ãŒãã³ã¹ãæé©åããããã«ã¯ãäž»èŠãªããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãç£èŠããããšãéèŠã§ãã以äžã«è¿œè·¡ãã¹ãããã€ãã®ã¡ããªã¯ã¹ã瀺ããŸãïŒ
- ãã³ãŒãæéïŒåãã¬ãŒã ããã³ãŒãããã®ã«ãããæéã
- ã¬ã³ããªã³ã°æéïŒåãã¬ãŒã ããã£ã¹ãã¬ã€ã«ã¬ã³ããªã³ã°ããã®ã«ãããæéã
- ãã¬ãŒã ãã¥ãŒã®é·ãïŒã¬ã³ããªã³ã°åŸ ã¡ã®ãã¬ãŒã æ°ã
- CPU䜿çšçïŒãããªåŠçãã€ãã©ã€ã³ã䜿çšããCPUã®å²åã
- ã¡ã¢ãªäœ¿çšéïŒãããªåŠçãã€ãã©ã€ã³ã䜿çšããã¡ã¢ãªã®éã
- ãããã¯ãŒã¯åž¯åå¹ ïŒãããã¯ãŒã¯ãä»ããŠè»¢éãããããŒã¿ã®éã
ãããã®ã¡ããªã¯ã¹ãç£èŠããããšã§ãããã«ããã¯ãç¹å®ããã³ãŒããæé©åããŠããã©ãŒãã³ã¹ãåäžãããäžè²«ãããã¬ãŒã ã¬ãŒããç¶æã§ããŸãããã©ãŠã¶ã®éçºè ããŒã«ã¯ãããã©ãŒãã³ã¹ã®åé¡ãç¹å®ããã®ã«åœ¹ç«ã€ãããã¡ã€ãªã³ã°æ©èœããã°ãã°æäŸããŸãã
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
ãã¬ãŒã ã¬ãŒãå¶åŸ¡ã¯ãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã§äžå¯æ¬ ã§ãã以äžã«ããã€ãã®å®è·µçãªäŸã瀺ããŸãïŒ
- ãããªäŒè°ïŒãããªäŒè°ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå®å®ãããã¬ãŒã ã¬ãŒããç¶æããããšããã¹ã ãŒãºã§èªç¶ãªèŠãç®ã®ãããªãã£ãŒããæäŸããããã«éèŠã§ããã¢ãããã£ããã¬ãŒã ã¬ãŒãå¶åŸ¡ã䜿çšããŠããããã¯ãŒã¯ç¶æ³ãåŠçèœåã«åºã¥ããŠãã¬ãŒã ã¬ãŒãã調æŽã§ããŸãã
- ã©ã€ãã¹ããªãŒãã³ã°ïŒã©ã€ãã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ã¯ãå€åãããããã¯ãŒã¯ç¶æ³ã«å¯Ÿå¿ããèŠèŽè ãäžè²«æ§ã®ããé«å質ãªãããªã¹ããªãŒã ãåä¿¡ã§ããããã«ããå¿ èŠããããŸãããã¬ãŒã ã¬ãŒãå¶åŸ¡ã䜿çšããŠãããŸããŸãªãããã¯ãŒã¯ç¶æ³ãããã€ã¹ã®èœåã«åãããŠãããªã¹ããªãŒã ãæé©åã§ããŸãã
- ã²ãŒã ïŒWebããŒã¹ã®ã²ãŒã ã¯ãå¿çæ§ãé«ãæ²¡å ¥æã®ããäœéšã®ããã«é«ããã¬ãŒã ã¬ãŒãããã°ãã°å¿ èŠãšããŸãããã¬ãŒã ã¬ãŒãå¶åŸ¡ã䜿çšããŠãã²ãŒã ã®ããã©ãŒãã³ã¹ãæé©åããããŸããŸãªããã€ã¹ã§ã¹ã ãŒãºã«åäœããããã«ã§ããŸãã
- ãããªç·šéïŒãããªç·šéã¢ããªã±ãŒã·ã§ã³ã¯ã倧ããªãããªãã¡ã€ã«ãåŠçãããã©ã³ã¹ã³ãŒãã£ã³ã°ããããªãšãã§ã¯ãã®é©çšãªã©ã®è€éãªæäœãå®è¡ããå¿ èŠããããŸãããã¬ãŒã ã¬ãŒãå¶åŸ¡ã䜿çšããŠãç·šéããã»ã¹ãæé©åããæçµçãªåºåãæãŸãããã¬ãŒã ã¬ãŒãã«ãªãããã«ã§ããŸãã
- ã€ã³ã¿ã©ã¯ãã£ããããªã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ïŒäŸïŒçŸè¡é€šãå±ç€ºäŒïŒïŒè€æ°ã®ãããªã¹ããªãŒã ãšã€ã³ã¿ã©ã¯ãã£ãèŠçŽ ãåæãããã«ã¯ããã°ãã°æ£ç¢ºãªãã¬ãŒã ã¿ã€ãã³ã°ãèŠæ±ãããŸããWebCodecsã¯ãWebãã©ãŠã¶å ã§è€éãªã€ã³ã¿ã©ã¯ãã£ããããªäœéšãå¯èœã«ããæ°ããã¬ãã«ã®æ²¡å ¥åããžã¿ã«ã¢ãŒããè§£æŸããŸãã
åœéçãªäŸïŒäœåž¯åå¹ ç°å¢ã§ã®ãããªäŒè°
ã€ã³ã¿ãŒãããæ¥ç¶ãéãããŠããã€ã³ãã®èŸ²æå°åã§äœ¿çšããããããªäŒè°ã¢ããªã±ãŒã·ã§ã³ãæ³åããŠã¿ãŠãã ãããå©çšå¯èœãªäœéšãä¿èšŒããããã«ãã¢ããªã±ãŒã·ã§ã³ã¯ãã¬ãŒã ã¬ãŒããç©æ¥µçã«ç®¡çããå¿ èŠããããŸããé³å£°ã®æçããå®å šã«ç ç²ã«ããããšãªãåºæ¬çãªã¬ãã«ã®èŠèŠçã³ãã¥ãã±ãŒã·ã§ã³ãç¶æããããã«ããã¬ãŒã ãããããè§£å床ã¹ã±ãŒãªã³ã°ãªã©ã®æè¡ãæ¡çšããé«ãã¬ãŒã ã¬ãŒãã®ãããªãããé³å£°äŒéãåªå ããå¯èœæ§ããããŸãã
ã³ãŒãäŸãšãã¹ããã©ã¯ãã£ã¹
WebCodecsã§ãã¬ãŒã ã¬ãŒãå¶åŸ¡ãå®è£ ããããã®ããã€ãã®ã³ãŒãäŸãšãã¹ããã©ã¯ãã£ã¹ã以äžã«ç€ºããŸãïŒ
1. ãã³ãŒããŒãšã©ãŒã®åŠç
ãã³ãŒããŒãšã©ãŒã¯ãç ŽæãããããªããŒã¿ããµããŒããããŠããªãã³ãŒããã¯ãªã©ãããŸããŸãªçç±ã§çºçããå¯èœæ§ããããŸãããããã®ãšã©ãŒãé©åã«åŠçããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããã®ãé²ãããšãéèŠã§ããäžè¬çãªã¢ãããŒãã¯ããšã©ãŒããã°ã«èšé²ãããã³ãŒããŒããªã»ããããããå¥ã®ãããªã¹ããªãŒã ã«åãæ¿ãããããŠå埩ã詊ã¿ããšã©ãŒãã³ãã©ãŒãå®è£ ããããšã§ãã
decoder.configure({
//...
error: (e) => {
console.error("Decoder error:", e);
// Attempt to recover by resetting the decoder or switching to a different video stream
// decoder.reset(); or switchVideoStream();
},
output: (frame) => {
// Process the frame
},
});
2. ãšã³ã³ãŒããšãã³ãŒãã®ããã©ãŒãã³ã¹æé©å
ãããªã®ãšã³ã³ãŒããšãã³ãŒãã¯ãèšç®éçŽçãªã¿ã¹ã¯ã«ãªãå¯èœæ§ããããŸããããã©ãŒãã³ã¹ãæé©åããã«ã¯ã次ã®ç¹ãèæ ®ããŠãã ããïŒ
- ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ïŒããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãæå¹ã«ããŠãGPUããšã³ã³ãŒããšãã³ãŒãã«æŽ»çšããŸããWebCodecsã§ã¯ããšã³ã³ãŒããŒãšãã³ãŒããŒã®èšå®ã§
hardwareAcceleration: "prefer-hardware"ãæå®ã§ããŸãã - WebAssemblyïŒWASMïŒïŒã³ãŒããã¯å®è£ ãªã©ã®èšç®éçŽçãªã¿ã¹ã¯ã«ã¯WASMãå©çšããŸãã
- ã¯ãŒã«ãŒã¹ã¬ããïŒãšã³ã³ãŒããšãã³ãŒãã®ã¿ã¹ã¯ãã¯ãŒã«ãŒã¹ã¬ããã«ãªãããŒãããŠãã¡ã€ã³ã¹ã¬ããã®ããããã³ã°ãé²ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžããŸãã
- å¹ççãªã¡ã¢ãªç®¡çïŒäžèŠãªã¡ã¢ãªã®å²ãåœãŠãšè§£æŸãé¿ããŸããå¯èœãªéã
VideoFrameãªããžã§ã¯ããä»ã®ããŒã¿æ§é ãåå©çšããŸãã - ã³ãŒããã¯èšå®ã®æé©åïŒå質ãšããã©ãŒãã³ã¹ã®æé©ãªãã©ã³ã¹ãèŠã€ããããã«ãããŸããŸãªã³ãŒããã¯èšå®ã詊ããŸãã
3. é©åãªåæã®ç¢ºä¿
é³å£°ãšãããªã®åæã¯ãã·ãŒã ã¬ã¹ãªèŠèŽäœéšãæäŸããããã«éèŠã§ãããã¬ãŒã ã®ãã¬ãŒã³ããŒã·ã§ã³ã¿ã€ã ã¹ã¿ã³ãïŒPTSïŒã䜿çšããŠãé³å£°ã¹ããªãŒã ãšãããªã¹ããªãŒã ãé©åã«åæãããŠããããšã確èªããŸããã¯ããã¯åæã¢ã«ãŽãªãºã ã䜿çšããŠãé³å£°ãšãããªã®ã¯ããã¯ãåãããããšãã§ããŸãã
äžè¬çãªãã¬ãŒã ã¬ãŒãåé¡ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
以äžã«ãäžè¬çãªãã¬ãŒã ã¬ãŒãã®åé¡ãšãã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°æ¹æ³ã瀺ããŸãïŒ
- ã«ã¯ã«ã¯ããåçïŒã«ã¯ã«ã¯ããåçã¯ãäœããã¬ãŒã ã¬ãŒãããã¬ãŒã èœã¡ããŸãã¯åæã®åé¡ã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ããããŸãããã¬ãŒã ã¬ãŒãã確èªãããã¬ãŒã ãã¥ãŒã®é·ããç£èŠããé³å£°ã¹ããªãŒã ãšãããªã¹ããªãŒã ãé©åã«åæãããŠããããšã確èªããŠãã ããã
- ã¹ã¿ãã¿ãªã³ã°ïŒã¹ã¿ãã¿ãªã³ã°ã¯ãäžè²«æ§ã®ãªããã¬ãŒã ã¿ã€ãã³ã°ããããã¡ã¢ã³ããŒã©ã³ã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ããããŸãããã¬ãŒã ã®ãã¬ãŒã³ããŒã·ã§ã³ã¿ã€ã ã¹ã¿ã³ãïŒPTSïŒã確èªãããã³ãŒããŒãäžå®ã®ã¬ãŒãã§ããŒã¿ãåä¿¡ããŠããããšã確èªããŠãã ããã
- ãã¢ãªã³ã°ïŒãã¢ãªã³ã°ã¯ããã£ã¹ãã¬ã€ã®ãªãã¬ãã·ã¥ã¬ãŒããšåæããã«ãã¬ãŒã ãã¬ã³ããªã³ã°ããããšã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ããããŸãã
requestAnimationFrameã䜿çšããŠãã¬ã³ããªã³ã°ããã©ãŠã¶ã®ãªãã¬ãã·ã¥ã¬ãŒããšåæãããŠãã ããã - é«ãCPU䜿çšçïŒé«ãCPU䜿çšçã¯ãéå¹çãªãšã³ã³ãŒããŸãã¯ãã³ãŒãã¢ã«ãŽãªãºã ã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ããããŸããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãæå¹ã«ããã³ãŒããæé©åããŠCPU䜿çšçãåæžããŠãã ããã
- ã¡ã¢ãªãªãŒã¯ïŒã¡ã¢ãªãªãŒã¯ã¯ã
VideoFrameãªããžã§ã¯ããä»ã®ããŒã¿æ§é ãé©åã«è§£æŸããªãããšã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ããããŸããäžèŠã«ãªã£ããã¹ãŠã®ãã¬ãŒã ãframe.close()ã䜿çšããŠéããŠããããšã確èªããŠãã ããã
WebCodecsã«ããããã¬ãŒã ã¬ãŒãå¶åŸ¡ã®æªæ¥
WebCodecs APIã¯åžžã«é²åããŠãããæ°ããæ©èœãæ¹åã宿çã«è¿œå ãããŠããŸããå°æ¥çã«ã¯ã次ã®ãããªããã«é«åºŠãªãã¬ãŒã ã¬ãŒãå¶åŸ¡æ©èœãæåŸ ã§ããŸãïŒ
- ãã詳现ãªå¶åŸ¡ïŒãã¬ãŒã ããšã«ãã¬ãŒã ã¬ãŒãã調æŽããæ©èœãªã©ããšã³ã³ãŒãããã³ãã³ãŒãããã»ã¹ã«å¯Ÿãããããã现ããå¶åŸ¡ã
- é«åºŠãªãšã³ã³ãŒãã£ã³ã°ãªãã·ã§ã³ïŒå¯å€ãã¬ãŒã ã¬ãŒããšã³ã³ãŒãã£ã³ã°ãã³ã³ãã³ãèªèåãšã³ã³ãŒãã£ã³ã°ãªã©ãããé«åºŠãªãšã³ã³ãŒãã£ã³ã°ãªãã·ã§ã³ã
- æ¹åããããšã©ãŒãã³ããªã³ã°ïŒèªåãšã©ãŒä¿®æ£ãã·ãŒã ã¬ã¹ãªã¹ããªãŒã åãæ¿ããªã©ãæ¹åããããšã©ãŒãã³ããªã³ã°ãšå埩ã¡ã«ããºã ã
- æšæºåãããã¡ããªã¯ã¹ïŒãã¬ãŒã ã¬ãŒãããã®ä»ã®ããã©ãŒãã³ã¹ãã©ã¡ãŒã¿ãç£èŠããããã®æšæºåãããããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãšAPIã
çµè«
ãã¬ãŒã ã¬ãŒãå¶åŸ¡ã¯ãWebCodecsã«ããããããªåŠçã®éèŠãªåŽé¢ã§ãããã¬ãŒã ã¿ã€ãã³ã°ç®¡çã®ååãçè§£ãããã®èšäºã§èª¬æããæè¡ãå®è£ ããããšã§ãã¹ã ãŒãºã§äžè²«ããèŠèŽäœéšãæäŸãã匷åã§å¹ççãªãããªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããã¬ãŒã ã¬ãŒãå¶åŸ¡ãç¿åŸããã«ã¯ããããã¯ãŒã¯ç¶æ³ãåŠçèœåããããªã³ã³ãã³ãã®è€éããªã©ãããŸããŸãªèŠå ãæ éã«èæ ®ããå¿ èŠããããŸããããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãç£èŠããããã«å¿ããŠã³ãŒããé©å¿ãããããšã§ããããªãã€ãã©ã€ã³ãæé©åããå€åããæ¡ä»¶äžã§ãæãŸãããã¬ãŒã ã¬ãŒããéæã§ããŸããWebCodecs APIãé²åãç¶ããã«ã€ããŠãéçºè ãWebåãã«ããã«æŽç·Žããããããªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ãªããããã«é«åºŠãªãã¬ãŒã ã¬ãŒãå¶åŸ¡æ©èœãç»å ŽããããšãæåŸ ãããŸãã