Commit 0bdcc938aa0e3407567acb433d19c9b5fa7dc934
1 parent
99788557
feat: add download audio demo
Showing
4 changed files
with
65 additions
and
12 deletions
2022-07-14-video-recorder.md
0 → 100644
1 | +--- | |
2 | +layout: post | |
3 | +title: 视频录制 | |
4 | +# date 同时用作关联 github issue 的唯一标识,所以不可重复 | |
5 | +date: 2022-07-014 14:14:54+0800 | |
6 | +sync_link: https://xwenliang.cn/p/xx | |
7 | +categories: translation | |
8 | +# permalink: /xxx/ | |
9 | + | |
10 | +# https://jekyllrb.com/docs/structure/ | |
11 | +# name of this file show be in format of: YEAR-MONTH-DAY-title.MARKUP | |
12 | +--- | |
13 | + | |
14 | +最近有小伙伴花了大几千买了某视频网课的课程,快到期了还没看过,问我能不能下载到本地 | |
15 | + | |
16 | +先去 github 逛了一圈,发现有个叫做 CocoCut 的浏览器插件,可以下载视频,对于加密视频,只要能播放就能下载 | |
17 | + | |
18 | +试用后发现存在几个问题: | |
19 | + | |
20 | +1. 无法自动化,对于加密视频需要每次打开网页后点击插件弹出面板上一个叫做「force download」的按钮,跳转到其官网后打开 「Recording mode」, 此时播放视频的网页会刷新,然后开始录制,最后提供 mp4 格式的视频下载 | |
21 | + | |
22 | +2. 需要付费,只能免费下载几个小时的时长 | |
23 | + | |
24 | +既然它能做,那么咱们应该也可以。先了解下目前市面上常见的视频加密手段: | |
25 | + | |
26 | +1. 微软 DRM SDK, 浏览器兼容较差 | |
27 | + | |
28 | +保利威视 v12 加密,canvas+wasm | |
0 | 29 | \ No newline at end of file | ... | ... |
background/background.js
... | ... | @@ -12,6 +12,7 @@ |
12 | 12 | // test(); |
13 | 13 | |
14 | 14 | const videos = {}; |
15 | +window.videos = videos; | |
15 | 16 | |
16 | 17 | /** |
17 | 18 | * data: fr.result, |
... | ... | @@ -50,9 +51,11 @@ function download(id){ |
50 | 51 | return ; |
51 | 52 | } |
52 | 53 | const blob = new Blob(tar.blob, {type: tar.mimeType}); |
54 | + const ext = tar.mimeType.includes('webm') ? 'webm' : 'mkb'; | |
55 | + const filename = `${tar.name || 'anonymous'}.${ext}`; | |
53 | 56 | chrome.downloads.download({ |
54 | 57 | url: URL.createObjectURL(blob), |
55 | - filename: `${tar.name}.mkv` | |
58 | + filename | |
56 | 59 | }, resp => { |
57 | 60 | delete videos[id]; |
58 | 61 | }); | ... | ... |
content/audio_download.js
0 → 100644
1 | +// audio tag | |
2 | +const $tar = document.getElementById('audio_remote'); | |
3 | + | |
4 | +const mimeType = 'audio/webm'; | |
5 | +const recorder = new MediaRecorder($tar.captureStream(), { | |
6 | + mimeType | |
7 | +}); | |
8 | +recorder.onstart = function(e){ | |
9 | + console.log('start', e); | |
10 | +}; | |
11 | +recorder.ondataavailable = function(e){ | |
12 | + console.log('ondata', e); | |
13 | + saveBlobData(e.data); | |
14 | +}; | |
15 | +recorder.onstop = function(e){ | |
16 | + console.log('stop', e); | |
17 | +}; | |
18 | +recorder.start(1000); | |
19 | + | |
20 | +function saveBlobData(data){ | |
21 | + const blob = new Blob(data, { | |
22 | + type: mimeType | |
23 | + }); | |
24 | + const url = URL.createObjectURL(blob); | |
25 | + const a = document.createElement('a'); | |
26 | + document.body.appendChild(a); | |
27 | + a.style = 'display: none'; | |
28 | + a.href = url; | |
29 | + a.download = document.title; | |
30 | + a.click(); | |
31 | + window.URL.revokeObjectURL(url); | |
32 | +}; | |
0 | 33 | \ No newline at end of file | ... | ... |
popup/popup.html
... | ... | @@ -7,17 +7,7 @@ |
7 | 7 | </head> |
8 | 8 | <body> |
9 | 9 | |
10 | - <div class="tit">111将生词添加到我的有道单词本</div> | |
11 | - <div class="login-box hide"> | |
12 | - <div class="username"><input type="text" id="username" placeholder="请输入用户名" autofocus="true"></div> | |
13 | - <div class="password"><input type="password" id="password" placeholder="请输入密码"></div> | |
14 | - <div class="login-btn"><button id="login">登录</button></div> | |
15 | - </div> | |
16 | - | |
17 | - <div class="add-box hide"> | |
18 | - <div class="vocab"><input id="vocab" type="text" placeholder="请输入想添加的单词" autofocus="true"></div> | |
19 | - <div class="save-btn"><button id="save">添加</button></div> | |
20 | - </div> | |
10 | + <div class="tit"><h1>VideoRecorder</h1></div> | |
21 | 11 | |
22 | 12 | <div class="msg" id="msg"></div> |
23 | 13 | ... | ... |