Transcodings
The transcodings resource turns finished recordings and HLS streams into downloadable files. Start a job, then track it with list / get or stop it with cancel.
Merge recordings
Composite-merges individual recordings into a single MP4.
- Node.js
- Go
- Rust
await client.transcodings.merge({ recordingIds: ["rec_1", "rec_2"] });
client.Transcodings.Merge(ctx, videosdk.MergeTranscodingParams{RecordingIDs: []string{"rec_1", "rec_2"}})
client.transcodings().merge(MergeTranscodingParams {
recording_ids: vec!["rec_1".into(), "rec_2".into()],
..Default::default()
}).await?;
Options: recordingIds (required), webhookUrl, watermark.
HLS to MP4
Converts a finished HLS stream to MP4 in your storage. One of roomId / sessionId / hlsId is required.
- Node.js
- Go
- Rust
await client.transcodings.hlsToMp4({ hlsId, storage: { type: "s3", bucket: "my-recordings" } });
client.Transcodings.HLSToMP4(ctx, videosdk.HLSToMP4Params{
HLSID: hlsID,
Storage: &videosdk.TranscodingStorage{Type: "s3", Bucket: "my-recordings"},
})
client.transcodings().hls_to_mp4(HlsToMp4Params {
hls_id: Some(hls_id.clone()),
storage: Some(TranscodingStorage {
kind: "s3".into(),
bucket: Some("my-recordings".into()),
..Default::default()
}),
..Default::default()
}).await?;
Merge meeting recordings
Concatenates room recordings chronologically. Each reference is an id, optionally with a presigned URL.
- Node.js
- Go
- Rust
await client.transcodings.meetingRecordingMerge({
recordingIds: ["rec_a", { id: "rec_b", presignedUrl }],
});
client.Transcodings.MeetingRecordingMerge(ctx, videosdk.MeetingRecordingMergeParams{
RecordingIDs: []videosdk.MeetingRecordingRef{{ID: "rec_a"}, {ID: "rec_b", PresignedURL: presignedURL}},
})
client.transcodings().meeting_recording_merge(MeetingRecordingMergeParams {
recording_ids: vec![
"rec_a".into(),
MeetingRecordingRef { id: "rec_b".into(), presigned_url: Some(presigned_url) },
],
..Default::default()
}).await?;
Options: recordingIds (required), webhookUrl, presignedOutputUrl.
Track and cancel
- Node.js
- Go
- Rust
await client.transcodings.list({ status: "processing" });
await client.transcodings.get(id);
await client.transcodings.cancel(id);
client.Transcodings.List(ctx, videosdk.ListTranscodingsParams{Status: videosdk.TranscodingProcessing})
client.Transcodings.Get(ctx, id)
client.Transcodings.Cancel(ctx, id)
client.transcodings().list(ListTranscodingsParams {
status: Some(TranscodingStatus::PROCESSING),
..Default::default()
}).await?;
client.transcodings().get(id).await?;
client.transcodings().cancel(id).await?;
list filters: roomId, sessionId, hlsId, status (pending, processing, completed, failed, cancelled).
The transcoding object
Returned by the start methods (transcodings.merge, hlsToMp4, meetingRecordingMerge) and by transcodings.get, list, and cancel.
| Field | Type | Description |
|---|---|---|
id | string | Transcoding job id. |
task | string | Job kind (composite-merge, hls-to-mp4, meeting-recording-merge). |
status | string | Job status (pending, processing, completed, failed, cancelled). |
roomId | string | Room the job is for. |
sessionId | string | Session the job is for. |
hlsId | string | Source HLS id (for hls-to-mp4). |
recordingIds | string[] | Source recording ids. |
file | object | Output file (fileUrl, filePath, size, type). |
startedAt | string | Start time (ISO-8601). |
stoppedAt | string | Stop time, null while running. |
Got a Question? Ask us on discord

