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())))
|
||||
&& 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())) {
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue