av-kit
Version:
AVFoundation Recorder kit for Node.js
199 lines (156 loc) • 4.25 kB
Markdown
A high-quality screen and camera recording library for Node.js based on macOS AVFoundation.

- 📹 Screen recording with cursor capture
- 🎥 Webcam recording
- 🎤 Audio recording from microphones
- ⚡ Promise-based API with TypeScript support
- **macOS**: Uses AVFoundation (macOS-only)
- **Node.js**: 16.x or higher
## Installation
```bash
npm install av-kit
# or
yarn add av-kit
# or
pnpm add av-kit
```
## Quick Example
```typescript
import { Recorder, getDisplays, getCameras } from "av-kit";
import path from "path";
import os from "os";
async function main() {
try {
// Get available devices
const displays = await getDisplays();
const cameras = await getCameras();
// Create recorder with display and webcam
const recorder = new Recorder({
output_directory: path.join(
os.homedir(),
"Videos",
"recording-" + new Date().toISOString()
),
items: [
{
type: "display",
display: displays[0],
shows_cursor: true,
},
{
type: "webcam",
camera: cameras[0],
},
],
});
// Start recording
await recorder.start();
console.log("Recording started! Will stop in 5 seconds...");
await new Promise((resolve) => setTimeout(resolve, 5000));
// Stop recording and get results
const result = await recorder.stop();
console.log("Recording stopped!");
// Show recording file paths
result.files.forEach((file) => {
console.log(`${file.type} recording: ${file.path}`);
});
} catch (error) {
console.error("Recording error:", error);
}
}
main();
```
```typescript
// Types
type DeviceType = "display" | "camera" | "microphone";
type RecordingMode = "display" | "webcam";
// Device interfaces
interface Display {
id: string; // Device identifier
name: string; // Display name
}
interface Camera {
id: string; // Device identifier
name: string; // Camera name
}
interface Microphone {
id: string; // Device identifier
name: string; // Microphone name
}
// Recording configuration
type DisplayRecordingItem = {
type: "display";
display: Display; // Display to record
microphone?: Microphone; // Optional audio source
shows_cursor?: boolean; // Show cursor in recording (default: false)
};
type WebcamRecordingItem = {
type: "webcam";
camera: Camera; // Camera to record
microphone?: Microphone; // Optional audio source
};
type RecordingItem = DisplayRecordingItem | WebcamRecordingItem;
// Recorder options
interface RecorderOptions {
output_directory: string; // Where to save recordings
items: RecordingItem[]; // Displays/cameras to record
}
// Recording results
interface FileResult {
path: string; // Path to recorded file
type: RecordingMode; // Type of recording
deviceName?: string; // Name of recorded device
dimensions?: {
// Video dimensions
width: number;
height: number;
};
durationInSeconds?: number; // Duration of recording
}
interface RecordingResult {
files: FileResult[]; // Array of recorded files
}
```
```typescript
// Device detection
async function getDisplays(): Promise<Display[]>;
async function getCameras(): Promise<Camera[]>;
async function getMicrophones(): Promise<Microphone[]>;
// Recorder class
class Recorder {
constructor(options: RecorderOptions);
// Optional preparation step (automatically called by start if not called)
async prepare(): Promise<void>;
// Start recording
async start(): Promise<void>;
// Stop recording and get results
async stop(): Promise<RecordingResult>;
}
```
When using av-kit in an Electron application, configure your build to handle FFmpeg dependencies:
```javascript
// In forge.config.js or similar
module.exports = {
// Unpack FFmpeg binaries from asar
asar: {
unpack: "**/node_modules/@ffmpeg-installer/**",
},
// Include required plugins
plugins: [
{
name: "@electron-forge/plugin-auto-unpack-natives",
config: {},
},
// Other plugins...
],
};
```
MIT