@capacitor-community/video-recorder
CAPACITOR 5
capacitor plugin to record video
Capacitor v6
npm install @capacitor-community/video-recorder
npx cap sync
Capacitor v5
npm install @capacitor-community/video-recorder@5
npx cap sync
To ensure the Android lib is downloadable when building the app, you can add the following to the repositories section of your project's build.gradle file:
repositories {
google()
mavenCentral()
maven {
url "https://jitpack.io"
}
}
- iOS
- Android
On a web browser, we will fake the behavior to allow for easier development.
In order to initialize the camera feed (note: you are not recording at this point), you must first specify a config to the video recorder.
Note: To overlay your web UI on-top of the camera output, you must use stackPosition: back and make all layers of your app transparent so that the camera can be seen under the webview.
There are 2 changes needed to make the webview transparent on Android and iOS:
// in the scss file of your page
ion-content {
--background: transparent;
}
// in the capacitor.config.ts
{
'backgroundColor: '#ff000000', // this is needed mainly on iOS
}
Next in your app:
import { VideoRecorderCamera, VideoRecorderPreviewFrame } from '@capacitor-community/video-recorder';
const { VideoRecorder } = Plugins;
const config: VideoRecorderPreviewFrame = {
id: 'video-record',
stackPosition: 'back', // 'front' overlays your app', 'back' places behind your app.
width: 'fill',
height: 'fill',
x: 0,
y: 0,
borderRadius: 0
};
await VideoRecorder.initialize({
camera: VideoRecorderCamera.FRONT, // Can use BACK
previewFrames: [config]
});
Starts recording against the capture device.
VideoRecorder.startRecording();
Stops the capture device and returns the path of the local video file.
const res = await VideoRecorder.stopRecording();
// The video url is the local file path location of the video output.
return res.videoUrl;
Used to disconnect from the capture device and remove any native UI layers that exist.
VideoRecorder.destroy();
The demo app can be found in the Example folder of this repo
initialize(...)
destroy()
flipCamera()
toggleFlash()
enableFlash()
disableFlash()
isFlashAvailable()
isFlashEnabled()
addPreviewFrameConfig(...)
editPreviewFrameConfig(...)
switchToPreviewFrame(...)
showPreviewFrame(...)
hidePreviewFrame()
startRecording()
stopRecording()
getDuration()
addListener('onVolumeInput', ...)
- Interfaces
- Enums
initialize(options?: VideoRecorderOptions | undefined) => Promise<void>
Param | Type |
---|---|
options |
VideoRecorderOptions |
destroy() => Promise<void>
flipCamera() => Promise<void>
toggleFlash() => Promise<void>
enableFlash() => Promise<void>
disableFlash() => Promise<void>
isFlashAvailable() => Promise<{ isAvailable: boolean; }>
Returns: Promise<{ isAvailable: boolean; }>
isFlashEnabled() => Promise<{ isEnabled: boolean; }>
Returns: Promise<{ isEnabled: boolean; }>
addPreviewFrameConfig(config: VideoRecorderPreviewFrame) => Promise<void>
Param | Type |
---|---|
config |
VideoRecorderPreviewFrame |
editPreviewFrameConfig(config: VideoRecorderPreviewFrame) => Promise<void>
Param | Type |
---|---|
config |
VideoRecorderPreviewFrame |
switchToPreviewFrame(options: { id: string; }) => Promise<void>
Param | Type |
---|---|
options |
{ id: string; } |
showPreviewFrame(config: { position: number; quality: number; }) => Promise<void>
Param | Type |
---|---|
config |
{ position: number; quality: number; } |
hidePreviewFrame() => Promise<void>
startRecording() => Promise<void>
stopRecording() => Promise<{ videoUrl: string; }>
Returns: Promise<{ videoUrl: string; }>
getDuration() => Promise<{ value: number; }>
Returns: Promise<{ value: number; }>
addListener(eventName: 'onVolumeInput', listenerFunc: (event: { value: number; }) => void) => Promise<PluginListenerHandle>
Param | Type |
---|---|
eventName |
'onVolumeInput' |
listenerFunc |
(event: { value: number; }) => void |
Returns: Promise<PluginListenerHandle>
Prop | Type | Description | Default |
---|---|---|---|
camera |
VideoRecorderCamera |
||
quality |
VideoRecorderQuality |
||
autoShow |
boolean |
||
previewFrames |
VideoRecorderPreviewFrame[] |
||
videoBitrate |
number |
The default bitrate is 4.5Mbps | 4500000 |
Prop | Type |
---|---|
id |
string |
stackPosition |
'front' | 'back' |
x |
number |
y |
number |
width |
number | 'fill' |
height |
number | 'fill' |
borderRadius |
number |
dropShadow |
{ opacity?: number; radius?: number; color?: string; } |
Prop | Type |
---|---|
remove |
() => Promise<void> |
Members | Value |
---|---|
FRONT |
0 |
BACK |
1 |
Members | Value |
---|---|
MAX_480P |
0 |
MAX_720P |
1 |
MAX_1080P |
2 |
MAX_2160P |
3 |
HIGHEST |
4 |
LOWEST |
5 |
QVGA |
6 |
The Android code is using triniwiz/FancyCamera
v1.2.4 (https://github.com/triniwiz/fancycamera)
The iOS code is implemented using AVFoundation
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!