WebCodecs API
WebCodecs API 为 web å¼åè æä¾äºå¯¹è§é¢æµçå个帧åé³é¢æ°æ®åçåºå±è®¿é®è½åãè¿å¯¹äºé£äºéè¦å®å ¨æ§å¶åªä½å¤çæ¹å¼ç web åºç¨ç¨åºé常æç¨ãä¾å¦ï¼è§é¢æé³é¢ç¼è¾å¨ï¼ä»¥åè§é¢ä¼è®®ã
æ¦å¿µåç¨æ³
è®¸å¤ Web API å¨å
é¨é½ä½¿ç¨äºåªä½ç¼ç å¨ãä¾å¦ï¼Web Audio APIï¼ä»¥å WebRTC APIãç¶èï¼è¿äº API ä¸å
许å¼åè
å¤çè§é¢æµçåä¸ªå¸§åæªåæçç¼ç é³é¢åæè§é¢åã
Web å¼åè éå¸¸ä½¿ç¨ WebAssembly æ¥ç»è¿è¿ä¸éå¶ï¼å¹¶å¨æµè§å¨ä¸ä½¿ç¨åªä½ç¼è§£ç å¨ãç¶èï¼è¿éè¦é¢å¤ç带宽æ¥ä¸è½½æµè§å¨ä¸å·²ç»åå¨çç¼è§£ç å¨ï¼éä½äºæ§è½åè½æï¼å¹¶å¢å äºé¢å¤çå¼åææ¬ã
WebCodecs API æä¾äºå¯¹æµè§å¨ä¸å·²åå¨çç¼è§£ç å¨ç访é®è½åãå®å¯ä»¥è®¿é®åå§è§é¢å¸§ãé³é¢æ°æ®åãå¾åè§£ç å¨ãé³é¢åè§é¢çç¼ç å¨åè§£ç å¨
æ¥å£
AudioDecoder-
è§£ç
EncodedAudioChunk对象ã VideoDecoder-
è§£ç
EncodedVideoChunk对象ã AudioEncoder-
ç¼ç
AudioData对象ã VideoEncoder-
ç¼ç
VideoFrame对象ã EncodedAudioChunk-
表示ç¹å®äºç¼è§£ç å¨çç¼ç é³é¢åèã
EncodedVideoChunk-
表示ç¹å®äºç¼è§£ç å¨çç¼ç è§é¢åèã
AudioData-
表示æªç¼ç çé³é¢æ°æ®ã
VideoFrame-
表示ä¸å¸§æªç¼ç çè§é¢æ°æ®ã
VideoColorSpace-
表示è§é¢å¸§çé¢è²ç©ºé´ã
ImageDecoder-
è§£å åè§£ç å¾åæ°æ®ï¼å 许访é®å¨ç»å¾åä¸ç帧åºåã
ImageTrackList-
表示å¾åä¸å¯ç¨ç轨éå表ã
ImageTrack-
表示å个å¾å轨éã
示ä¾
å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼è·åä» MediaStreamTrackProcessor ä¸è¿åç帧ï¼ç¶å对ä»ä»¬è¿è¡ç¼ç ãå¨æç« ä½¿ç¨ WebCodec å¤çè§é¢æ¥ç宿´ç¤ºä¾å¹¶äºè§£æ´å¤ç»èã
let frame_counter = 0;
const track = stream.getVideoTracks()[0];
const media_processor = new MediaStreamTrackProcessor(track);
const reader = media_processor.readable.getReader();
while (true) {
const result = await reader.read();
if (result.done) break;
let frame = result.value;
if (encoder.encodeQueueSize > 2) {
// Too many frames in flight, encoder is overwhelmed
// let's drop this frame.
frame.close();
} else {
frame_counter++;
const insert_keyframe = frame_counter % 150 === 0;
encoder.encode(frame, { keyFrame: insert_keyframe });
frame.close();
}
}