ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π³ΠΎΠ΄Ρ WebAssembly (Wasm) ΡΡΠ°Π» ΠΌΠΎΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² Π²Π΅Π±-Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ
. ΠΠ΄Π½ΠΎ ΠΈΠ· ΡΠ°ΠΌΡΡ
ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ
ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ WebAssembly β ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ FFmpeg, ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°, ΠΏΡΡΠΌΠΎ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. FFmpeg.wasm, WebAssembly-Π²Π΅ΡΡΠΈΡ FFmpeg, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° β ΡΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΈ ΠΆΠΈΠ²ΠΎΠΉ ΡΡΡΠΈΠΌΠΈΠ½Π³. ΠΡΠ° ΡΡΠ°ΡΡΡ Π΄Π°ΡΡ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠΈΠΉ Π³ΠΈΠ΄ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ FFmpeg.wasm, ΠΎΡ
Π²Π°ΡΡΠ²Π°Ρ Π²ΡΡ β ΠΎΡ Π±Π°Π·ΠΎΠ²ΡΡ
ΠΊΠΎΠΌΠ°Π½Π΄ Π΄ΠΎ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΡ
ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ ΠΈ ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π².
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΠΉ Π±Π°Π½Π΄Π» ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ @ffmpeg/ffmpeg (Ρ @ffmpeg/util Π΄Π»Ρ Ρ
Π΅Π»ΠΏΠ΅ΡΠΎΠ² Π²ΡΠΎΠ΄Π΅ fetchFile). Π‘ΡΠ°ΡΡΠ΅ ΡΡΡΠΎΡΠΈΠ°Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΈΠΌΡ ΠΏΠ°ΠΊΠ΅ΡΠ° ffmpeg.wasm ΠΈ API run(); Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ FFmpeg, load(), exec() ΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π² ΠΏΠ°ΠΌΡΡΠΈ (writeFile / readFile). Π‘Π½ΠΈΠΏΠΏΠ΅ΡΡ Π½ΠΈΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ exec() Ρ ΡΠ΅ΠΌΠΈ ΠΆΠ΅ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΡΡΠΎ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ Π±Ρ Π² FFmpeg CLI; Π²Ρ
ΠΎΠ΄Π½ΡΠ΅ Π±Π°ΠΉΡΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π½ΡΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ Π€Π‘ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄.
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² FFmpeg ΠΈ WebAssembly
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ FFmpeg?
FFmpeg β ΡΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ open-source-ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½ΡΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ, ΡΠΏΠΎΡΠΎΠ±Π½ΡΠΉ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ, ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΡΡΡΠΈΠΌΠΈΡΡ Π°ΡΠ΄ΠΈΠΎ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ. ΠΠ½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΊΠΎΠ΄Π΅ΠΊΠΎΠ², ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ². Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΠΌΠΎΡΡ FFmpeg Π΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²ΡΠ±ΠΎΡΠ° Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ
Ρ ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠ°.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ WebAssembly (Wasm)?
WebAssembly β Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ, Π΄Π°ΡΡΠΈΠΉ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡΡ ΡΠ΅Π»Ρ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ
ΡΠ·ΡΠΊΠΎΠ² Π²ΡΠΎΠ΄Π΅ C, C++ ΠΈ Rust. Wasm ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π±Π»ΠΈΠ·ΠΊΠΎΠΌ ΠΊ Π½Π°ΡΠΈΠ²Π½ΠΎΠΌΡ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ Π΄Π»Ρ Π·Π°Π΄Π°Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΠ°Π΄Π΅ΠΉΡΡΠ²ΡΡ WebAssembly, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π° ΡΡΠΎΡΠΎΠ½Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΠ½ΠΈΠΆΠ°Ρ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΡΠ»ΡΡΡΠ°Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ.
ΠΡΠ³ΠΎΠ΄Ρ FFmpeg.wasm
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ FFmpeg.wasm Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
Π΄Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²:
- Π£Π»ΡΡΡΠ΅Π½Π½Π°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ: ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Ρ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΡΡΠΌΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅, Π²Ρ ΡΠ½ΠΈΠΆΠ°Π΅ΡΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΈ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
- ΠΡΡΡΠΈΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ: Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΠΉ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Π·Π°ΠΌΠ΅ΡΠ½ΠΎ ΡΠ»ΡΡΡΠ°ΡΡ ΠΎΠΏΡΡ.
- ΠΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡ: ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ ΡΠΎΡΡΠΎΠΌ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ
ΡΠ΅ΡΡΡΡΠΎΠ².
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ FFmpeg.wasm
Π§ΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ FFmpeg.wasm, Π½ΡΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΡΠΎΡ ΡΠ°Π·Π΄Π΅Π» ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ»ΠΊΠΈ ΠΈ ΡΠ°Π³ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ.
ΠΡΠ΅Π΄ΠΏΠΎΡΡΠ»ΠΊΠΈ
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π½Π°ΡΠ°ΡΡ, ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
- Node.js: ΡΡΠ΅Π΄Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ JavaScript Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° JavaScript-ΠΊΠΎΠ΄Π° Π²Π½Π΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ°.
- npm: ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Node, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ JavaScript-ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ.
Π¨Π°Π³ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Node.js LTS ΠΈ npm: ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ LTS-ΡΠ΅Π»ΠΈΠ· Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ° Node.js, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ FFmpeg Π΄Π»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ°: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ npm Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ
ΠΏΠ°ΠΊΠ΅ΡΠΎΠ².
npm install @ffmpeg/ffmpeg @ffmpeg/util
-
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ: ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Node.js.
mkdir browser-ffmpeg
cd browser-ffmpeg
npm init -y
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Webpack: Webpack β ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ, ΠΏΠΎΠΌΠΎΠ³Π°ΡΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π²Π°Ρ JavaScript-ΠΊΠΎΠ΄.
npm install --save-dev webpack webpack-cli
-
ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ Webpack: ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» webpack.config.js Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Webpack.
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
},
],
},
};
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Babel: Babel β ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΠΈΠΉ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ JavaScript Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ ΠΊΠΎΠ΄.
npm install --save-dev @babel/core @babel/preset-env babel-loader
-
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΎΡΠΊΡ Π²Ρ
ΠΎΠ΄Π°: ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» src/index.js ΠΊΠ°ΠΊ ΡΠΎΡΠΊΡ Π²Ρ
ΠΎΠ΄Π°.
import { FFmpeg } from '@ffmpeg/ffmpeg';
const ffmpeg = new FFmpeg();
ffmpeg.load().then(() => {
console.log('FFmpeg loaded successfully');
});
-
Π‘ΠΎΠ±Π΅ΡΠΈΡΠ΅ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Webpack Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΡΠ°Π·Π΄Π°ΠΉΡΠ΅ Π΅Π³ΠΎ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
npx webpack
Π‘ΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π°ΡΡ ΠΏΡΠΎΡΡΡΠΌ HTTP-ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
python -m http.server 8000
ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ FFmpeg Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ FFmpeg.wasm Π½Π°ΡΡΡΠΎΠ΅Π½, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΠΈΠ½Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π±Π°Π·ΠΎΠ²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅.
ΠΠ°Π³ΡΡΠ·ΠΊΠ° FFmpeg.wasm
Π§ΡΠΎΠ±Ρ Π·Π°Π³ΡΡΠ·ΠΈΡΡ FFmpeg.wasm, Π½ΡΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ load, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ FFmpeg.wasm. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΠΎΠΌΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π·ΠΎΠ»Π²ΠΈΡΡΡ, ΠΊΠΎΠ³Π΄Π° FFmpeg Π³ΠΎΡΠΎΠ² ΠΊ ΡΠ°Π±ΠΎΡΠ΅.
import { FFmpeg } from '@ffmpeg/ffmpeg';
const ffmpeg = new FFmpeg();
ffmpeg.load().then(() => {
console.log('FFmpeg loaded successfully');
});
ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΡΡ
ΠΊΠΎΠΌΠ°Π½Π΄
ΠΠΎΠΌΠ°Π½Π΄Ρ FFmpeg Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π· exec() ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΠΈΡΠΈ Π²Ρ
ΠΎΠ΄Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ² Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠΈΠΆΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ; ΡΠ΅Π°Π»ΡΠ½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ ΡΠ°ΠΊΠΆΠ΅ Π½ΡΠΆΠ½Ρ writeFile / readFile (ΡΠΌ. README ΠΏΠ°ΠΊΠ΅ΡΠ°).
ΠΠ±ΡΠ΅Π·ΠΊΠ° Π²ΠΈΠ΄Π΅ΠΎ
Π§ΡΠΎΠ±Ρ ΠΎΠ±ΡΠ΅Π·Π°ΡΡ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠΏΡΠΈΠΈ -ss ΠΈ -t.
ffmpeg.exec([
'-i', 'input.mp4',
'-ss', '00:00:05', // Start at 5 seconds
'-t', '00:00:10', // Duration of 10 seconds
'output.mp4'
]).then(() => {
console.log('Video trimmed successfully');
});
ΠΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ
Π§ΡΠΎΠ±Ρ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΈΠ΄Π΅ΠΎ Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΠΎΡΠΌΠ°Ρ, ΡΠΊΠ°ΠΆΠΈΡΠ΅ ΡΠΎΡΠΌΠ°Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΈ ΠΊΠΎΠ΄Π΅ΠΊ.
ffmpeg.exec([
'-i', 'input.mp4',
'-c:v', 'libx264', // H.264 video codec
'-c:a', 'aac', // AAC audio codec
'output.mp4'
]).then(() => {
console.log('Video encoded successfully');
});
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
FFmpeg.wasm ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΈΡΠΎΠΊΠΈΠΉ ΡΠΏΠ΅ΠΊΡΡ Π·Π°Π΄Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΈ ΠΆΠΈΠ²ΠΎΠΉ ΡΡΡΠΈΠΌΠΈΠ½Π³.
Π’ΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΡΠΌΠ°ΡΠΎΠ² Π²ΠΈΠ΄Π΅ΠΎ
Π’ΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ. ΠΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΠ°Π·Π½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ.
ffmpeg.exec([
'-i', 'input.mp4',
'-c:v', 'libvpx-vp9', // VP9 video codec
'-b:v', '1M', // Video bitrate
'-c:a', 'libopus', // Opus audio codec
'output.webm'
]).then(() => {
console.log('Video transcoded successfully');
});
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΠΈΠ΄Π΅ΠΎΡΠΈΠ»ΡΡΡΠΎΠ²
FFmpeg ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°Π·Π½ΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡΠΈΠ»ΡΡΡΡ, ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΡΠ΅ ΠΊ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΌΡ Π²ΠΈΠ΄Π΅ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΠΈΠ»ΡΡΡ crop, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ΅Π·Π°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡ Π²ΠΈΠ΄Π΅ΠΎ.
ffmpeg.exec([
'-i', 'input.mp4',
'-vf', 'crop=640:480', // Crop to 640x480
'output.mp4'
]).then(() => {
console.log('Video filtered successfully');
});
ΠΠΎΠΏΡΠΎΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ FFmpeg.wasm Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π²Π°ΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ β ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠΎΡΠΎΡΡΠΈ.
ΠΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ
FFmpeg.wasm ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΡΠΌ ΠΏΠ°ΠΌΡΡΠΈ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ
Π²ΠΈΠ΄Π΅ΠΎΡΠ°ΠΉΠ»ΠΎΠ². Π§ΡΠΎΠ±Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠ°ΠΌΡΡΡΡ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ:
- ΠΠΎΡΠΎΠΊΠΎΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠΏΡΠΈΡ
-f segment, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π²ΠΈΠ΄Π΅ΠΎ ΠΌΠ΅Π½ΡΡΠΈΠΌΠΈ ΠΊΡΡΠΊΠ°ΠΌΠΈ.
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΡΡ: Π±ΠΎΠ»ΡΡΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΡΠΏΠΎΡΠΎΠ±Π½Ρ ΠΈΡΡΠ΅ΡΠΏΠ°ΡΡ ΠΏΠ°ΠΌΡΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ°; ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΠΉΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡΠΎΡΠΊΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ, ΡΠ΄Π°Π»ΡΠΉΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ Π€Π‘ ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΈ Π½Π΅ Π΄Π΅ΡΠΆΠΈΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π½ΡΡ
ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΠΈ.
ffmpeg.exec([
'-i', 'input.mp4',
'-f', 'segment',
'-segment_time', '10', // Process video in 10-second segments
'output_%03d.mp4'
]).then(() => {
console.log('Video processed in segments');
});
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠΎΡΠΎΡΡΠΈ
Π§ΡΠΎΠ±Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΊΠΎΡΠΎΡΡΡ FFmpeg.wasm, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ β Π±ΠΈΡΡΠ΅ΠΉΡ Π²ΠΈΠ΄Π΅ΠΎ, ΡΠ°ΡΡΠΎΡΡ ΠΊΠ°Π΄ΡΠΎΠ² ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠ΄Π΅ΠΊΠ°.
ffmpeg.exec([
'-i', 'input.mp4',
'-c:v', 'libx264', // H.264 video codec
'-b:v', '500k', // Lower video bitrate for faster processing
'-r', '15', // Lower frame rate
'output.mp4'
]).then(() => {
console.log('Video optimized for speed');
});
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ dcast.tv
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ FFmpeg.wasm ΡΠΏΠΎΡΠΎΠ±Π½Π° Π·Π°ΠΌΠ΅ΡΠ½ΠΎ ΡΡΠΈΠ»ΠΈΡΡ ΡΡΡΠΈΠΌΠΈΠ½Π³ΠΎΠ²ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ Π²ΡΠΎΠ΄Π΅ dcast.tv. ΠΡΠΏΠΎΠ»Π½ΡΡ ΡΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π²Ρ ΡΠ½ΠΈΠΆΠ°Π΅ΡΠ΅ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΡΠ»ΡΡΡΠ°Π΅ΡΠ΅ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ.
Π Π΅Π°Π»ΡΠ½ΡΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ: ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΆΠΈΠ²ΠΎΠ³ΠΎ ΡΡΡΠΈΠΌΠΈΠ½Π³Π°
ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΌΡΡ
ΡΠ±Π΅Π΄ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² Π΄Π»Ρ FFmpeg.wasm β ΠΆΠΈΠ²ΠΎΠΉ ΡΡΡΠΈΠΌΠΈΠ½Π³. ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Ρ Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π²Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ Π΄ΠΎΡΡΠΈΠ³Π½Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠ»ΡΡΡΠ°Ρ ΠΎΠ±ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ.
ΠΡΠΈΠΌΠ΅Ρ: ΠΆΠΈΠ²ΠΎΠΉ ΡΡΡΠΈΠΌΠΈΠ½Π³
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΠΆΠΈΠ²ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° Ρ ΠΊΠ°ΠΌΠ΅ΡΡ Π² RTMP ΡΠ΅ΡΠ΅Π· FFmpeg.wasm ΡΠ΅Π΄ΠΊΠΎ Π±ΡΠ²Π°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½-Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ: Π±ΡΠ°ΡΠ·Π΅ΡΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΡΡΡ ΡΠ΅ΡΠ΅Π· WebRTC ΠΈΠ»ΠΈ SDK Π²Π΅Π½Π΄ΠΎΡΠ° Π½Π° ΠΌΠ΅Π΄ΠΈΠ°ΡΠ΅ΡΠ²Π΅Ρ, Π° RTMP/SRT-ΠΏΡΠΈΡΠΌ Π±Π΅ΡΡΡ Π½Π° ΡΠ΅Π±Ρ OBS ΠΈΠ»ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠ΅ ΡΠ½ΠΊΠΎΠ΄Π΅ΡΡ. ΠΡΠΎΠ³ΠΎΠ½ ΠΊΠ°Π΄ΡΠΎΠ² Ρ canvas ΡΠ΅ΡΠ΅Π· wasm-FFmpeg ΡΡΠΆΡΠ» Π΄Π»Ρ CPU ΠΈ Ρ
ΡΡΠΏΠΎΠΊ. Π‘ΡΠΈΡΠ°ΠΉΡΠ΅ FFmpeg.wasm Π»ΡΡΡΠΈΠΌ Π΄Π»Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ
ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΉ ΡΠ°ΠΉΠ»ΠΎΠ² (ΠΎΠ±ΡΠ΅Π·ΠΊΠ°, ΡΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΊΠΈΡ
ΠΊΠ»ΠΈΠΏΠΎΠ²); Π΄Π»Ρ ΠΆΠΈΠ²ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΡΠΎΡΠ²ΡΠΈΠ΅ΡΡ ΠΏΡΡΠΈ ΠΏΡΠΈΡΠΌΠ°.
ΠΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
Π₯ΠΎΡΡ FFmpeg.wasm Π΄Π°ΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π²ΡΠ³ΠΎΠ΄Ρ, ΠΎΠ½ ΡΠ°ΠΊΠΆΠ΅ Π²Π½ΠΎΡΠΈΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΡΠΊΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π±ΠΎΠ»ΡΡΠΈΡ
Π²ΠΈΠ΄Π΅ΠΎΡΠ°ΠΉΠ»ΠΎΠ² ΡΠΏΠΎΡΠΎΠ±Π½Π° ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΡΠ΅ΡΠΊΠ°ΠΌ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ»ΠΈ Π°ΡΠ°ΠΊΠ°ΠΌ ΡΠΈΠΏΠ° Β«ΠΎΡΠΊΠ°Π· Π² ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠΈΒ». Π§ΡΠΎΠ±Ρ ΡΠ½ΠΈΠ·ΠΈΡΡ ΡΡΠΈ ΡΠΈΡΠΊΠΈ, ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠΉΡΠ΅ Π²Ρ
ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΠ΅ΡΡ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ ΡΠΈΡΠΊΠΎΠ²
- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ Π²Ρ
ΠΎΠ΄Π°: Π²ΡΠ΅Π³Π΄Π° Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠΉΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ Π²ΠΈΠ΄Π΅ΠΎΡΠ°ΠΉΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ.
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ: ΡΠ΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ Π½Π°Π΄ΡΠΆΠ½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΌΠΈ ΡΠΈΡΡΠ°ΡΠΈΡΠΌΠΈ.
- ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΡΠΎΡΡ: ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΠΉΡΠ΅ ΡΠΈΡΠ»ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²ΠΈΠ΄Π΅ΠΎ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΡΠ΄ΡΡΠ΅Π΅ FFmpeg ΠΈ WebAssembly
ΠΡΠ΄ΡΡΠ΅Π΅ FFmpeg ΠΈ WebAssembly ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Π΅ΡΠ°ΡΡΠ΅, Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡΠΈΠΌΠΈΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΠΌΠΈ Π² ΠΎΠ±Π΅ΠΈΡ
ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡ
. FFmpeg ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ»ΡΡΡΠ°Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π½ΠΎΠ²ΡΡ
ΠΊΠΎΠ΄Π΅ΠΊΠΎΠ² ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, Π° WebAssembly Π²ΡΡ Π³Π»ΡΠ±ΠΆΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅ΡΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΡ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ².
ΠΡΠΎΠ³Π½ΠΎΠ·Ρ
- Π£Π»ΡΡΡΠ΅Π½Π½Π°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ: ΠΆΠ΄ΠΈΡΠ΅ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΡ
ΡΠ»ΡΡΡΠ΅Π½ΠΈΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ Ρ WebAssembly.
- ΠΠΎΠ²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ: FFmpeg, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π½Π°ΡΠΎΠΆΠ΄Π°ΡΡΠΈΡ
ΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΡΠ°Π½Π΄Π°ΡΡΠΎΠ² ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ².
- ΠΠΎΠ»Π΅Π΅ ΡΠΈΡΠΎΠΊΠΎΠ΅ ΠΏΡΠΈΠ½ΡΡΠΈΠ΅: ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΡΠΎΡΡΠ° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΠΈ WebAssembly FFmpeg.wasm Π±ΡΠ΄Π΅Ρ ΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
.
Π Π°Π·Π΄Π΅Π» FAQ
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ FFmpeg.wasm?
ΠΡΠ²Π΅Ρ: FFmpeg.wasm β WebAssembly-Π²Π΅ΡΡΠΈΡ FFmpeg, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ FFmpeg ΠΏΡΡΠΌΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅. ΠΠ½Π° Π΄Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΡΠΈΠ»ΠΈΠ²Π°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ.
Π§Π΅ΠΌ FFmpeg.wasm ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ FFmpeg?
ΠΡΠ²Π΅Ρ: ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΠΉ FFmpeg ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ FFmpeg.wasm ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π· WebAssembly. ΠΡΠΎ Π΄Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈ ΠΌΠ΅Π½ΡΡΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΌΠΎΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ FFmpeg.wasm Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ?
ΠΡΠ²Π΅Ρ: Π΄Π°, FFmpeg.wasm ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Ρ
Π²Π°ΡΠ° Π²ΠΈΠ΄Π΅ΠΎ Ρ Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅ΡΡ ΠΈ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° Π»Π΅ΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π·Π½ΠΈΡΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π°Π΄Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠ°ΠΊΠΎΠ²Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ FFmpeg.wasm Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅?
ΠΡΠ²Π΅Ρ: ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π»ΠΈΠΌΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ, Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌ FFmpeg ΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΡΠΊΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΠΌΠΎΠ³ΡΡ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΡΡ
Π²ΠΈΠ΄Π΅ΠΎΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠ°ΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡΠ°ΠΉΠ»Ρ Ρ FFmpeg.wasm?
ΠΡΠ²Π΅Ρ: ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡΠ°ΠΉΠ»Ρ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΠΉΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΌΠ΅Π½ΡΡΠΈΠΌΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΡΠΈΡ -f segment. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΏΡΠ°Π²Π»ΡΠΉΡΠ΅ ΠΏΠ°ΠΌΡΡΡΡ, ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎ Π΅Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠ΄Π΅ΠΊΠ° Π΄Π»Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ FFmpeg.wasm Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π²Π΅Π±-ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠΌΠΈ Π²ΡΠΎΠ΄Π΅ React ΠΈΠ»ΠΈ Vue?
ΠΡΠ²Π΅Ρ: Π΄Π°, FFmpeg.wasm ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°ΠΌΠΈ Π²ΡΠΎΠ΄Π΅ React ΠΈΠ»ΠΈ Vue. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π²ΡΠΎΠ΄Π΅ Webpack, ΡΡΠΎΠ±Ρ Π²ΠΊΠ»ΡΡΠΈΡΡ FFmpeg.wasm Π² ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ.
ΠΠ΄Π΅ Π½Π°ΠΉΡΠΈ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΠΎ FFmpeg ΠΈ WebAssembly?
ΠΡΠ²Π΅Ρ: Π·Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΡΠΌΠΈ ΠΎΠ±ΡΠ°ΡΠ°ΠΉΡΠ΅ΡΡ ΠΊ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ FFmpeg ΠΈ Π³ΠΈΠ΄Π°ΠΌ ΠΏΠΎ WebAssembly. ΠΠ·ΡΡΠ°ΠΉΡΠ΅ ΡΠΎΡΡΠΌΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π° ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ GitHub ΡΠ°Π΄ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ².
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
FFmpeg.wasm β Π·Π½Π°ΡΠΈΠΌΡΠΉ ΡΠ°Π³ Π²ΠΏΠ΅ΡΡΠ΄ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΏΡΡΠΌΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅. ΠΠ°Π΄Π΅ΠΉΡΡΠ²ΡΡ WebAssembly, Π²Ρ ΡΡΠΈΠ»ΠΈΠ²Π°Π΅ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΡΠ»ΡΡΡΠ°Π΅ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ ΠΈ ΡΠΏΡΠΎΡΠ°Π΅ΡΠ΅ Π΄ΠΎΡΡΠ°Π²ΠΊΡ Π²ΠΈΠ΄Π΅ΠΎ. ΠΠΎ ΠΌΠ΅ΡΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ FFmpeg.wasm, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠ°Π½Π΅Ρ Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΈ Π°Π²ΡΠΎΡΠΎΠ² ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.