canvas生成視頻

總結

通過canvas的captureStream屬性返回的一個MediaStream對象,將生成的stream通過MediaRecorder對象生成錄屏資源

const canvas_sun = require('./assets/canvas_sun.png')
const canvas_earth = require('./assets/canvas_earth.png')
const canvas_moon = require('./assets/canvas_moon.png')

function Draw () {
  const canvas = useRef();
  const recorder = useRef();
  const sun = new Image();
  const moon = new Image();
  const earth = new Image();

  const init = () => { 
    canvas.current = document.getElementById("canvas");
    sun.src = canvas_sun;
    moon.src =canvas_moon;
    earth.src = canvas_earth;
    window.requestAnimationFrame(draw);
  }


  const draw = () => { 
    const ctx = document.getElementById("canvas").getContext("2d");
    ctx.globalCompositeOperation = "destination-over";
    ctx.clearRect(0, 0, 300, 300); // 清除畫布
    ctx.fillStyle = "rgb(0 0 0 / 40%)";
    ctx.strokeStyle = "rgb(0 153 255 / 40%)";
    ctx.save();
    ctx.translate(150, 150);

    // 地球
    const time = new Date();
    ctx.rotate(
      ((2 * Math.PI) / 60) * time.getSeconds() +
        ((2 * Math.PI) / 60000) * time.getMilliseconds(),
    );
    ctx.translate(105, 0);
    ctx.fillRect(0, -12, 40, 24); // 陰影
    ctx.drawImage(earth, -12, -12);

      // 月亮
      ctx.save();
      ctx.rotate(
        ((2 * Math.PI) / 6) * time.getSeconds() +
          ((2 * Math.PI) / 6000) * time.getMilliseconds(),
      );
      ctx.translate(0, 28.5);
      ctx.drawImage(moon, -3.5, -3.5);
      ctx.restore();

      ctx.restore();

      ctx.beginPath();
      ctx.arc(150, 150, 105, 0, Math.PI * 2, false); // 地球軌道
      ctx.stroke();

      ctx.drawImage(sun, 0, 0, 300, 300);

      window.requestAnimationFrame(draw);
  }

  const record = () => { 
    const stream = document.getElementById("canvas").captureStream();
    recorder.current = new MediaRecorder(stream, { mimeType: 'video/webm' });
    const data = [];
    recorder.current.ondataavailable = function (event) {
      console.log('event---record',event)
      if (event.data && event.data.size) {
        data.push(event.data);
      }
    };
    recorder.current.onstop = () => { 
      const url = URL.createObjectURL(new Blob(data, { type: 'video/webm' }));
      document.querySelector("#videoContainer").style.display = "block";
      document.querySelector("video").src = url;
    }

    recorder.current.start();
    setTimeout(() => { 
      recorder.current.stop();
    } ,6000)
  }

  useEffect(() => {
    init();
  }, []);
  
  useEffect(() => { 
    if (!canvas.current) { 
      return 
    }
    setTimeout(() => {
      record();
    }, 100);
  }, [canvas.current])


  return (
    <div>
      <canvas id="canvas" width="300" height="300"></canvas>
      <div id='videoContainer' style={{display:'none'}}>
      <video width="300"
           height="300"
           controls="true"
           autoplay="true"
           id="video"
           ></video>
      </div>
     </div>
  );
}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末俄烁,一起剝皮案震驚了整個濱河市劫拗,隨后出現(xiàn)的幾起案子轧拄,更是在濱河造成了極大的恐慌如筛,老刑警劉巖告组,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞭吃,居然都是意外死亡,警方通過查閱死者的電腦和手機涣旨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門歪架,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霹陡,你說我怎么就攤上這事和蚪。” “怎么了烹棉?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵攒霹,是天一觀的道長。 經(jīng)常有香客問我浆洗,道長催束,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任伏社,我火速辦了婚禮抠刺,結果婚禮上,老公的妹妹穿的比我還像新娘洛口。我一直安慰自己矫付,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布第焰。 她就那樣靜靜地躺著买优,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挺举。 梳的紋絲不亂的頭發(fā)上杀赢,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音湘纵,去河邊找鬼脂崔。 笑死,一個胖子當著我的面吹牛梧喷,可吹牛的內容都是我干的砌左。 我是一名探鬼主播脖咐,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼汇歹!你這毒婦竟也來了屁擅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤产弹,失蹤者是張志新(化名)和其女友劉穎派歌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痰哨,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡胶果,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斤斧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片早抠。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖折欠,靈堂內的尸體忽然破棺而出贝或,到底是詐尸還是另有隱情,我是刑警寧澤锐秦,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布咪奖,位于F島的核電站,受9級特大地震影響酱床,放射性物質發(fā)生泄漏羊赵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一扇谣、第九天 我趴在偏房一處隱蔽的房頂上張望昧捷。 院中可真熱鬧,春花似錦罐寨、人聲如沸靡挥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跋破。三九已至,卻和暖如春瓶蝴,著一層夾襖步出監(jiān)牢的瞬間毒返,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工舷手, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拧簸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓男窟,卻偏偏與公主長得像盆赤,于是被迫代替她去往敵國和親贾富。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容