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())))
&& properties.hasVideo()) {
json.addProperty("resolution", properties.resolution());
json.addProperty("frameRate", properties.frameRate());
json.addProperty("recordingLayout",
(properties.recordingLayout() != null) ? properties.recordingLayout().name() : "");
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 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
* object if not. This Error object has as `message` property with the following values:
@ -141,32 +142,28 @@ export class OpenVidu {
let data;
if (!!param2) {
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 {
if (param2 != null) {
if (typeof param2 === 'string') {
data = JSON.stringify({
session: sessionId,
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 {
data = JSON.stringify({

View File

@ -90,6 +90,12 @@
<input matInput id="recording-resolution-field" placeholder="Resolution" type="text"
[(ngModel)]="recordingProperties.resolution">
</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>
<mat-form-field class="inner-text-input" [style.fontSize.px]=14>

View File

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

View File

@ -26,8 +26,8 @@
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field *ngIf="this.sessionProperties.defaultOutputMode === 'COMPOSED'">
<mat-select placeholder="DefaultRecordingLayout" [(ngModel)]="sessionProperties.defaultRecordingLayout"
<mat-form-field *ngIf="this.sessionProperties.defaultRecordingProperties.outputMode === 'COMPOSED'">
<mat-select placeholder="DefaultRecordingLayout" [(ngModel)]="sessionProperties.defaultRecordingProperties.recordingLayout"
id="recording-layout-select">
<mat-option *ngFor="let enumerator of enumToArray(defaultRecordingLayout)" [value]="enumerator">
<span [attr.id]="'option-' + enumerator">{{ enumerator }}</span>
@ -35,7 +35,7 @@
</mat-select>
</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"
[(ngModel)]="sessionProperties.defaultCustomLayout" id="default-custom-layout-input">
</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 { PublisherPropertiesDialogComponent } from '../dialogs/publisher-properties-dialog/publisher-properties-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 {
@ -92,9 +92,11 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
sessionProperties: SessionPropertiesAPI = {
mediaMode: MediaMode.ROUTED,
recordingMode: RecordingMode.MANUAL,
defaultOutputMode: Recording.OutputMode.COMPOSED,
defaultRecordingLayout: RecordingLayout.BEST_FIT,
defaultCustomLayout: '',
defaultRecordingProperties: {
outputMode: Recording.OutputMode.COMPOSED,
recordingLayout: RecordingLayout.BEST_FIT,
customLayout: ''
},
customSessionId: '',
forcedVideoCodec: null,
allowTranscoding: null
@ -627,10 +629,11 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
recordingProperties: !!this.recordingProperties ? this.recordingProperties :
{
name: '',
outputMode: this.sessionProperties.defaultOutputMode,
recordingLayout: this.sessionProperties.defaultRecordingLayout,
customLayout: this.sessionProperties.defaultCustomLayout,
outputMode: this.sessionProperties.defaultRecordingProperties.outputMode,
recordingLayout: this.sessionProperties.defaultRecordingProperties.recordingLayout,
customLayout: this.sessionProperties.defaultRecordingProperties.customLayout,
resolution: '1920x1080',
frameRate: 25,
hasAudio: true,
hasVideo: true,
mediaNode: {

View File

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