Мой код:
Код: Выделить всё
let ffmpeg, loaded = false;
async function processVideoWithFFmpeg(videoFile) {
if (!ffmpeg || !loaded) {
ffmpeg = new FFmpeg();
ffmpeg.setLogger(({ message }) => console.log(message));
await ffmpeg.load();
loaded = true;
}
console.time('Total Processing');
// Read video file
const uint8Array = new Uint8Array(await videoFile.arrayBuffer());
await ffmpeg.writeFile('input.mp4', uint8Array);
// Load font for drawtext filter
const fontResponse = await fetch('https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/fonts/roboto/Roboto-Bold.ttf');
const fontData = await fontResponse.arrayBuffer();
await ffmpeg.writeFile('Roboto-Bold.ttf', new Uint8Array(fontData));
// Execute FFmpeg command
await ffmpeg.exec([
'-i', 'input.mp4',
'-vf', `drawtext=fontfile=Roboto-Bold.ttf:text='Watermark':fontsize=48:fontcolor=white:x=(w-text_w)/2:y=h-th-10:borderw=2:bordercolor=black`,
'-c:v', 'libx264',
'-preset', 'ultrafast',
'-crf', '23',
'-threads', '0',
'-c:a', 'copy',
'output.mp4'
]);
console.timeEnd('Total Processing');
// Read output
const data = await ffmpeg.readFile('output.mp4');
const blob = new Blob([data.buffer], { type: 'video/mp4' });
// Cleanup
await ffmpeg.deleteFile('input.mp4');
await ffmpeg.deleteFile('output.mp4');
await ffmpeg.deleteFile('Roboto-Bold.ttf');
return blob;
}
Код: Выделить всё
frame= 1847 fps=1.2 q=28.0 size= 5120kB time=00:01:01.50 bitrate= 682.5kbits/s speed=0.04x
Что мне нужно
Способ сократить время обработки менее 1–2 минут для 20-секундного видео 1080p или подтверждение того, что это фундаментальное ограничение WASM, требующее обработки на стороне сервера.
Подробнее здесь: https://stackoverflow.com/questions/797 ... o-optimize
Мобильная версия