openvidu-java-client and openvidu-node-client: manage frameRate in recording metadata

pull/621/head
pabloFuente 2021-04-05 20:50:29 +02:00
parent cdb518ea97
commit 4cc1bacc20
7 changed files with 44 additions and 34 deletions

View File

@ -209,6 +209,7 @@ public class OpenVidu {
|| (Recording.OutputMode.COMPOSED_QUICK_START.equals(properties.outputMode()))) || (Recording.OutputMode.COMPOSED_QUICK_START.equals(properties.outputMode())))
&& properties.hasVideo()) { && properties.hasVideo()) {
json.addProperty("resolution", properties.resolution()); json.addProperty("resolution", properties.resolution());
json.addProperty("frameRate", properties.frameRate());
json.addProperty("recordingLayout", json.addProperty("recordingLayout",
(properties.recordingLayout() != null) ? properties.recordingLayout().name() : ""); (properties.recordingLayout() != null) ? properties.recordingLayout().name() : "");
if (RecordingLayout.CUSTOM.equals(properties.recordingLayout())) { if (RecordingLayout.CUSTOM.equals(properties.recordingLayout())) {

View File

@ -126,6 +126,7 @@ export class OpenVidu {
* *
* @param sessionId The `sessionId` of the [[Session]] you want to start recording * @param sessionId The `sessionId` of the [[Session]] you want to start recording
* @param name The name you want to give to the video file. You can access this same value in your clients on recording events (`recordingStarted`, `recordingStopped`) * @param name The name you want to give to the video file. You can access this same value in your clients on recording events (`recordingStarted`, `recordingStopped`)
* @param properties Custom RecordingProperties to apply to this Recording. This will override the global default values set to the Session with [[SessionProperties.defaultRecordingProperties]]
* *
* @returns A Promise that is resolved to the [[Recording]] if it successfully started (the recording can be stopped with guarantees) and rejected with an Error * @returns A Promise that is resolved to the [[Recording]] if it successfully started (the recording can be stopped with guarantees) and rejected with an Error
* object if not. This Error object has as `message` property with the following values: * object if not. This Error object has as `message` property with the following values:
@ -141,32 +142,28 @@ export class OpenVidu {
let data; let data;
if (!!param2) { if (param2 != null) {
if (!(typeof param2 === 'string')) { if (typeof param2 === 'string') {
const properties = <RecordingProperties>param2;
data = {
session: sessionId,
name: !!properties.name ? properties.name : '',
outputMode: properties.outputMode,
hasAudio: properties.hasAudio != null ? properties.hasAudio : null,
hasVideo: properties.hasVideo != null ? properties.hasVideo : null,
shmSize: properties.shmSize,
mediaNode: properties.mediaNode
};
if ((data.hasVideo == null || data.hasVideo) && (data.outputMode == null || data.outputMode.toString() === Recording.OutputMode[Recording.OutputMode.COMPOSED]
|| data.outputMode.toString() === Recording.OutputMode[Recording.OutputMode.COMPOSED_QUICK_START])) {
data.resolution = properties.resolution;
data.recordingLayout = !!properties.recordingLayout ? properties.recordingLayout : '';
if (data.recordingLayout.toString() === RecordingLayout[RecordingLayout.CUSTOM]) {
data.customLayout = !!properties.customLayout ? properties.customLayout : '';
}
}
data = JSON.stringify(data);
} else {
data = JSON.stringify({ data = JSON.stringify({
session: sessionId, session: sessionId,
name: param2 name: param2
}); });
} else {
const properties: RecordingProperties = param2 as RecordingProperties;
data = {
session: sessionId,
name: properties.name,
outputMode: properties.outputMode,
recordingLayout: properties.recordingLayout,
customLayout: properties.customLayout,
resolution: properties.resolution,
frameRate: properties.frameRate,
hasAudio: properties.hasAudio,
hasVideo: properties.hasVideo,
shmSize: properties.shmSize,
mediaNode: properties.mediaNode
};
data = JSON.stringify(data);
} }
} else { } else {
data = JSON.stringify({ data = JSON.stringify({

View File

@ -90,6 +90,12 @@
<input matInput id="recording-resolution-field" placeholder="Resolution" type="text" <input matInput id="recording-resolution-field" placeholder="Resolution" type="text"
[(ngModel)]="recordingProperties.resolution"> [(ngModel)]="recordingProperties.resolution">
</mat-form-field> </mat-form-field>
<mat-form-field
*ngIf="recordingProperties.hasVideo && (recordingProperties.outputMode === 'COMPOSED' || recordingProperties.outputMode === 'COMPOSED_QUICK_START')"
id="recording-framerate-form" class="inner-text-input" [style.fontSize.px]=14>
<input matInput id="recording-framerate-field" placeholder="FrameRate" type="number"
[(ngModel)]="recordingProperties.frameRate">
</mat-form-field>
</div> </div>
</div> </div>
<mat-form-field class="inner-text-input" [style.fontSize.px]=14> <mat-form-field class="inner-text-input" [style.fontSize.px]=14>

View File

@ -64,6 +64,7 @@ export class SessionApiDialogComponent {
recordingLayout: this.recordingProperties.recordingLayout, recordingLayout: this.recordingProperties.recordingLayout,
customLayout: this.recordingProperties.customLayout, customLayout: this.recordingProperties.customLayout,
resolution: this.recordingProperties.resolution, resolution: this.recordingProperties.resolution,
frameRate: this.recordingProperties.frameRate,
hasAudio: this.recordingProperties.hasAudio, hasAudio: this.recordingProperties.hasAudio,
hasVideo: this.recordingProperties.hasVideo, hasVideo: this.recordingProperties.hasVideo,
shmSize: this.recordingProperties.shmSize, shmSize: this.recordingProperties.shmSize,

View File

@ -26,8 +26,8 @@
</mat-option> </mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<mat-form-field *ngIf="this.sessionProperties.defaultOutputMode === 'COMPOSED'"> <mat-form-field *ngIf="this.sessionProperties.defaultRecordingProperties.outputMode === 'COMPOSED'">
<mat-select placeholder="DefaultRecordingLayout" [(ngModel)]="sessionProperties.defaultRecordingLayout" <mat-select placeholder="DefaultRecordingLayout" [(ngModel)]="sessionProperties.defaultRecordingProperties.recordingLayout"
id="recording-layout-select"> id="recording-layout-select">
<mat-option *ngFor="let enumerator of enumToArray(defaultRecordingLayout)" [value]="enumerator"> <mat-option *ngFor="let enumerator of enumToArray(defaultRecordingLayout)" [value]="enumerator">
<span [attr.id]="'option-' + enumerator">{{ enumerator }}</span> <span [attr.id]="'option-' + enumerator">{{ enumerator }}</span>
@ -35,7 +35,7 @@
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<mat-form-field <mat-form-field
*ngIf="this.sessionProperties.defaultOutputMode === 'COMPOSED' && this.sessionProperties.defaultRecordingLayout === 'CUSTOM'"> *ngIf="this.sessionProperties.defaultOutputMode === 'COMPOSED' && this.sessionProperties.defaultRecordingProperties.recordingLayout === 'CUSTOM'">
<input matInput placeholder="DefaultCustomLayout" type="text" <input matInput placeholder="DefaultCustomLayout" type="text"
[(ngModel)]="sessionProperties.defaultCustomLayout" id="default-custom-layout-input"> [(ngModel)]="sessionProperties.defaultCustomLayout" id="default-custom-layout-input">
</mat-form-field> </mat-form-field>

View File

@ -29,7 +29,7 @@ import { SessionPropertiesDialogComponent } from '../dialogs/session-properties-
import { SessionApiDialogComponent } from '../dialogs/session-api-dialog/session-api-dialog.component'; import { SessionApiDialogComponent } from '../dialogs/session-api-dialog/session-api-dialog.component';
import { PublisherPropertiesDialogComponent } from '../dialogs/publisher-properties-dialog/publisher-properties-dialog.component'; import { PublisherPropertiesDialogComponent } from '../dialogs/publisher-properties-dialog/publisher-properties-dialog.component';
import { SessionInfoDialogComponent } from "../dialogs/session-info-dialog/session-info-dialog.component"; import { SessionInfoDialogComponent } from "../dialogs/session-info-dialog/session-info-dialog.component";
import {ShowCodecDialogComponent} from "../dialogs/show-codec-dialog/show-codec-dialog.component"; import { ShowCodecDialogComponent } from "../dialogs/show-codec-dialog/show-codec-dialog.component";
export interface SessionConf { export interface SessionConf {
@ -92,9 +92,11 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
sessionProperties: SessionPropertiesAPI = { sessionProperties: SessionPropertiesAPI = {
mediaMode: MediaMode.ROUTED, mediaMode: MediaMode.ROUTED,
recordingMode: RecordingMode.MANUAL, recordingMode: RecordingMode.MANUAL,
defaultOutputMode: Recording.OutputMode.COMPOSED, defaultRecordingProperties: {
defaultRecordingLayout: RecordingLayout.BEST_FIT, outputMode: Recording.OutputMode.COMPOSED,
defaultCustomLayout: '', recordingLayout: RecordingLayout.BEST_FIT,
customLayout: ''
},
customSessionId: '', customSessionId: '',
forcedVideoCodec: null, forcedVideoCodec: null,
allowTranscoding: null allowTranscoding: null
@ -627,10 +629,11 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
recordingProperties: !!this.recordingProperties ? this.recordingProperties : recordingProperties: !!this.recordingProperties ? this.recordingProperties :
{ {
name: '', name: '',
outputMode: this.sessionProperties.defaultOutputMode, outputMode: this.sessionProperties.defaultRecordingProperties.outputMode,
recordingLayout: this.sessionProperties.defaultRecordingLayout, recordingLayout: this.sessionProperties.defaultRecordingProperties.recordingLayout,
customLayout: this.sessionProperties.defaultCustomLayout, customLayout: this.sessionProperties.defaultRecordingProperties.customLayout,
resolution: '1920x1080', resolution: '1920x1080',
frameRate: 25,
hasAudio: true, hasAudio: true,
hasVideo: true, hasVideo: true,
mediaNode: { mediaNode: {

View File

@ -75,8 +75,10 @@ export class TestApirestComponent implements OnInit, OnDestroy {
this.openviduRestService.getSessionId(this.openviduUrl, this.openviduSecret, this.openviduRestService.getSessionId(this.openviduUrl, this.openviduSecret,
{ {
recordingMode: RecordingMode[this.selectedRecordingMode], recordingMode: RecordingMode[this.selectedRecordingMode],
defaultRecordingLayout: RecordingLayout[this.selectedDefaultRecordingLayout], defaultRecordingProperties: {
defaultCustomLayout: this.customLayout, recordingLayout: RecordingLayout[this.selectedDefaultRecordingLayout],
customLayout: this.customLayout
},
mediaMode: MediaMode[this.selectedMediaMode], mediaMode: MediaMode[this.selectedMediaMode],
customSessionId: this.customSessionId customSessionId: this.customSessionId
}) })