Skip to content

Commit d76936d

Browse files
committed
Revise API and add worker.run
1 parent e1cbb83 commit d76936d

File tree

8 files changed

+177
-37
lines changed

8 files changed

+177
-37
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ const worker = createWorker();
4040

4141
(async () => {
4242
await worker.load();
43-
const { data } = await worker.transcode('./test.avi', 'mp4');
43+
await worker.write('test.avi', './test.avi');
44+
await worker.transcode('test.avi', 'test.mp4');
45+
const { data } = await worker.read('test.mp4');
4446
fs.writeFileSync('./test.mp4', data);
4547
})();
4648
```

examples/browser/run.html

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<html>
2+
<head>
3+
<script src="/dist/ffmpeg.dev.js"></script>
4+
<style>
5+
html, body {
6+
margin: 0;
7+
width: 100%;
8+
height: 100%
9+
}
10+
body {
11+
display: flex;
12+
flex-direction: column;
13+
align-items: center;
14+
}
15+
</style>
16+
</head>
17+
<body>
18+
<h3>Upload a video to transcode to mp4 (x264) and play!</h3>
19+
<video id="output-video" controls></video><br/>
20+
<input type="file" id="uploader">
21+
<p id="message" />
22+
<script>
23+
const { createWorker } = FFmpeg;
24+
const worker = createWorker({
25+
corePath: '../../node_modules/@ffmpeg/core/ffmpeg-core.js',
26+
logger: ({ message }) => console.log(message),
27+
});
28+
29+
const transcode = async ({ target: { files } }) => {
30+
const message = document.getElementById('message');
31+
const { name } = files[0];
32+
message.innerHTML = 'Loading ffmpeg-core.js';
33+
await worker.load();
34+
message.innerHTML = 'Start transcoding';
35+
await worker.write(name, files[0]);
36+
await worker.run(`-i ${name} output.mp4`);
37+
message.innerHTML = 'Complete transcoding';
38+
const { data } = await worker.read('output.mp4');
39+
40+
const video = document.getElementById('output-video');
41+
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
42+
}
43+
const elm = document.getElementById('uploader');
44+
elm.addEventListener('change', transcode);
45+
</script>
46+
</body>
47+
</html>

examples/browser/transcode.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ <h3>Upload a video to transcode to mp4 (x264) and play!</h3>
2626
logger: ({ message }) => console.log(message),
2727
});
2828

29-
const transcode = async ({ target: { files } }) => {
29+
const transcode = async ({ target: { files } }) => {
3030
const message = document.getElementById('message');
31+
const { name } = files[0];
3132
message.innerHTML = 'Loading ffmpeg-core.js';
3233
await worker.load();
3334
message.innerHTML = 'Start transcoding';
34-
const { data } = await worker.transcode(files[0], 'mp4');
35+
await worker.write(name, files[0]);
36+
await worker.transcode(name, 'output.mp4');
3537
message.innerHTML = 'Complete transcoding';
38+
const { data } = await worker.read('output.mp4');
3639

3740
const video = document.getElementById('output-video');
3841
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));

examples/node/run.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const fs = require('fs');
2+
const { createWorker } = require('../../src');
3+
4+
const worker = createWorker({
5+
logger: ({ message }) => console.log(message),
6+
});
7+
8+
(async () => {
9+
await worker.load();
10+
console.log('Start transcoding');
11+
await worker.write('flame.avi', '../../tests/assets/flame.avi');
12+
await worker.run('-i flame.avi flame.mp4');
13+
const { data } = await worker.read('flame.mp4');
14+
console.log('Complete transcoding');
15+
fs.writeFileSync('flame.mp4', Buffer.from(data));
16+
process.exit(0);
17+
})();

examples/node/transcode.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
const fs = require('fs');
22
const { createWorker } = require('../../src');
33

4-
const { argv } = process;
5-
const [,, inputPath, outputPath] = argv;
6-
74
const worker = createWorker({
85
logger: ({ message }) => console.log(message),
96
});
107

118
(async () => {
129
await worker.load();
1310
console.log('Start transcoding');
14-
const { data } = await worker.transcode(inputPath, outputPath.split('.').pop());
11+
await worker.write('flame.avi', '../../tests/assets/flame.avi');
12+
await worker.transcode('flame.avi', 'flame.mp4');
13+
const { data } = await worker.read('flame.mp4');
1514
console.log('Complete transcoding');
16-
fs.writeFileSync(outputPath, Buffer.from(data));
15+
fs.writeFileSync('flame.mp4', Buffer.from(data));
1716
process.exit(0);
1817
})();

package-lock.json

Lines changed: 31 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/createWorker.js

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,41 @@ module.exports = (_options = {}) => {
5656
}))
5757
);
5858

59-
const transcode = async (media, outputExt, opts, jobId) => (
59+
const write = async (path, data, jobId) => (
60+
startJob(createJob({
61+
id: jobId,
62+
action: 'write',
63+
payload: {
64+
path,
65+
data: await loadMedia(data),
66+
},
67+
}))
68+
);
69+
70+
const transcode = (inputPath, outputPath, opts, jobId) => (
6071
startJob(createJob({
6172
id: jobId,
6273
action: 'transcode',
6374
payload: {
64-
media: await loadMedia(media),
65-
outputExt,
75+
inputPath,
76+
outputPath,
6677
options: opts,
6778
},
6879
}))
6980
);
7081

82+
const read = (path, jobId) => (
83+
startJob(createJob({
84+
id: jobId, action: 'read', payload: { path },
85+
}))
86+
);
87+
88+
const run = (args, jobId) => (
89+
startJob(createJob({
90+
id: jobId, action: 'run', payload: { args },
91+
}))
92+
);
93+
7194
const terminate = async (jobId) => {
7295
if (worker !== null) {
7396
await startJob(createJob({
@@ -86,8 +109,10 @@ module.exports = (_options = {}) => {
86109
if (status === 'resolve') {
87110
log(`[${workerId}]: Complete ${jobId}`);
88111
let d = data;
89-
if (action === 'transcode') {
112+
if (action === 'read') {
90113
d = Uint8Array.from({ ...data, length: Object.keys(data).length });
114+
} else {
115+
logger(d);
91116
}
92117
resolves[action]({ jobId, data: d });
93118
} else if (status === 'reject') {
@@ -104,7 +129,10 @@ module.exports = (_options = {}) => {
104129
setResolve,
105130
setReject,
106131
load,
132+
write,
107133
transcode,
134+
read,
135+
run,
108136
terminate,
109137
};
110138
};

0 commit comments

Comments
 (0)