File: C:/Users/fred/.codex/.tmp/plugins/plugins/zoom/skills/general/use-cases/raw-recording.md
# Raw Recording
Access raw audio and video data from Zoom meetings and sessions for custom processing.
## Overview
Raw recording allows you to capture unprocessed audio and video frames directly from the SDK, enabling custom recording solutions, AI processing, and media pipelines.
## Platform Support
| Platform | Support Level | SDK |
|----------|---------------|-----|
| **Linux** | Primary | Meeting SDK, Video SDK |
| **Windows** | Primary | Meeting SDK, Video SDK |
| **macOS** | Primary | Meeting SDK, Video SDK |
| **iOS** | Light | Meeting SDK, Video SDK |
| **Android** | Light | Meeting SDK, Video SDK |
| **Web** | No native support | Use 3rd party browser recording; must call recording API for compliance notification |
## Desktop Platforms (Primary)
### Linux
```cpp
// Subscribe to raw audio
class AudioRawDataDelegate : public IZoomSDKAudioRawDataDelegate {
public:
void onMixedAudioRawDataReceived(AudioRawData *data) override {
// Format: 16-bit PCM, 16kHz or 32kHz, mono
std::ofstream file("meeting.pcm", std::ios::binary | std::ios::app);
file.write(data->GetBuffer(), data->GetBufferLen());
}
};
// Subscribe to raw video
class VideoRawDataDelegate : public IZoomSDKRendererDelegate {
public:
void onRawDataFrameReceived(YUVRawDataI420 *data) override {
// Format: I420 (YUV 4:2:0) - contiguous planar data
int width = data->GetStreamWidth();
int height = data->GetStreamHeight();
// Write raw YUV to file (can convert with ffmpeg later)
yuvFile.write(data->GetYBuffer(), width * height);
yuvFile.write(data->GetUBuffer(), (width/2) * (height/2));
yuvFile.write(data->GetVBuffer(), (width/2) * (height/2));
}
};
// Enable raw recording
auto recCtl = m_meetingService->GetMeetingRecordingController();
recCtl->StartRawRecording();
// Subscribe
GetAudioRawdataHelper()->subscribe(new AudioRawDataDelegate());
GetRawdataRendererHelper()->subscribe(userId, RAW_DATA_TYPE_VIDEO, new VideoRawDataDelegate());
```
**Playing/Converting Raw Files:**
```bash
# Play raw YUV video (adjust dimensions to match output)
ffplay -video_size 640x360 -pixel_format yuv420p -f rawvideo video.yuv
# Convert YUV to MP4
ffmpeg -video_size 640x360 -pixel_format yuv420p -f rawvideo -i video.yuv -c:v libx264 output.mp4
# Play raw PCM audio
ffplay -f s16le -ar 32000 -ac 1 audio.pcm
# Combine video + audio
ffmpeg -video_size 640x360 -pixel_format yuv420p -f rawvideo -i video.yuv \
-f s16le -ar 32000 -ac 1 -i audio.pcm \
-c:v libx264 -c:a aac -shortest output.mp4
```
### Windows
```cpp
// Same API as Linux
// Subscribe to raw data after joining meeting
auto* pRawDataHelper = GetAudioRawdataHelper();
pRawDataHelper->subscribe(new AudioRawDataDelegate());
auto* pVideoHelper = GetRawdataRendererHelper();
pVideoHelper->setRawDataResolution(ZoomSDKResolution_720P);
pVideoHelper->subscribe(userId, RAW_DATA_TYPE_VIDEO, new VideoRawDataDelegate());
```
### macOS
```swift
// Get raw data controller
let rawDataCtrl = ZoomSDK.shared().getRawDataController()
// Subscribe to audio
rawDataCtrl?.subscribeAudioRawData { audioData in
// Process PCM audio
let buffer = audioData.getBuffer()
let length = audioData.getBufferLen()
}
// Subscribe to video
rawDataCtrl?.subscribeVideoRawData(forUser: userId) { videoData in
// Process YUV frames
let width = videoData.getStreamWidth()
let height = videoData.getStreamHeight()
}
```
## Mobile Platforms (Light)
### iOS
Raw data access on iOS is more limited than desktop:
```swift
// Video raw data via ZoomVideoSDKVideoCanvas
let canvas = ZoomVideoSDKVideoCanvas()
canvas.delegate = self
// Implement delegate
func onRawDataFrameReceived(_ pixelBuffer: CVPixelBuffer) {
// Process video frame
// Note: Performance-intensive on mobile
}
```
**Limitations:**
- Higher battery consumption
- May impact app performance
- Not recommended for long recordings
### Android
```kotlin
// Video raw data via ZoomVideoSDKVideoCanvas
val canvas = ZoomVideoSDKVideoCanvas(context)
canvas.setDelegate(object : ZoomVideoSDKRawDataPipeDelegate {
override fun onRawDataFrameReceived(rawData: ZoomVideoSDKVideoRawData) {
// Process YUV frame
// Note: Performance-intensive on mobile
}
})
```
**Limitations:**
- Same as iOS - battery and performance concerns
- Consider cloud recording instead for mobile apps
## Web Platform
There is no native SDK support for raw recording on Web. For browser-based recording:
1. Use 3rd party browser recording solutions
2. **Important**: Call the recording API to trigger the "This meeting is being recorded" notification for compliance
## Common Use Cases
- Meeting bots for transcription
- Custom recording pipelines
- AI/ML processing (sentiment analysis, summarization)
- Media archival solutions
## Detailed Platform Guides
- **[Video SDK Linux Guide](../../video-sdk/linux/linux.md)** - Complete C++ implementation for headless bots
- **[Meeting SDK Linux Guide](../../meeting-sdk/linux/linux.md)** - Meeting SDK raw data capture
## Resources
- **Meeting SDK docs**: https://developers.zoom.us/docs/meeting-sdk/
- **Video SDK docs**: https://developers.zoom.us/docs/video-sdk/