PageSourceSearch

https://johnnywang1994.github.io/book/assets/canvas-draw-video.html-BImOnTo3.js

js johnnywang1994.github.io collected 2026-10-03 09:25:14 UTC 27,197 bytes, 91 lines download raw bytes

1import{_ as u,c as d,b as s,a as c,e as r,r as k,o as v}from"./app-BgYE7jZN.js";const m={methods:{playVideo(){this.$refs.bgVideoRef.play()},pauseVideo(){this.$refs.bgVideoRef.pause()},initCanvas(){var a=this._canvas=this.$refs.videoBg;this._ctx=a.getContext("2d")},initVideo(){const a=this._canvas,n=this._ctx,p=this.$refs.bgVideoRef,i=p.style.display;let e=1;p.style.display="block",p.addEventListener("loadeddata",()=>{a.width=p.videoWidth,a.height=p.videoHeight,e=p.videoHeight/p.videoWidth,p.style.display=i,t()});function t(){n.drawImage(p,0,0,a.width,a.width*e),requestAnimationFrame(t)}}},mounted(){const a=this;a.initCanvas(),a.initVideo()}},b={id:"canvas-draw-video--wrapper"},g={ref:"bgVideoRef",crossorigin:"anonymous",playsinline:"",loop:""},h={class:"canvas-container"},y={ref:"videoBg"};function f(a,n,p,i,e,t){const o=k("SocialBlock");return v(),d("div",null,[n[3]||(n[3]=s("h1",{id:"如何把-video-畫在-canvas-上",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#如何把-video-畫在-canvas-上"},[s("span",null,"如何把 Video 畫在 Canvas 上")])],-1)),c(o,{hashtags:"javascript,canvas,video,fullpage"}),n[4]||(n[4]=s("p",null,"Hi 大家好,我是 Johnny,今天這篇來介紹個小玩意,如標題,該怎麼把 Video 畫在 Canvas 上呢?",-1)),n[5]||(n[5]=s("h2",{id:"背景",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#背景"},[s("span",null,"背景")])],-1)),n[6]||(n[6]=s("p",null,"把 Video 畫在 Canvas 上可以有很多用處,比如我們可以對影像背景進行即時改變,或是給予其他更大的創意操作彈性,但...創意部份就留給大家發想了,本篇會專注在如何轉換的過程上摟~",-1)),n[7]||(n[7]=s("h2",{id:"實際效果",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#實際效果"},[s("span",null,"實際效果")])],-1)),n[8]||(n[8]=s("p",null,"本篇會以 Vue 來實作,不過不會涉及太複雜的使用,只需要大概懂基礎就好",-1)),n[9]||(n[9]=s("p",null,"實作前,先實際展示 Canvas 影片效果給大家看~",-1)),n[10]||(n[10]=s("p",null,"試著把手機打橫、放直看看效果吧!",-1)),s("div",b,[s("button",{style:{"margin-right":"12px"},onClick:n[0]||(n[0]=(...l)=>t.playVideo&&t.playVideo(...l))},"Play"),s("button",{onClick:n[1]||(n[1]=(...l)=>t.pauseVideo&&t.pauseVideo(...l))},"Pause"),s("video",g,[...n[2]||(n[2]=[s("source",{src:"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"},null,-1)])],512),s("div",h,[s("canvas",y,null,512)])]),n[11]||(n[11]=r(`<h2 id="實作" tabindex="-1"><a class="header-anchor" href="#實作"><span>實作</span></a></h2><p>首先我們把 video 先正確顯示在網頁上面,如下範例:</p><div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>app<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span></span>
2<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>video</span> <span class="token attr-name">playsinline</span> <span class="token attr-name">loop</span><span class="token punctuation">&gt;</span></span></span>
3<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>source</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4<span class="token punctuation">&quot;</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>video/mp4<span class="token punctuation">&quot;</span></span> <span class="token punctuation">/&gt;</span></span></span>
4<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>video</span><span class="token punctuation">&gt;</span></span></span>
5<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
6<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>應該就能看到我們帥氣的影片出現拉~</p><p>接著我們將影片隱藏起來,並添加我們的目標 Canvas,預留兩個 ref 待後續使用</p><div class="language-css line-numbers-mode" data-highlighter="prismjs" data-ext="css"><pre><code class="language-css"><span class="line"><span class="token selector">#app</span> <span class="token punctuation">{</span></span>
7<span class="line">  <span class="token selector">video</span> <span class="token punctuation">{</span></span>
8<span class="line">    <span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
9<span class="line">  <span class="token punctuation">}</span></span>
10<span class="line">  <span class="token selector">canvas</span> <span class="token punctuation">{</span></span>
11<span class="line">    <span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span></span>
12<span class="line">  <span class="token punctuation">}</span></span>
13<span class="line"><span class="token punctuation">}</span></span>
14<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>app<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span></span>
15<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>video</span> <span class="token attr-name">ref</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>bgVideoRef<span class="token punctuation">&quot;</span></span> <span class="token attr-name">crossorigin</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>anonymous<span class="token punctuation">&quot;</span></span> <span class="token attr-name">playsinline</span> <span class="token attr-name">loop</span><span class="token punctuation">&gt;</span></span></span>
16<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>source</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4<span class="token punctuation">&quot;</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>video/mp4<span class="token punctuation">&quot;</span></span> <span class="token punctuation">/&gt;</span></span></span>
17<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>video</span><span class="token punctuation">&gt;</span></span></span>
18<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>canvas</span> <span class="token attr-name">ref</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>
18videoBg<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>canvas</span><span class="token punctuation">&gt;</span></span></span>
19<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
20<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>接著處理我們的主要邏輯,透過監聽影片 <code>loadeddata</code> 事件,取得影片的實際寬高比例,並將 canvas 的 pixel resolution 設為影片寬高,透過這個方式才能維持原影片的畫質正確,否則預設 canvas 的 pixel 比例會是 300x150</p><blockquote><p>canvas 元素上的 width, height 並不單單只影響 DOM 寬高,而是真正影響畫布的 pixel resolution,用 css style 影響的才是顯示的寬高,所以即使你用 css 去設定 canvas,如果沒有明確去定義 width, height 屬性,那麼內容的 pixel resolution 就仍然是預設的配置</p></blockquote><div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token comment">// 為求方便直接用 option API 撰寫瞜~</span></span>
21<span class="line">Vue<span class="token punctuation">.</span><span class="token function">createApp</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
22<span class="line">  <span class="token function">mounted</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
23<span class="line">    <span class="token keyword">const</span> vm <span class="token operator">=</span> <span class="token keyword">this</span></span>
24<span class="line">    vm<span class="token punctuation">.</span><span class="token function">initCanvas</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
25<span class="line">    vm<span class="token punctuation">.</span><span class="token function">initVideo</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
26<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
27<span class="line">  <span class="token literal-property property">methods</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
28<span class="line">    <span class="token function">initCanvas</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
29<span class="line">      <span class="token keyword">const</span> vm <span class="token operator">=</span> <span class="token keyword">this</span></span>
30<span class="line">      <span class="token keyword">var</span> canvas <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_canvas <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>
30videoBg<span class="token punctuation">;</span></span>
31<span class="line">      <span class="token keyword">this</span><span class="token punctuation">.</span>_ctx <span class="token operator">=</span> canvas<span class="token punctuation">.</span><span class="token function">getContext</span><span class="token punctuation">(</span><span class="token string">&#39;2d&#39;</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
32<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
33<span class="line">    <span class="token function">initVideo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
34<span class="line">      <span class="token keyword">const</span> canvas <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_canvas<span class="token punctuation">;</span></span>
35<span class="line">      <span class="token keyword">const</span> ctx <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_ctx<span class="token punctuation">;</span></span>
36<span class="line">      <span class="token keyword">const</span> videoEl <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>bgVideoRef<span class="token punctuation">;</span></span>
37<span class="line">      <span class="token keyword">const</span> _display <span class="token operator">=</span> videoEl<span class="token punctuation">.</span>style<span class="token punctuation">.</span>display<span class="token punctuation">;</span></span>
38<span class="line">      <span class="token keyword">let</span> ratio <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
39<span class="line"></span>
40<span class="line">      videoEl<span class="token punctuation">.</span>style<span class="token punctuation">.</span>display <span class="token operator">=</span> <span class="token string">&#39;block&#39;</span><span class="token punctuation">;</span></span>
41<span class="line">      videoEl<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">&#39;loadeddata&#39;</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
42<span class="line">        <span class="token comment">// set canvas pixel resolution</span></span>
43<span class="line">        canvas<span class="token punctuation">.</span>width <span class="token operator">=</span> videoEl<span class="token punctuation">.</span>videoWidth<span class="token punctuation">;</span></span>
44<span class="line">        canvas<span class="token punctuation">.</span>height <span class="token operator">=</span> videoEl<span class="token punctuation">.</span>videoHeight<span class="token punctuation">;</span></span>
45<span class="line">        <span class="token comment">// get video ratio</span></span>
46<span class="line">        ratio <span class="token operator">=</span> videoEl<span class="token punctuation">.</span>videoHeight <span class="token operator">/</span> videoEl<span class="token punctuation">.</span>videoWidth<span class="token punctuation">;</span></span>
47<span class="line">        <span class="token comment">// recover videoEl display</span></span>
48<span class="line">        videoEl<span class="token punctuation">.</span>style<span class="token punctuation">.</span>display <span class="token operator">=</span> _display<span class="token punctuation">;</span></span>
49<span class="line">        <span class="token comment">// create fabric image</span></span>
50<span class="line">        <span class="token function">drawVideo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
51<span class="line">
51        <span class="token comment">// start</span></span>
52<span class="line">        videoEl<span class="token punctuation">.</span><span class="token function">play</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
53<span class="line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
54<span class="line"></span>
55<span class="line">      <span class="token keyword">function</span> <span class="token function">drawVideo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
56<span class="line">        ctx<span class="token punctuation">.</span><span class="token function">drawImage</span><span class="token punctuation">(</span></span>
57<span class="line">          videoEl<span class="token punctuation">,</span></span>
58<span class="line">          <span class="token number">0</span><span class="token punctuation">,</span></span>
59<span class="line">          <span class="token number">0</span><span class="token punctuation">,</span></span>
60<span class="line">          canvas<span class="token punctuation">.</span>width<span class="token punctuation">,</span></span>
61<span class="line">          canvas<span class="token punctuation">.</span>width <span class="token operator">*</span> ratio</span>
62<span class="line">        <span class="token punctuation">)</span><span class="token punctuation">;</span></span>
63<span class="line">        <span class="token function">requestAnimationFrame</span><span class="token punctuation">(</span>drawVideo<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
64<span class="line">      <span class="token punctuation">}</span></span>
65<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
66<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
67<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">mount</span><span class="token punctuation">(</span><span class="token string">&#39;#app&#39;</span><span class="token punctuation">)</span></span>
68<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果這時我們希望讓影片能夠自適應,並且始終填滿畫面,而將 CSS 改為如下</p><div class="language-css line-numbers-mode" data-highlighter="prismjs" data-ext="css"><pre><code class="language-css"><span class="line"><span class="token selector">#app</span> <span class="token punctuation">{</span></span>
69<span class="line">  <span class="token selector">video</span> <span class="token punctuation">{</span></span>
70<span class="line">    <span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
71<span class="line">  <span class="token punctuation">}</span></span>
72<span class="line">  <span class="token selector">canvas</span> <span class="token punctuation">{</span></span>
73<span class="line">    <span class="token property">width</span><span class="token punctuation">:</span> 100vw<span class="token punctuation">;</span></span>
74<span class="line">    <span class="token property">height</span><span class="token punctuation">:</span> 100vh<span class="token punctuation">;</span></span>
75<span class="line">  <span class="token punctuation">}</span></span>
76<span class="line"><span class="token punctuation">}</span></span>
77<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>這樣寫你會發現,我們的 Canvas 就被拉伸了~NO~~!! 影片內容是有填滿畫面沒錯,但是比例整個跑掉啦~</p><p>大家猜猜能怎麼解,5,4,3,2,1...</p><p>沒錯,直接在 Canvas 外面再包一層 <code>.canvas-container</code> 並且將內部的 Canvas 設為 <code>object-fit</code> ,搞定!!</p><div class="language-css line-numbers-mode" data-highlighter="prismjs" data-ext="css"><pre><code class="language-css"><span class="line"><span class="token selector">#app</span> <span class="token punctuation">{</span></span>
78<span class="line">  <span class="token selector">video</span> <span class="token punctuation">{</span></span>
79<span class="line">    <span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
80<span class="line">  <span class="token punctuation">}</span></span>
81<span class="line">  <span class="token selector">.canvas-container</span> <span class="token punctuation">{</span></span>
82<span class="line">    <span class="token property">width</span><span class="token punctuation">:</span> 100vw<span class="token punctuation">;</span></span>
83<span class="line">    <span class="token property">height</span><span class="token punctuation">:</span> 100vh<span class="token punctuation">;</span></span>
84<span class="line">    <span class="token selector">canvas</span> <span class="token punctuation">{</span></span>
85<span class="line">
85      <span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span></span>
86<span class="line">      <span class="token property">height</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span></span>
87<span class="line">      <span class="token property">object-fit</span><span class="token punctuation">:</span> cover<span class="token punctuation">;</span></span>
88<span class="line">    <span class="token punctuation">}</span></span>
89<span class="line">  <span class="token punctuation">}</span></span>
90<span class="line"><span class="token punctuation">}</span></span>
91<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>那今天的分享就到這邊摟,希望大家會喜歡,也歡迎大家分享給更多人看看玩玩瞜,謝謝大家 =V=~</p>`,17)),c(o,{hashtags:"javascript,canvas,video,fullpage"}),n[12]||(n[12]=s("h2",{id:"參考",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#參考"},[s("span",null,"參考")])],-1)),n[13]||(n[13]=s("ul",null,[s("li",null,[s("a",{href:"https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Manipulating_video_using_canvas",target:"_blank",rel:"noopener noreferrer"},"MDN Web Doc")]),s("li",null,[s("a",{href:"http://fabricjs.com/video-element",target:"_blank",rel:"noopener noreferrer"},"Fabricjs Demo")])],-1))])}const j=u(m,[["render",f]]),q=JSON.parse('{"path":"/articles/js/canvas-draw-video.html","title":"如何把 Video 畫在 Canvas 上","lang":"zh-TW","frontmatter":{},"git":{"updatedTime":1748788505000,"contributors":[{"name":"johnnywang","username":"johnnywang","email":"[email protected]","commits":3,"url":"https://github.com/johnnywang"},{"name":"johnnywang1994","username":"johnnywang1994","email":"[email protected]","commits":1,"url":"https://github.com/johnnywang1994"},{"name":"Lindy Liao","username":"","email":"[email protected]","commits":1}],"changelog":[{"hash":"f01bfa128b4d33fbeddb8abb1697b5391b273d28","time":1748788505000,"email":"[email protected]","author":"Lindy Liao","message":"UPD"},{"hash":"21bfe127e8dd93dadea6388c32f1bacec31bed24","time":1649641308000,"email":"[email protected]","author":"johnnywang1994","message":"UPD: fix video canvas playsinline mobile"},{"hash":"ce64def3c5e0af55c4649e5d0e0b64a9c7f22b43","time":1649160854000,"email":"[email protected]","author":"johnnywang","message":"UPD"},{"hash":"1eb856d770406e3e999551980edf3a1e8389db6c","time":1649160396000,"email":"[email protected]","author":"johnnywang","message":"UPD: update video"},{"hash":"3c7dd734c9ea1f735ff63187777d90e8c9dd6f71","time":1649159185000,"email":"[email protected]","author":"johnnywang","message":"UPD: add canvas-draw-video"}]},"filePathRelative":"articles/js/canvas-draw-video.md"}');export{j as comp,q as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.