Skip to content

Commit 6a20902

Browse files
committed
Added web worker example
1 parent 6dd5284 commit 6a20902

File tree

7 files changed

+139
-0
lines changed

7 files changed

+139
-0
lines changed

examples/browser/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,15 @@ $ npm start
88
```
99

1010
Visit http://localhost:3000/examples/browser/transcode.html
11+
12+
13+
Web Worker Examples
14+
==================
15+
16+
To run the webworker example, execute:
17+
18+
```
19+
$ npm run start:worker
20+
```
21+
22+
Visit http://localhost:3000/examples/browser/transcode.worker.html
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<html>
2+
<head>
3+
<style>
4+
html, body {
5+
margin: 0;
6+
width: 100%;
7+
height: 100%
8+
}
9+
body {
10+
display: flex;
11+
flex-direction: column;
12+
align-items: center;
13+
}
14+
</style>
15+
</head>
16+
<body>
17+
<h3>Upload a video to transcode to mp4 (x264) and play!</h3>
18+
<video id="output-video" controls></video><br/>
19+
<input type="file" id="uploader">
20+
<p id="message"></p>
21+
<script type="module">
22+
const worker = new Worker(new URL('./transcode.worker.js', import.meta.url).href);
23+
worker.onmessage = (event) => {
24+
const {data} = event;
25+
message.innerHTML = 'Complete transcoding';
26+
const video = document.getElementById('output-video');
27+
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
28+
}
29+
worker.onerror = (error) => console.log(error);
30+
const transcode = async ({ target: { files } }) => {
31+
const message = document.getElementById('message');
32+
const [file] = files;
33+
34+
let name = file.name.split('.');
35+
const inType = name.pop();
36+
name = name.join();
37+
const buffer = await file.arrayBuffer();
38+
const outType = 'mp4';
39+
40+
worker.postMessage({name, inType, outType, buffer}, [buffer]);
41+
42+
message.innerHTML = 'Start transcoding';
43+
}
44+
const elm = document.getElementById('uploader');
45+
elm.addEventListener('change', transcode);
46+
</script>
47+
</body>
48+
</html>

examples/browser/transcode.worker.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
importScripts('/dist/ffmpeg.dev.js');
2+
const ffmpeg = self.FFmpeg.createFFmpeg({log: true});
3+
4+
onmessage = async (event) => {
5+
try {
6+
const {buffer, name, inType, outType} = event.data;
7+
if (!ffmpeg.isLoaded()) {
8+
await ffmpeg.load();
9+
}
10+
11+
ffmpeg.FS('writeFile', `${name}.${inType}`, new Uint8Array(buffer));
12+
await ffmpeg.run('-i', `${name}.${inType}`, `${name}.${outType}`);
13+
const data = ffmpeg.FS('readFile', `${name}.${outType}`);
14+
15+
postMessage({buffer: data.buffer, type: "result"}, [data.buffer]);
16+
17+
// delete files from memory
18+
ffmpeg.FS('unlink', `${name}.${inType}`);
19+
ffmpeg.FS('unlink', `${name}.${outType}`);
20+
} catch (e) {
21+
postMessage({type: "error", error: e});
22+
}
23+
}
24+

ffmpeg-ffmpeg-0.10.2.tgz

-73.7 KB
Binary file not shown.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
},
1010
"scripts": {
1111
"start": "node scripts/server.js",
12+
"start:worker": "node scripts/worker-server.js",
1213
"build": "rimraf dist && webpack --config scripts/webpack.config.prod.js",
1314
"prepublishOnly": "npm run build",
1415
"lint": "eslint src",

scripts/webpack.config.worker.dev.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const path = require('path');
2+
const webpack = require('webpack');
3+
const common = require('./webpack.config.common');
4+
5+
const genConfig = ({
6+
entry, filename, library, libraryTarget,
7+
}) => ({
8+
...common,
9+
mode: 'development',
10+
target: 'webworker',
11+
entry,
12+
output: {
13+
filename,
14+
library,
15+
libraryTarget,
16+
},
17+
devServer: {
18+
allowedHosts: ['localhost', '.gitpod.io'],
19+
},
20+
});
21+
22+
module.exports = [
23+
genConfig({
24+
entry: path.resolve(__dirname, '..', 'src', 'index.js'),
25+
filename: 'ffmpeg.dev.js',
26+
library: 'FFmpeg',
27+
libraryTarget: 'umd',
28+
}),
29+
];

scripts/worker-server.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const webpack = require('webpack');
2+
const middleware = require('webpack-dev-middleware');
3+
const express = require('express');
4+
const path = require('path');
5+
const cors = require('cors');
6+
const webpackConfig = require('./webpack.config.worker.dev');
7+
8+
const compiler = webpack(webpackConfig);
9+
const app = express();
10+
11+
function coi(req, res, next) {
12+
res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
13+
res.setHeader("Cross-Origin-Embedder-Policy", "require-corp");
14+
next();
15+
}
16+
17+
app.use(cors());
18+
app.use(coi);
19+
20+
app.use('/', express.static(path.resolve(__dirname, '..')));
21+
app.use(middleware(compiler, { publicPath: '/dist', writeToDisk: true }));
22+
23+
module.exports = app.listen(3000, () => {
24+
console.log('Server is running on port 3000');
25+
});

0 commit comments

Comments
 (0)