Update download scripts and folder name
This commit is contained in:
2
apps/vanilla-app/.gitignore
vendored
Normal file
2
apps/vanilla-app/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*.tgz
|
||||
assets
|
||||
28
apps/vanilla-app/README.md
Normal file
28
apps/vanilla-app/README.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Browser Examples
|
||||
|
||||
## Setup
|
||||
|
||||
You need to download assets from npm before running the examples:
|
||||
|
||||
```bash
|
||||
$ npm run download
|
||||
```
|
||||
|
||||
## Run
|
||||
|
||||
To run this example, execute:
|
||||
|
||||
```
|
||||
$ npm start
|
||||
```
|
||||
|
||||
Visit http://localhost:8080 to check avaiable examples.
|
||||
|
||||
## Examples
|
||||
|
||||
| Example | Description |
|
||||
| ------- | ----------- |
|
||||
| transcode.html | Transcoding example |
|
||||
| transcode.esm.html | Transcoding example using module |
|
||||
| trim.html | Video trimming exmple |
|
||||
| concatDemuxer.html | Video concat exmple |
|
||||
54
apps/vanilla-app/concatDemuxer.html
Normal file
54
apps/vanilla-app/concatDemuxer.html
Normal file
@@ -0,0 +1,54 @@
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<script src="/assets/ffmpeg/package/dist/umd/ffmpeg.js"></script>
|
||||
<script src="/assets/util/package/dist/umd/index.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h3>Select multiple video files to Concatenate</h3>
|
||||
<video id="output-video" controls></video><br />
|
||||
<input type="file" id="uploader" multiple />
|
||||
<p id="message"></p>
|
||||
<script>
|
||||
const { fetchFile } = FFmpegUtil;
|
||||
const { FFmpeg } = FFmpegWASM;
|
||||
let ffmpeg = null;
|
||||
|
||||
const transcode = async ({ target: { files } }) => {
|
||||
const message = document.getElementById("message");
|
||||
if (ffmpeg === null) {
|
||||
ffmpeg = new FFmpeg();
|
||||
ffmpeg.on("log", ({ message }) => {
|
||||
console.log(message);
|
||||
})
|
||||
ffmpeg.on("progress", ({ progress, time }) => {
|
||||
message.innerHTML = `${time / 1000000} s`;
|
||||
});
|
||||
await ffmpeg.load({
|
||||
coreURL: "/assets/core/package/dist/umd/ffmpeg-core.js",
|
||||
});
|
||||
}
|
||||
message.innerHTML = "Start Concating";
|
||||
const inputPaths = [];
|
||||
for (const file of files) {
|
||||
const { name } = file;
|
||||
ffmpeg.writeFile(name, await fetchFile(file));
|
||||
inputPaths.push(`file ${name}`);
|
||||
}
|
||||
await ffmpeg.writeFile('concat_list.txt', inputPaths.join('\n'));
|
||||
await ffmpeg.exec(['-f', 'concat', '-safe', '0', '-i', 'concat_list.txt', 'output.mp4']);
|
||||
message.innerHTML = "Complete Concating";
|
||||
const data = await ffmpeg.readFile('output.mp4');
|
||||
const video = document.getElementById("output-video");
|
||||
video.src = URL.createObjectURL(
|
||||
new Blob([data.buffer], {
|
||||
type: "video/mp4"
|
||||
})
|
||||
);
|
||||
};
|
||||
const elm = document.getElementById("uploader");
|
||||
elm.addEventListener("change", transcode);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
30
apps/vanilla-app/download-assets.js
Normal file
30
apps/vanilla-app/download-assets.js
Normal file
@@ -0,0 +1,30 @@
|
||||
const tar = require('tar');
|
||||
const fs = require('fs');
|
||||
|
||||
const NPM_URL = 'https://registry.npmjs.org';
|
||||
|
||||
const FFMPEG_VERSION = '0.12.2';
|
||||
const UTIL_VERSION = '0.12.0';
|
||||
const CORE_VERSION = '0.12.1';
|
||||
|
||||
const FFMPEG_TGZ = `ffmpeg-${FFMPEG_VERSION}.tgz`;
|
||||
const UTIL_TGZ = `util-${UTIL_VERSION}.tgz`;
|
||||
const CORE_TGZ = `core-${CORE_VERSION}.tgz`;
|
||||
|
||||
const FFMPEG_TGZ_URL = `${NPM_URL}/@ffmpeg/ffmpeg/-/${FFMPEG_TGZ}`;
|
||||
const UTIL_TGZ_URL = `${NPM_URL}/@ffmpeg/util/-/${UTIL_TGZ}`;
|
||||
const CORE_TGZ_URL = `${NPM_URL}/@ffmpeg/core/-/${CORE_TGZ}`;
|
||||
|
||||
const downloadAndUntar = async (url, tgzName, dst) => {
|
||||
console.log(`download and untar ${url}`);
|
||||
fs.mkdirSync(dst);
|
||||
const data = Buffer.from(await (await fetch(url)).arrayBuffer());
|
||||
fs.writeFileSync(tgzName, data);
|
||||
|
||||
await tar.x({ file: tgzName, C: dst });
|
||||
};
|
||||
|
||||
fs.mkdirSync('assets');
|
||||
downloadAndUntar(FFMPEG_TGZ_URL, FFMPEG_TGZ, 'assets/ffmpeg');
|
||||
downloadAndUntar(UTIL_TGZ_URL, UTIL_TGZ, 'assets/util');
|
||||
downloadAndUntar(CORE_TGZ_URL, CORE_TGZ, 'assets/core');
|
||||
15
apps/vanilla-app/package.json
Normal file
15
apps/vanilla-app/package.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "browser",
|
||||
"version": "0.12.0-alpha.0",
|
||||
"description": "browser example",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"download": "node download-assets.js",
|
||||
"start": "npx http-server -c-1"
|
||||
},
|
||||
"author": "Jerome Wu <jeromewus@gmail.com>",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tar": "^6.1.15"
|
||||
}
|
||||
}
|
||||
10
apps/vanilla-app/style.css
Normal file
10
apps/vanilla-app/style.css
Normal file
@@ -0,0 +1,10 @@
|
||||
html, body {
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
height: 100%
|
||||
}
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
43
apps/vanilla-app/transcode.esm.html
Normal file
43
apps/vanilla-app/transcode.esm.html
Normal file
@@ -0,0 +1,43 @@
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h3>Upload a video to transcode to mp4 (x264) and play!</h3>
|
||||
<video id="output-video" controls></video><br/>
|
||||
<input type="file" id="uploader">
|
||||
<p id="message"></p>
|
||||
<script type="module">
|
||||
import { FFmpeg } from "/assets/ffmpeg/package/dist/esm/index.js";
|
||||
import { fetchFile } from "/assets/util/package/dist/esm/index.js";
|
||||
let ffmpeg = null;
|
||||
|
||||
const transcode = async ({ target: { files } }) => {
|
||||
const message = document.getElementById('message');
|
||||
if (ffmpeg === null) {
|
||||
ffmpeg = new FFmpeg();
|
||||
ffmpeg.on("log", ({ message }) => {
|
||||
console.log(message);
|
||||
})
|
||||
ffmpeg.on("progress", ({ progress }) => {
|
||||
message.innerHTML = `${progress * 100} %`;
|
||||
});
|
||||
await ffmpeg.load({
|
||||
coreURL: "/assets/core/package/dist/esm/ffmpeg-core.js",
|
||||
});
|
||||
}
|
||||
const { name } = files[0];
|
||||
await ffmpeg.writeFile(name, await fetchFile(files[0]));
|
||||
message.innerHTML = 'Start transcoding';
|
||||
await ffmpeg.exec(['-i', name, 'output.mp4']);
|
||||
message.innerHTML = 'Complete transcoding';
|
||||
const data = await ffmpeg.readFile('output.mp4');
|
||||
|
||||
const video = document.getElementById('output-video');
|
||||
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
|
||||
}
|
||||
const elm = document.getElementById('uploader');
|
||||
elm.addEventListener('change', transcode);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
45
apps/vanilla-app/transcode.html
Normal file
45
apps/vanilla-app/transcode.html
Normal file
@@ -0,0 +1,45 @@
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<script src="/assets/ffmpeg/package/dist/umd/ffmpeg.js"></script>
|
||||
<script src="/assets/util/package/dist/umd/index.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h3>Upload a video to transcode to mp4 (x264) and play!</h3>
|
||||
<video id="output-video" controls></video><br/>
|
||||
<input type="file" id="uploader">
|
||||
<p id="message"></p>
|
||||
<script>
|
||||
const { fetchFile } = FFmpegUtil;
|
||||
const { FFmpeg } = FFmpegWASM;
|
||||
let ffmpeg = null;
|
||||
|
||||
const transcode = async ({ target: { files } }) => {
|
||||
const message = document.getElementById('message');
|
||||
if (ffmpeg === null) {
|
||||
ffmpeg = new FFmpeg();
|
||||
ffmpeg.on("log", ({ message }) => {
|
||||
console.log(message);
|
||||
})
|
||||
ffmpeg.on("progress", ({ progress, time }) => {
|
||||
message.innerHTML = `${progress * 100} %, time: ${time / 1000000} s`;
|
||||
});
|
||||
await ffmpeg.load({
|
||||
coreURL: "/assets/core/package/dist/umd/ffmpeg-core.js",
|
||||
});
|
||||
}
|
||||
const { name } = files[0];
|
||||
await ffmpeg.writeFile(name, await fetchFile(files[0]));
|
||||
message.innerHTML = 'Start transcoding';
|
||||
await ffmpeg.exec(['-i', name, 'output.mp4']);
|
||||
message.innerHTML = 'Complete transcoding';
|
||||
const data = await ffmpeg.readFile('output.mp4');
|
||||
|
||||
const video = document.getElementById('output-video');
|
||||
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
|
||||
}
|
||||
const elm = document.getElementById('uploader');
|
||||
elm.addEventListener('change', transcode);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
45
apps/vanilla-app/trim.html
Normal file
45
apps/vanilla-app/trim.html
Normal file
@@ -0,0 +1,45 @@
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<script src="/assets/ffmpeg/package/dist/umd/ffmpeg.js"></script>
|
||||
<script src="/assets/util/package/dist/umd/index.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h3>Upload a mp4 (x264) video and trim its first 1 seconds and play!</h3>
|
||||
<video id="output-video" controls></video><br/>
|
||||
<input type="file" id="uploader">
|
||||
<p id="message"></p>
|
||||
<script>
|
||||
const { fetchFile } = FFmpegUtil;
|
||||
const { FFmpeg } = FFmpegWASM;
|
||||
let ffmpeg = null;
|
||||
|
||||
const trim = async ({ target: { files } }) => {
|
||||
const message = document.getElementById('message');
|
||||
if (ffmpeg === null) {
|
||||
ffmpeg = new FFmpeg();
|
||||
ffmpeg.on("log", ({ message }) => {
|
||||
console.log(message);
|
||||
})
|
||||
ffmpeg.on("progress", ({ progress }) => {
|
||||
message.innerHTML = `${progress * 100} %`;
|
||||
});
|
||||
await ffmpeg.load({
|
||||
coreURL: "/assets/core/package/dist/umd/ffmpeg-core.js",
|
||||
});
|
||||
}
|
||||
const { name } = files[0];
|
||||
await ffmpeg.writeFile(name, await fetchFile(files[0]));
|
||||
message.innerHTML = 'Start trimming';
|
||||
await ffmpeg.exec(['-i', name, '-ss', '0', '-to', '1', 'output.mp4']);
|
||||
message.innerHTML = 'Complete trimming';
|
||||
const data = await ffmpeg.readFile('output.mp4');
|
||||
|
||||
const video = document.getElementById('output-video');
|
||||
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
|
||||
}
|
||||
const elm = document.getElementById('uploader');
|
||||
elm.addEventListener('change', trim);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user