Web Setup¶
Configure FFmpeg.wasm for browser-based video encoding
Fluvie uses ffmpeg.wasm for web platform support. This runs FFmpeg entirely in the browser using WebAssembly.
Table of Contents¶
- Requirements
- Server Configuration
- Local Development
- FFmpeg.wasm Versions
- Limitations
- Troubleshooting
Requirements¶
CORS Headers¶
FFmpeg.wasm requires SharedArrayBuffer, which needs specific security headers:
Server Configuration¶
Nginx¶
location / {
add_header Cross-Origin-Opener-Policy same-origin;
add_header Cross-Origin-Embedder-Policy require-corp;
}
Apache¶
<IfModule mod_headers.c>
Header set Cross-Origin-Opener-Policy "same-origin"
Header set Cross-Origin-Embedder-Policy "require-corp"
</IfModule>
Express.js¶
app.use((req, res, next) => {
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
next();
});
Firebase Hosting¶
Add to firebase.json:
{
"hosting": {
"headers": [
{
"source": "**/*",
"headers": [
{
"key": "Cross-Origin-Opener-Policy",
"value": "same-origin"
},
{
"key": "Cross-Origin-Embedder-Policy",
"value": "require-corp"
}
]
}
]
}
}
Vercel¶
Add to vercel.json:
{
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "Cross-Origin-Opener-Policy",
"value": "same-origin"
},
{
"key": "Cross-Origin-Embedder-Policy",
"value": "require-corp"
}
]
}
]
}
Netlify¶
Add to netlify.toml:
[[headers]]
for = "/*"
[headers.values]
Cross-Origin-Opener-Policy = "same-origin"
Cross-Origin-Embedder-Policy = "require-corp"
Local Development¶
Flutter's Built-in Server¶
Flutter's flutter run -d chrome doesn't support custom headers. Options:
-
Use a local server - Run a simple server with headers:
-
Use the Fluvie dev server (if available in example):
FFmpeg.wasm Versions¶
Fluvie uses ffmpeg.wasm loaded from CDN. The library handles loading automatically.
Custom CDN Path¶
If you need to host ffmpeg.wasm yourself:
Limitations¶
Browser Compatibility¶
FFmpeg.wasm requires: - Chrome 89+ - Firefox 79+ - Safari 15.2+ - Edge 89+
Performance¶
- WebAssembly is slower than native FFmpeg
- Large videos may cause memory issues
- Consider limiting resolution/duration for web
File Size¶
FFmpeg.wasm adds ~25MB to your app (loaded on demand).
Troubleshooting¶
SharedArrayBuffer Not Available¶
Error: SharedArrayBuffer is not defined
This means CORS headers are not set. Check your server configuration.
Out of Memory¶
WebAssembly has memory limits. For large videos:
- Reduce resolution
- Process in smaller chunks
- Increase memory limit (if possible)
Slow Performance¶
Tips for better web performance:
- Use lower resolution (720p instead of 1080p)
- Use shorter durations
- Reduce frame rate (24fps instead of 60fps)
- Consider preprocessing complex compositions
CORS Errors with External Resources¶
If loading external images/videos, ensure they have proper CORS headers:
Or proxy them through your server.
Related¶
- Platform Overview - All platforms
- FFmpeg Setup - General FFmpeg guide
- Custom FFmpeg Provider - Custom integrations
- Performance Tips - Optimization for web