|
70 | 70 | var fwtldr; |
71 | 71 | var ffprobe; |
72 | 72 | var m4demo; |
| 73 | + var webcodec; |
73 | 74 |
|
74 | 75 |
|
75 | 76 |
|
|
78 | 79 |
|
79 | 80 | async function init(){ |
80 | 81 |
|
81 | | - menu = menumod(); |
| 82 | + menu = menumod(); |
82 | 83 |
|
83 | | - hdr = mod['blog-hdr']; |
84 | | - log = mod['log-mod']; |
| 84 | + hdr = mod['blog-hdr']; |
| 85 | + log = mod['log-mod']; |
85 | 86 |
|
86 | | - vcdemo = mod['videoconverter-demo']; |
87 | | - vctldr = mod['videoconverter-tldr']; |
88 | | - fwdemo = mod['ffmpeg-wasm-demo']; |
89 | | - fwtldr = mod['ffmpeg-wasm-tldr']; |
90 | | - ffprobe = mod.ffprobe; |
91 | | - m4demo = mod['mp4box-demo']; |
| 87 | + vcdemo = mod['videoconverter-demo']; |
| 88 | + vctldr = mod['videoconverter-tldr']; |
| 89 | + fwdemo = mod['ffmpeg-wasm-demo']; |
| 90 | + fwtldr = mod['ffmpeg-wasm-tldr']; |
| 91 | + ffprobe = mod.ffprobe; |
| 92 | + m4demo = mod['mp4box-demo']; |
| 93 | + webcodec = mod['webcodec']; |
92 | 94 |
|
93 | 95 | hdr.initmod({ext,$}); |
94 | 96 | log.initmod({ext,$}); |
|
98 | 100 | fwtldr.initmod({ext,$,menu,ace}); |
99 | 101 | ffprobe.initmod({ext,$,menu,ace}); |
100 | 102 | m4demo.initmod({ext,$,menu,ace}); |
| 103 | + webcodec.initmod({ext,$,menumod,menu,ace}); |
101 | 104 |
|
102 | 105 |
|
103 | 106 | await Promise.all([ |
|
109 | 112 | fwtldr.init(), |
110 | 113 | ffprobe.init(), |
111 | 114 | m4demo.init(), |
| 115 | + webcodec.init(), |
112 | 116 | ]); |
113 | 117 |
|
114 | 118 |
|
|
214 | 218 | {margin:30px 0;display:block} |
215 | 219 |
|
216 | 220 |
|
217 | | - |
| 221 | + .br |
| 222 | + {margin-top:0.8em} |
| 223 | + |
218 | 224 | </style> |
219 | 225 |
|
220 | 226 | </head> |
@@ -439,6 +445,27 @@ <h3> |
439 | 445 | Further Reading : Minimal h.264-in-javascript overview |
440 | 446 | </h3> |
441 | 447 | <p> |
| 448 | + <a href='https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API'> |
| 449 | + WebCodecs API |
| 450 | + <span class=link-domain> |
| 451 | + developer.mozilla.org |
| 452 | + </span> |
| 453 | + </a> |
| 454 | + <div class=br></div> |
| 455 | + <a href='https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder'> |
| 456 | + VideoDecoder |
| 457 | + <span class=link-domain> |
| 458 | + developer.mozilla.org |
| 459 | + </span> |
| 460 | + </a> |
| 461 | + <div class=br></div> |
| 462 | + <a href='https://developer.mozilla.org/en-US/docs/Web/API/VideoEncoder'> |
| 463 | + VideoEncoder |
| 464 | + <span class=link-domain> |
| 465 | + developer.mozilla.org |
| 466 | + </span> |
| 467 | + </a> |
| 468 | + <div class=br></div> |
442 | 469 | If you only need to take an H.264 keyframe (IDR) and the next frames and turn a single decoded frame into a JPEG, |
443 | 470 | the most “minimal” modern approach in the browser is WebCodecs. It lets you feed compressed H.264 bytes, |
444 | 471 | get decoded VideoFrames, draw them to a canvas, and export as JPEG—no heavy libraries required. Key detail: |
|
464 | 491 | Minimal webcodecs example: decode one frame and export jpeg |
465 | 492 | </h3> |
466 | 493 |
|
467 | | - <snippet-editor component src='ex/webcodec-api.js'></snippet-editor> |
| 494 | + <snippet-editor id=webcodec component fullsize src='ex/webcodec-api.js'></snippet-editor> |
468 | 495 |
|
469 | 496 | <h4> |
470 | 497 | Tips: |
|
574 | 601 |
|
575 | 602 | m4demo.initdom(); |
576 | 603 |
|
| 604 | + webcodec.initdom(); |
| 605 | + |
577 | 606 |
|
578 | 607 |
|
579 | 608 | }//initdom |
|
0 commit comments