Channel Webhooks
What are Webhooks?
Webhooks are powerful tools that allow real-time communication between LiveSwitch and your external systems. They act as customizable event listeners, automatically sending notifications to your specified web server whenever key actions occur within LiveSwitch. This enables you to seamlessly integrate LiveSwitch events into your own applications and workflows.
Here's how it works:
- You define a webhook by specifying a URL for your server endpoint.
- LiveSwitch monitors for specific events you're interested in.
- When an event occurs, LiveSwitch sends an HTTP POST request to your URL.
- The request body contains detailed event information in JSON format.
- Your server can then process this data and respond accordingly.
With webhooks, you can build responsive, event-driven applications that leverage LiveSwitch's capabilities while seamlessly integrating with your existing infrastructure.
Webhooks are most commonly used to notify customers when a session's recording is ready for download. After a session ends, the system processes the recording by mixing audio and video from all participants into a single file. Once the mixed recording is ready, the system sends a notification via the registered webhook, allowing customers to download the complete recording without manually checking for updates.
Channel Webhooks allow hooking into channel-level events.
Webhook Validation
All Application and Channel webhooks include the header X-ApplicationSignature
.
To verify the source of a webhook, the receiver creates a HMAC-SHA256 hash of the webhook's JSON body. That hash uses the LiveSwitch Application's shared secret as its secret key. The receiver then converts the HMAC-SHA256 hash to Base64. The Base64 value must match the value in the X-ApplicationSignature
header for the webhook to be validated.
Webhook Validation Example
The following example is from a Node application using Express and TypeScript. This method accepts a raw JSON body and the request signature. To find the associated shared secret, the Application ID is extracted from the request body. Once the application finds the shared secret, it uses the raw request body as input to generate a HMAC-SHA256 value. If this value matches the requestSignature
, then the webhook is validated.
Important
Store your shared secret in a secure location.
/*
* Core validation code looks up the application secret
* based on the applicationId found in the request body,
* then computes a SHA256 hash to ensure it matches
* the signature found in the x-applicationsignature
* header of the request.
*/
function validate(rawRequestBody:string, requestSignature:string):boolean {
// Parse the raw request in order to extract the applicationId
const webhook = JSON.parse(rawRequestBody);
const applicationId = getApplicationId(webhook);
// If we don't have a signature (X-ApplicationSignature wasn't present)
// AND there is no detected applicationId - then we've received a
// deployment webhook and we cannot verify with an application
// shared secret.
if (!requestSignature && !applicationId) {
console.log("Received unsigned deployment webhook");
return true;
}
// If there is an applicationId found, but no request signature
// this is not a valid webhook request.
if (applicationId && !requestSignature) {
console.error("Received an unsigned application webhook");
return false;
}
// If no applicationId was found, or we do not know the
// shared secret to use for the applicationId, then
// we cannot vaildate the request.
if (!applicationId || !applicationSecrets[applicationId]) {
console.error("Unable to determine application secret");
return false;
}
// For demo purposes we lookup the shared secret from the
// hardcoded applicationId map - for production use this
// should come from configuration. Shared secrets should
// never be stored in source code.
const secret = applicationSecrets[applicationId];
// Create a HMAC-SHA256 hash function with the application's
// shared secret
const hmac = crypto.createHmac("sha256", secret);
// Use the raw request body as input to the function.
// This must be the raw incoming request body. If it
// has been parsed as json in anyway prior you will
// likely not end up with the original value that was
// signed on the server.
hmac.update(rawRequestBody);
// Run the HMAC-SHA256 function and get the result
// as base64
const base64HmacSha256Hash = hmac.digest("base64");
// Trim all trailing `=` characters. All signatures
// will always be in base64 with the trailing padding
// `=` characters trimmed from the end of the string.
const base64HmacSha256HashTrimmed = trimEnd(base64HmacSha256Hash, "=");
// If the trimmed base64 hash does not exactly match
// the value from the X-ApplicationSignature header
// then this is an invald request.
if (base64HmacSha256HashTrimmed !== requestSignature) {
console.error("signature does not match computed hash");
return false;
}
// If the header matches our computed value, then
// we have succesfully validated the request.
return true;
}
Take note of the following when validating webhooks:
- The input of the HMAC-SHA256 function must be the raw JSON request body. If the request went through any parsers that might have changed the JSON, then the input value might be different than what the server used to generate the hash. For example, if the webhook payload included a field like
frameRate: 30.0
that parses toframeRate:30
, the generated HMAC-SHA256 hash will be affected. If you use Express with its built-in JSON middleware, then the request body might be parsed. In this case, use a custom parser to access the unparsed JSON body. - The value in
X-ApplicationSignature
is Base64, with all trailing=
padding characters stripped. After computing the Base64 hash, strip the trailing=
characters before comparing it with theX-ApplicationSignature
header.
Client
Client Joined
This event triggers when a client joins a channel.
Client Joined sample JSON object
{
"timestamp": 1562614545646,
"origin": "client",
"type": "channel.joined",
"channel": {
"applicationId": "my-app-id",
"id": 123456
},
"client": {
"applicationId": "my-app-id",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"deviceId": "9ffa994a648940b997ac79db343d0f7d",
"id": "my-app-id/4531e51218b24fb58d5dc62087a93439"
}
}
Client Left
This event triggers when a client leaves a channel.
Client Left sample JSON object
{
"timestamp": 1562614545646,
"origin": "client",
"type": "client.left",
"channel": {
"applicationId": "my-app-id",
"id": 123456,
"report": {
"messagesSent": 24,
"bytesSent": 288,
"messagesReceived":24,
"bytesReceived":288
}
},
"client": {
"applicationId": "my-app-id",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"deviceId": "9ffa994a648940b997ac79db343d0f7d",
"id": "my-app-id/4531e51218b24fb58d5dc62087a93439"
}
}
Client Message
This event triggers when a user sends a message to an entire channel or a specific user, device, or client in the channel.
Client Message sample JSON object
{
"timestamp":1627339446224,
"origin":"client",
"type":"channel.client.message",
"channel":{
"id":"f80c226f20a04b4d8e8aafe48f168e7a",
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da"
},
"client":{
"id":"d4c1d83ea4c64ec587703bc4867ea1d2",
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"userId":"e0117c2672c44f4c80de4326ec520d8b",
"deviceId":"56491ac67cba46e69441b8bd9b9917da"
},
"message":{
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"userId":"744ebe19a29c4b0798e65d128e7173af", // To a specific user
"deviceId":"61e0ad5d6bf64d269d2a062207374de3", // To a specific device
"clientId":"2c1c5eb0a3064d43a50397e71549f431", // To a specific client
"payload":"sample client message to channel client"
}
}
Connection
Connection Initializing
This event triggers when a connection is initializing, but the system hasn't made any connection attempts.
Connection Initializing sample JSON object
{
"timestamp": 1562614545646,
"type": "connection.initializing",
"origin" : "mediaserver",
"connection": {
"id": "78139048613349c0bf4ed7adb70fd996",
"applicationId": "my-app-id",
"channelId": 123456,
"deviceId": "d46bb0df25b641ce86e01c40487ad240",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"state": "initializing",
"tag": "sfu-upstream",
"type": "sfu",
"audioStreams": [...], /* Array of AudioStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"videoStreams": [...], /* Array of VideoStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
}
}
Connection Connecting
This event triggers when a connection is currently connecting.
Connection Connecting sample JSON object
{
"timestamp": 1562614545646,
"type": "connection.connecting",
"origin" : "mediaserver",
"connection": {
"id": "78139048613349c0bf4ed7adb70fd996",
"applicationId": "my-app-id",
"channelId": 123456,
"clientId": "69a754b194474867bb36860b19391514",
"deviceId": "d46bb0df25b641ce86e01c40487ad240",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"state": "connecting",
"tag": "sfu-upstream",
"type": "sfu",
"audioStreams": [...], /* Array of AudioStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"videoStreams": [...], /* Array of VideoStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"dataStream": {...}, /* The DataStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"transports": [...] /* Array of Transport Stats Objects (see "Connection Stats" help page, linked at the bottom) */
}
}
Connection Connected
This event triggers when a connection is currently connected.
Connection Connected sample JSON object
{
"timestamp": 1562614545646,
"type": "connection.connected",
"origin" : "mediaserver",
"connection": {
"id": "78139048613349c0bf4ed7adb70fd996",
"applicationId": "my-app-id",
"channelId": 123456,
"clientId": "69a754b194474867bb36860b19391514",
"deviceId": "d46bb0df25b641ce86e01c40487ad240",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"state": "connected",
"tag": "sfu-upstream",
"type": "sfu",
"audioStreams": [...], /* Array of AudioStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"videoStreams": [...], /* Array of VideoStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"dataStream": {...}, /* The DataStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"transports": [...] /* Array of Transport Stats Objects (see "Connection Stats" help page, linked at the bottom) */
}
}
Connection Updated
This event triggers when a connection's information has changed.
Connection Updated sample JSON object
{
"timestamp": 1562614545646,
"type": "connection.updated",
"origin" : "mediaserver",
"connection": {
"id": "78139048613349c0bf4ed7adb70fd996",
"applicationId": "my-app-id",
"channelId": 123456,
"clientId": "69a754b194474867bb36860b19391514",
"deviceId": "d46bb0df25b641ce86e01c40487ad240",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"state": "connected",
"tag": "sfu-upstream",
"type": "sfu",
"audioStreams": [...], /* Array of AudioStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"videoStreams": [...], /* Array of VideoStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"dataStream": {...}, /* The DataStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"transports": [...] /* Array of Transport Stats Objects (see "Connection Stats" help page, linked at the bottom) */
}
}
Connection Closing
This event triggers when a connection is closing and the system is cleaning up resources. For the empty properties below, see Connection Connected.
Connection Closing sample JSON object
{
"timestamp": 1562614545646,
"type": "connection.closing",
"origin" : "mediaserver",
"connection": {
"id": "78139048613349c0bf4ed7adb70fd996",
"applicationId": "my-app-id",
"channelId": 123456,
"clientId": "69a754b194474867bb36860b19391514",
"deviceId": "d46bb0df25b641ce86e01c40487ad240",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"state": "closing",
"tag": "sfu-upstream",
"type": "sfu",
"audioStreams": [...], /* Array of AudioStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"videoStreams": [...], /* Array of VideoStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"dataStream": {...}, /* The DataStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"transports": [...] /* Array of Transport Stats Objects (see "Connection Stats" help page, linked at the bottom) */
}
}
Connection Closed
This event triggers when a connection has completely closed and the system has cleaned up resources.
Connection Closed sample JSON object
{
"timestamp": 1562614545646,
"type": "connection.closed",
"origin" : "mediaserver",
"connection": {
"id": "78139048613349c0bf4ed7adb70fd996",
"applicationId": "my-app-id",
"channelId": 123456,
"clientId": "69a754b194474867bb36860b19391514",
"deviceId": "d46bb0df25b641ce86e01c40487ad240",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"state": "closed",
"tag": "sfu-upstream",
"type": "sfu",
"audioStreams": [...], /* Array of AudioStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"videoStreams": [...], /* Array of VideoStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"dataStream": {...}, /* The DataStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"transports": [...] /* Array of Transport Stats Objects (see "Connection Stats" help page, linked at the bottom) */
}
}
Connection Failing
This event triggers when a connection encounters an error and the system is cleaning up resources.
Connection Failing sample JSON object
{
"timestamp": 1562614545646,
"type": "connection.failing",
"origin" : "mediaserver",
"connection": {
"id": "78139048613349c0bf4ed7adb70fd996",
"applicationId": "my-app-id",
"channelId": 123456,
"clientId": "69a754b194474867bb36860b19391514",
"deviceId": "d46bb0df25b641ce86e01c40487ad240",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"state": "failing",
"tag": "sfu-upstream",
"type": "sfu",
"error": {
"code": "ConnectionNotEstablished",
"message": "Could not establish connectivity with remote peer. Shutting down connection.",
},
"audioStreams": [...], /* Array of AudioStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"videoStreams": [...], /* Array of VideoStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"dataStream": {...}, /* The DataStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"transports": [...] /* Array of Transport Stats Objects (see "Connection Stats" help page, linked at the bottom) */
}
}
Connection Failed
This event triggers when a connection has encountered an error and has cleaned up resources.
Connection Failed sample JSON object
{
"timestamp": 1562614545646,
"type": "connection.failed",
"origin" : "client",
"connection": {
"id": "78139048613349c0bf4ed7adb70fd996",
"applicationId": "my-app-id",
"channelId": 123456,
"clientId": "69a754b194474867bb36860b19391514",
"deviceId": "d46bb0df25b641ce86e01c40487ad240",
"userId": "d8c5a6527deb4cc6bf4afb908e682e5d",
"state": "failed",
"tag": "sfu-upstream",
"type": "sfu",
"error": {
"code": "ConnectionNotEstablished",
"message": "Could not establish connectivity with remote peer. Shutting down connection.",
},
"audioStreams": [...], /* Array of AudioStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"videoStreams": [...], /* Array of VideoStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"dataStream": {...}, /* The DataStream Stats Objects (see "Connection Stats" help page, linked at the bottom) */
"transports": [...] /* Array of Transport Stats Objects (see "Connection Stats" help page, linked at the bottom) */
}
}
Connection Stats
This event triggers when a connection's status has been captured.
Note
LiveSwitch omits the full candidate stats unless the value changes after the first callback.
Example
The first callback includes all candidate information as follows:
"localCandidates": [
{
"ipAddress": "192.168.1.41",
"port": 61538,
"relatedPort": -1,
"protocol": "udp",
"relayProtocol": "udp",
"type": "host",
"priority": 2122294527,
"id": "a7621d44e28c4fdfb775a976d640381b"
}
],
"remoteCandidates": [
{
"ipAddress": "192.168.0.124",
"port": 59278,
"relatedPort": 0,
"protocol": "udp",
"relayProtocol": "unknown",
"type": "host",
"priority": 2122294527,
"id": "a74c04547e934836a95d5b8796db43a4"
}
],
Subsequent callbacks only include candidate ID as follows:
"localCandidates": [
{
"id": "521bc406870d41b793ec8fd2e8a63242"
},
{
"id": "a1433560435740e194fabaff6a64bbbb"
},
{
"id": "38fe09ad72c84b468ce05a3d584cbf20"
},
{
"id": "875bad7110ea481fae6d37302ded36c0"
},
{
"id": "eff494e4c7d44a479ed79a72201bea5a"
},
{
"id": "94aa723e9e4240559a912165210b8909"
}
],
"remoteCandidates": [
{
"id": "73e78541cdbc4eb5bacad40a7e4c4aae"
},
{
"id": "8c20ede3540c47c6b62bb21f916509c3"
},
{
"id": "c4c3ee9d96694d25b07ec7b6a2fff58e"
},
{
"id": "dd4e620a5a424703b781a0243eb73262"
}
]
Sample Connection Stats JSON Object
{
"timestamp": 1562614545646,
"origin": "mediaserver",
"type": "connection.stats",
"connection": {
"id":"d5ba712580344a85b4d2d6494f228d7e",
"applicationId": "my-app-id",
"channelId": "123123",
"userId": "80397276958e4450b49272fffccb26a7",
"deviceId": "9f849f5b394247d29cb59eac7ca278a4",
"clientId": "c9a32bd00a724dfe9cbf3fe127e2d486",
"externalId": "7aab3793a7594e738b39750d6fb54297",
"state": "connected",
"tag": "mcu",
"type": "mcu",
"audioStreams": [
{
"localBandwidth": 0,
"remoteBandwidth": 0,
"senders": [
{
"source": {
"id": "9fa7ad9ebd4f4b648c28ccb443860584"
},
"report": {
"bytesSent": 67056,
"packetsSent": 1016
},
"track": {
"report": {},
"id": "9fa7ad9ebd4f4b648c28ccb443860584"
},
"id": "8a1f204e5e7e491b9448bdc77f978383"
}
],
"receivers": [
{
"sink": {
"id": "7292d653c2634c5cab80f354af2efd7a"
},
"report": {
"bytesReceived": 88620,
"packetsReceived": 1037
},
"track": {
"report": {},
"id": "db197c97655c4a478190d0fcc8139bc5"
},
"id": "2be604fb6fb949b095690e2dd5deb9b4"
}
],
"controlTransportId": "db846c366f904a0bab3f7f762bebc5e6",
"transportId": "db846c366f904a0bab3f7f762bebc5e6"
}
], /* Array of AudioStream Stats Objects */
"videoStreams": [
{
"localBandwidth": 0,
"remoteBandwidth": 0,
"maxFrameWidth": 1280,
"maxFrameHeight": 720,
"senders": [
{
"source": {
"id": "2631dca8d0c14edd8e3c28a83ee99346"
},
"report": {
"bytesSent": 2811955,
"packetsSent": 2920,
"roundTripTime": 55
},
"track": {
"report": {},
"id": "2631dca8d0c14edd8e3c28a83ee99346"
},
"id": "188db4c59eee48e18793c53a83ffc074"
}
],
"receivers": [
{
"sink": {
"id": "32f40b95e758476e8bf1f526c8dd8895"
},
"report": {
"bytesReceived": 1907613,
"packetsReceived": 2085,
"jitter": 9,
"nackCount": 2
},
"track": {
"report": {
"framesReceived": 604,
"framesDecoded": 594
},
"id": "6ea43a346cfe4ccba63426df3d7599bc"
},
"id": "8964fe053e3b456ea3f8c92d79295368"
}
],
"controlTransportId": "c2550133dea54a6dab6777ee3c2d9a65",
"transportId": "c2550133dea54a6dab6777ee3c2d9a65"
}
], /* Array of VideoStream Stats Objects */
"dataStream":
{
"id":"d520cc47d3a9404aae0b5afaf1928c34",
"channels":[
{
"label":"data",
"ordered":true,
"subprotocol":"",
"report":{
"messagesReceived":24,
"bytesReceived":288
},
"id":"d520cc47d3a9404aae0b5afaf1928c34"
}
],
"report":{
"messagesReceived":24,
"bytesReceived":288
},
"transportId":"68b11a15998d4357970abdd6c274e8b2"
}, /* The DataStream Stats Objects */
"transports": [
{
"localCertificate":{},
"remoteCertificate":{},
"localCandidates":[
{
"id":"e3afc1ebbf2a4615817938479738844b"
}
],
"remoteCandidates":[
{
"id":"07f53e71185148e1b721924d6e4d90bf"
}
],
"candidatePairs":[
{
"localCandidateId":"e3afc1ebbf2a4615817938479738844b",
"remoteCandidateId":"a450e04dfa554a8ab36def18233170a9",
"report":{
"bytesSent":70558,
"requestsSent":20,
"responsesReceived":20,
"totalRoundTripTime":1099,
"currentRoundTripTime":47
},
"id":"f938a37abcba41ec9f829a92c75ef83b"
}
],
"activeCandidatePairId":"f938a37abcba41ec9f829a92c75ef83b",
"report":{
"bytesSent":70558,
"bytesReceived":102476
},
"id":"db846c366f904a0bab3f7f762bebc5e6"
}
] /* Array of Transport Stats Objects */
}
Channel
Channel Activated
This event triggers when the first user joins the channel.
Channel Activated sample JSON object
{
"timestamp": 1621620904681,
"origin": "gateway",
"type": "channel.activated",
"channel": {
"applicationId": "cd2db817-0a8d-4996-b5bf-f06f409bea11",
"id": "681773"
}
}
Channel Deactivated
This event triggers when the last user leaves the channel.
Channel Deactivated sample JSON object
{
"timestamp": 1621620929102,
"origin": "gateway",
"type": "channel.deactivated",
"channel": {
"applicationId": "cd2db817-0a8d-4996-b5bf-f06f409bea11",
"id": "681773"
}
}
Recording
Connection Audio Ready
This event triggers when a connection's original audio-only recording has been successfully moved to S3 object storage.
Connection Audio Ready sample JSON object
{
"timestamp":1627583228650,
"origin":"recordingmover",
"type":"connection.recording.audio.ready",
"channelRecording":{
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"startTimestamp":"2021-07-29T18:26:54.34619Z",
"stopTimestamp":"2021-07-29T18:26:59.85798Z",
"processed":true,
"muxPending":true,
"muxEnabled":true,
"moveEnabled":true,
"deleteFiles":true,
"recordingPath":"C:\\Users\\Username\\AppData\\Local\\Temp\\",
"id":"9fd732f5-f0a5-4e62-caf7-e1c9c0a55165",
"createdOn":"2021-07-29T11:27:04.240603-07:00",
"modifiedOn":"2021-07-29T11:27:08.236025-07:00",
"modifiedBy":"00000000-0000-0000-0000-000000000000"
},
"connectionRecording":{
"audioId":"b41bde4d-2624-cd09-5493-a9c3934f5b10",
"videoId":"3cbf315a-02a0-b76f-ad6f-7d4858a338da",
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"userId":"88b3dfeef73d4907928b835995020ea0",
"deviceId":"0313bdf8aeb3429cbbc17f9fbba2593e",
"clientId":"f3efdcf469e34bd9aa056fb4673e4caa",
"connectionId":"f073c3dd9b1847629d8084f1f6d9dcf4",
"connectionType":"sfu",
"startTimestamp":"2021-07-29T18:26:54.47798Z",
"stopTimestamp":"2021-07-29T18:26:59.85798Z",
"hasAudio":true,
"hasVideo":true,
"audioFileName":"13516f4286008d8d9d15efa8ae025cb4.mka",
"videoFileName":"13516f4286008d8d9d15efa8ae025cb4.mkv",
"audioFileSize":24187,
"videoFileSize":21955,
"audioReady":true,
"audioUrl":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/13516f4286008d8d9d15efa8ae025cb4.mka?AWSAccessKeyId=someaccesskey&Expires=1627583529&Signature=%2FQ7sKI8FKpRXn5a%2Bk9zc7mX2zxk%3D",
"audioFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\f073c3dd9b1847629d8084f1f6d9dcf4-0.mka",
"videoFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\f073c3dd9b1847629d8084f1f6d9dcf4-0.mkv",
"audioObjectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/13516f4286008d8d9d15efa8ae025cb4.mka",
"audioMuted":false,
"videoMuted":false,
"audioDisabled":false,
"videoDisabled":false,
"audioFirstFrameTimestamp":"2021-07-29T18:26:54.47798Z",
"videoFirstFrameTimestamp":"2021-07-29T18:26:54.53419Z",
"audioLastFrameTimestamp":"2021-07-29T18:26:59.83798Z",
"videoLastFrameTimestamp":"2021-07-29T18:26:59.71219Z",
"videoDelay":-0.1878241888671875,
"processed":true,
"audioMovePending":false,
"videoMovePending":true,
"audioMoveSeconds":1,
"channelRecordingId":"9fd732f5-f0a5-4e62-caf7-e1c9c0a55165",
"updates":[
],
"id":"13516f42-8600-8d8d-9d15-efa8ae025cb4",
"createdOn":"2021-07-29T11:27:03.823902-07:00",
"modifiedOn":"2021-07-29T18:27:08.5317451+00:00",
"modifiedBy":"00000000-0000-0000-0000-000000000000"
}
}
Connection Video Ready
This event triggers when a connection's original video-only recording has been successfully moved to S3 object storage.
Connection Video Ready sample JSON object
{
"timestamp":1627583228772,
"origin":"recordingmover",
"type":"connection.recording.video.ready",
"channelRecording":{
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"startTimestamp":"2021-07-29T18:26:54.34619Z",
"stopTimestamp":"2021-07-29T18:26:59.85798Z",
"processed":true,
"muxPending":true,
"muxEnabled":true,
"moveEnabled":true,
"deleteFiles":true,
"recordingPath":"C:\\Users\\Username\\AppData\\Local\\Temp\\",
"id":"9fd732f5-f0a5-4e62-caf7-e1c9c0a55165",
"createdOn":"2021-07-29T11:27:04.240603-07:00",
"modifiedOn":"2021-07-29T11:27:08.236025-07:00",
"modifiedBy":"00000000-0000-0000-0000-000000000000"
},
"connectionRecording":{
"audioId":"b41bde4d-2624-cd09-5493-a9c3934f5b10",
"videoId":"3cbf315a-02a0-b76f-ad6f-7d4858a338da",
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"userId":"88b3dfeef73d4907928b835995020ea0",
"deviceId":"0313bdf8aeb3429cbbc17f9fbba2593e",
"clientId":"f3efdcf469e34bd9aa056fb4673e4caa",
"connectionId":"f073c3dd9b1847629d8084f1f6d9dcf4",
"connectionType":"sfu",
"startTimestamp":"2021-07-29T18:26:54.47798Z",
"stopTimestamp":"2021-07-29T18:26:59.85798Z",
"hasAudio":true,
"hasVideo":true,
"audioFileName":"13516f4286008d8d9d15efa8ae025cb4.mka",
"videoFileName":"13516f4286008d8d9d15efa8ae025cb4.mkv",
"audioFileSize":24187,
"videoFileSize":21955,
"audioReady":true,
"videoReady":true,
"audioUrl":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/13516f4286008d8d9d15efa8ae025cb4.mka?AWSAccessKeyId=someaccesskey&Expires=1627583529&Signature=%2FQ7sKI8FKpRXn5a%2Bk9zc7mX2zxk%3D",
"videoUrl":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/13516f4286008d8d9d15efa8ae025cb4.mkv?AWSAccessKeyId=someaccesskey&Expires=1627583529&Signature=DLI2USYPu0e8NSXttVGLQ61xaV0%3D",
"audioFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\f073c3dd9b1847629d8084f1f6d9dcf4-0.mka",
"videoFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\f073c3dd9b1847629d8084f1f6d9dcf4-0.mkv",
"audioObjectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/13516f4286008d8d9d15efa8ae025cb4.mka",
"videoObjectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/13516f4286008d8d9d15efa8ae025cb4.mkv",
"audioMuted":false,
"videoMuted":false,
"audioDisabled":false,
"videoDisabled":false,
"audioFirstFrameTimestamp":"2021-07-29T18:26:54.47798Z",
"videoFirstFrameTimestamp":"2021-07-29T18:26:54.53419Z",
"audioLastFrameTimestamp":"2021-07-29T18:26:59.83798Z",
"videoLastFrameTimestamp":"2021-07-29T18:26:59.71219Z",
"videoDelay":-0.1878241888671875,
"processed":true,
"audioMovePending":false,
"videoMovePending":false,
"audioMoveSeconds":1,
"videoMoveSeconds":1,
"channelRecordingId":"9fd732f5-f0a5-4e62-caf7-e1c9c0a55165",
"updates":[
],
"id":"13516f42-8600-8d8d-9d15-efa8ae025cb4",
"createdOn":"2021-07-29T11:27:03.823902-07:00",
"modifiedOn":"2021-07-29T18:27:08.7618725+00:00",
"modifiedBy":"00000000-0000-0000-0000-000000000000"
}
}
Connection Recordings Ready
This event triggers when all the connections in an active channel have terminated and the unmuxed audio and video recordings of those connections have been successfully moved to S3 object storage. These unmuxed recordings are now ready to download.
Connection Recording Ready sample JSON object
{
"timestamp":1646013126945,
"type":"connection.recordings.ready",
"origin":"recordingmover",
"channelRecording":{
"applicationId":"my-app-id",
"channelId":"123456",
"startTimestamp":"2022-02-28T01:51:18.830406Z",
"stopTimestamp":"2022-02-28T01:52:02.377Z",
},
"connectionRecordings":[
{
"audioId":"4afec761-afbb-5a7a-5b8c-383ece2f6407",
"videoId":"e66bab8c-a611-c07f-95fa-83d4527fdc50",
"applicationId":"my-app-id",
"channelId":"123456",
"userId":"6bed9994c1a246a2a88734c80e01f431",
"deviceId":"00bedbe9c3e7468e908800663f09acea",
"clientId":"74be1bf278af49a88ee8a8c394ffe776",
"connectionId":"6a740f3eb8794a5e97965d50fe2f530a",
"connectionType":"sfu",
"startTimestamp":"2022-02-28T01:51:18.830406Z",
"stopTimestamp":"2022-02-28T01:52:02.377Z",
"hasAudio":true,
"hasVideo":true,
"audioFileSize":367385,
"videoFileSize":4216377,
"connectionTag":"sfu-upstream",
"audioMuted":false,
"videoMuted":false,
"audioDisabled":false,
"videoDisabled":false,
"videoContent":"camera",
"audioFirstFrameTimestamp":"2022-02-28T01:51:18.830406Z",
"videoFirstFrameTimestamp":"2022-02-28T01:51:19.127785Z",
"audioLastFrameTimestamp":"2022-02-28T01:52:01.72Z",
"videoLastFrameTimestamp":"2022-02-28T01:52:02.285Z",
"videoDelay":0.091534,
"channelRecordingId":"5e4f04cd-4257-907e-3f6f-43fc54318dce",
"updates":[ ],
}
]
}
Channel Audio Ready
This event triggers when a channel's original audio-only recording has been successfully moved to S3 object storage.
Channel Audio Ready sample JSON object
{
"timestamp":1627583231022,
"origin":"recordingmover",
"type":"channel.recording.audio.ready",
"channelRecording":{
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"startTimestamp":"2021-07-29T18:26:54.34619Z",
"stopTimestamp":"2021-07-29T18:26:59.85798Z",
"hasAudio":true,
"hasVideo":true,
"fileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"audioFileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"videoFileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"fileSize":83573,
"audioFileSize":63696,
"videoFileSize":20227,
"ready":true,
"audioReady":true,
"url":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv?AWSAccessKeyId=someaccesskey&Expires=1627583531&Signature=Llrd6H7IM%2Bd7yG4ZVJAQSzbXhig%3D",
"audioUrl":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka?AWSAccessKeyId=someaccesskey&Expires=1627583531&Signature=%2BCWtWkPWqVaOInDhCoHvJgveXpo%3D",
"audioFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"videoFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"objectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"audioObjectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"processed":true,
"muxPending":false,
"movePending":false,
"audioMovePending":false,
"videoMovePending":true,
"muxEnabled":true,
"moveEnabled":true,
"deleteFiles":true,
"recordingPath":"C:\\Users\\Username\\AppData\\Local\\Temp\\",
"muxArgs":[
"--disable-json-integrity-check",
"--input-file-paths",
"C:\\Users\\Username\\AppData\\Local\\Temp\\5fc1e747-7a61-4e15-b255-3d5747ad0ce0\\log.json",
"--output-path",
"C:\\Users\\Username\\AppData\\Local\\Temp\\mux",
"--output-file-name",
"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165",
"--temp-path",
"C:\\Users\\Username\\AppData\\Local\\Temp\\5fc1e747-7a61-4e15-b255-3d5747ad0ce0",
"--strategy",
"Flat",
"--layout",
"HGrid",
"--audio-container",
"mka",
"--video-container",
"mkv",
"--audio-codec",
"libopus",
"--video-codec",
"libvpx -crf 63 -b:v 512k -auto-alt-ref 0",
"--width",
"320",
"--height",
"240",
"--frame-rate",
"30",
"--background-color",
"black",
"--dynamic"
],
"muxSeconds":3,
"moveSeconds":1,
"audioMoveSeconds":1,
"id":"9fd732f5-f0a5-4e62-caf7-e1c9c0a55165",
"createdOn":"2021-07-29T11:27:04.240603-07:00",
"modifiedOn":"2021-07-29T18:27:11.0180947+00:00",
"modifiedBy":"00000000-0000-0000-0000-000000000000"
}
}
Channel Video Ready
This event triggers when a channel's original video-only recording has been successfully moved to S3 object storage.
Channel Video Ready sample JSON object
{
"timestamp":1627583231055,
"origin":"recordingmover",
"type":"channel.recording.video.ready",
"channelRecording":{
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"startTimestamp":"2021-07-29T18:26:54.34619Z",
"stopTimestamp":"2021-07-29T18:26:59.85798Z",
"hasAudio":true,
"hasVideo":true,
"fileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"audioFileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"videoFileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"fileSize":83573,
"audioFileSize":63696,
"videoFileSize":20227,
"ready":true,
"audioReady":true,
"videoReady":true,
"url":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv?AWSAccessKeyId=someaccesskey&Expires=1627583531&Signature=Llrd6H7IM%2Bd7yG4ZVJAQSzbXhig%3D",
"audioUrl":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka?AWSAccessKeyId=someaccesskey&Expires=1627583531&Signature=%2BCWtWkPWqVaOInDhCoHvJgveXpo%3D",
"videoUrl":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv?AWSAccessKeyId=someaccesskey&Expires=1627583531&Signature=xzZ%2FgMnUS43ba1w19aB9BXxJDbE%3D",
"videoFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"objectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"audioObjectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"videoObjectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"processed":true,
"muxPending":false,
"movePending":false,
"audioMovePending":false,
"videoMovePending":false,
"muxEnabled":true,
"moveEnabled":true,
"deleteFiles":true,
"recordingPath":"C:\\Users\\Username\\AppData\\Local\\Temp\\",
"muxArgs":[
"--disable-json-integrity-check",
"--input-file-paths",
"C:\\Users\\Username\\AppData\\Local\\Temp\\5fc1e747-7a61-4e15-b255-3d5747ad0ce0\\log.json",
"--output-path",
"C:\\Users\\Username\\AppData\\Local\\Temp\\mux",
"--output-file-name",
"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165",
"--temp-path",
"C:\\Users\\Username\\AppData\\Local\\Temp\\5fc1e747-7a61-4e15-b255-3d5747ad0ce0",
"--strategy",
"Flat",
"--layout",
"HGrid",
"--audio-container",
"mka",
"--video-container",
"mkv",
"--audio-codec",
"libopus",
"--video-codec",
"libvpx -crf 63 -b:v 512k -auto-alt-ref 0",
"--width",
"320",
"--height",
"240",
"--frame-rate",
"30",
"--background-color",
"black",
"--dynamic"
],
"muxSeconds":3,
"moveSeconds":1,
"audioMoveSeconds":1,
"videoMoveSeconds":1,
"id":"9fd732f5-f0a5-4e62-caf7-e1c9c0a55165",
"createdOn":"2021-07-29T11:27:04.240603-07:00",
"modifiedOn":"2021-07-29T18:27:11.0514142+00:00",
"modifiedBy":"00000000-0000-0000-0000-000000000000"
}
}
Channel Ready
This event triggers when a channel's recording has been successfully muxed and moved to S3 object storage.
Channel Ready sample JSON object
{
"timestamp":1627583230977,
"origin":"recordingmover",
"type":"channel.recording.ready",
"channelRecording":{
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"startTimestamp":"2021-07-29T18:26:54.34619Z",
"stopTimestamp":"2021-07-29T18:26:59.85798Z",
"hasAudio":true,
"hasVideo":true,
"fileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"audioFileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"videoFileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"fileSize":83573,
"audioFileSize":63696,
"videoFileSize":20227,
"ready":true,
"url":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv?AWSAccessKeyId=someaccesskey&Expires=1627583531&Signature=Llrd6H7IM%2Bd7yG4ZVJAQSzbXhig%3D",
"filePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"audioFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"videoFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"objectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"processed":true,
"muxPending":false,
"movePending":false,
"audioMovePending":true,
"videoMovePending":true,
"muxEnabled":true,
"moveEnabled":true,
"deleteFiles":true,
"recordingPath":"C:\\Users\\Username\\AppData\\Local\\Temp\\",
"muxArgs":[
"--disable-json-integrity-check",
"--input-file-paths",
"C:\\Users\\Username\\AppData\\Local\\Temp\\5fc1e747-7a61-4e15-b255-3d5747ad0ce0\\log.json",
"--output-path",
"C:\\Users\\Username\\AppData\\Local\\Temp\\mux",
"--output-file-name",
"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165",
"--temp-path",
"C:\\Users\\Username\\AppData\\Local\\Temp\\5fc1e747-7a61-4e15-b255-3d5747ad0ce0",
"--strategy",
"Flat",
"--layout",
"HGrid",
"--audio-container",
"mka",
"--video-container",
"mkv",
"--audio-codec",
"libopus",
"--video-codec",
"libvpx -crf 63 -b:v 512k -auto-alt-ref 0",
"--width",
"320",
"--height",
"240",
"--frame-rate",
"30",
"--background-color",
"black",
"--dynamic"
],
"muxSeconds":3,
"moveSeconds":1,
"id":"9fd732f5-f0a5-4e62-caf7-e1c9c0a55165",
"createdOn":"2021-07-29T11:27:04.240603-07:00",
"modifiedOn":"2021-07-29T18:27:10.9718166+00:00",
"modifiedBy":"00000000-0000-0000-0000-000000000000"
}
}
Channel Expired
This event triggers when a channel recording has expired and is being removed.
Channel Expired sample JSON object
{
"timestamp":1627583230977,
"origin":"recordingmonitor",
"type":"channel.recording.expired",
"channelRecording":{
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"startTimestamp":"2021-07-29T18:26:54.34619Z",
"stopTimestamp":"2021-07-29T18:26:59.85798Z",
"hasAudio":true,
"hasVideo":true,
"fileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"audioFileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"videoFileName":"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"fileSize":83573,
"audioFileSize":63696,
"videoFileSize":20227,
"ready":true,
"url":"https://10.211.55.2:55200/recordings/2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv?AWSAccessKeyId=someaccesskey&Expires=1627583531&Signature=Llrd6H7IM%2Bd7yG4ZVJAQSzbXhig%3D",
"filePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"audioFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_audio.mka",
"videoFilePath":"C:\\Users\\Username\\AppData\\Local\\Temp\\mux\\2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165_video.mkv",
"objectKey":"2250d2f7fd4a4750ac90df8d5a9f25da/f80c226f20a04b4d8e8aafe48f168e7a/2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165.mkv",
"processed":true,
"muxPending":false,
"movePending":false,
"audioMovePending":true,
"videoMovePending":true,
"muxEnabled":true,
"moveEnabled":true,
"deleteFiles":true,
"recordingPath":"C:\\Users\\Username\\AppData\\Local\\Temp\\",
"muxArgs":[
"--disable-json-integrity-check",
"--input-file-paths",
"C:\\Users\\Username\\AppData\\Local\\Temp\\5fc1e747-7a61-4e15-b255-3d5747ad0ce0\\log.json",
"--output-path",
"C:\\Users\\Username\\AppData\\Local\\Temp\\mux",
"--output-file-name",
"2021-07-29_18-26-54_to_2021-07-29_18-26-59_9fd732f5f0a54e62caf7e1c9c0a55165",
"--temp-path",
"C:\\Users\\Username\\AppData\\Local\\Temp\\5fc1e747-7a61-4e15-b255-3d5747ad0ce0",
"--strategy",
"Flat",
"--layout",
"HGrid",
"--audio-container",
"mka",
"--video-container",
"mkv",
"--audio-codec",
"libopus",
"--video-codec",
"libvpx -crf 63 -b:v 512k -auto-alt-ref 0",
"--width",
"320",
"--height",
"240",
"--frame-rate",
"30",
"--background-color",
"black",
"--dynamic"
],
"muxSeconds":3,
"moveSeconds":1,
"id":"9fd732f5-f0a5-4e62-caf7-e1c9c0a55165",
"createdOn":"2021-07-29T11:27:04.240603-07:00",
"modifiedOn":"2021-07-29T18:27:10.9718166+00:00",
"modifiedBy":"00000000-0000-0000-0000-000000000000"
}
}
Server
Server Message
This event triggers when the server sends a message to an entire channel or a specific user, device, or client in the channel.
Server Message sample JSON object
{
"timestamp":1627339446100,
"origin":"gateway",
"type":"channel.server.message",
"channel":{
"id":"f80c226f20a04b4d8e8aafe48f168e7a",
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da"
},
"client":{
"id":"00000000000000000000000000000000",
"applicationId":"2250d2f7fd4a4750ac90df8d5a9f25da",
"userId":"server-user-id",
"userAlias":"server-user-alias",
"deviceId":"server-device-id",
"deviceAlias":"server-device-alias",
"tag":"server-client-tag",
"roles":[
"server-client-role"
]
},
"message":{
"channelId":"f80c226f20a04b4d8e8aafe48f168e7a",
"userId":"e0117c2672c44f4c80de4326ec520d8b", // To a specific user
"deviceId":"56491ac67cba46e69441b8bd9b9917da", // To a specific device
"clientId":"d4c1d83ea4c64ec587703bc4867ea1d2", // To a specific client
"payload":"sample server message to channel client"
}
}
RTMP
RTMP Started
This event triggers when an RTMP stream starts.
RTMP Started sample JSON object
{
"timestamp": 1651018042432,
"origin": "mediaserver",
"type": "channel.rtmp.started",
"channel": {
"applicationId": "my-app-id",
"id": "channelId"
}
}
RTMP Stopped
This event triggers when an RTMP stream stops.
RTMP Stopped sample JSON object
{
"timestamp": 1651018057387,
"origin": "mediaserver",
"type": "channel.rtmp.stopped",
"channel": {
"applicationId": "my-app-id",
"id": "channelId"
}
}