mirror of https://github.com/OpenVidu/openvidu.git
openvidu-java-client and openvidu-node-client: manage frameRate in recording metadata
parent
cdb518ea97
commit
4cc1bacc20
|
@ -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())) {
|
||||||
|
|
|
@ -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({
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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: {
|
||||||
|
|
|
@ -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
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue