Opencast Studio can be configured in three different ways:
- the user can manually configure certain things on the settings page,
- the server can provide a
settings.json
(only applicable if you deploy Studio yourself), and - configuration values can be given via GET parameters in the URL.
Settings configured by the user have the lowest priority and are overwritten by
both, settings.json
and GET parameters. GET parameters also override settings
given in settings.json
. Additionally, on the settings page, values that are
already preconfigured via settings.json
or a GET parameter are hidden from the
user.
The following settings are currently understood by Studio. The column "shown to user" means whether or not the user can configure this value on the settings page (only if this value is not configured via settings.json
or a GET parameter, of course).
Name | Type | Example | Shown to user |
---|---|---|---|
opencast.serverUrl |
string | https://develop.opencast.org |
✔ |
The server that recordings are uploaded to. Has to include https:// . If this is set to an empty string, the domain Studio is deployed on is used. |
|||
opencast.loginName |
string | peter |
✔ |
Username of the Opencast user to authenticate as. | |||
opencast.loginPassword |
string | verysecure123 |
✔ |
Password of the Opencast user to authenticate as. | |||
opencast.loginProvided |
boolean | true |
✘ |
If this is set to true , loginPassword and loginName are ignored. Instead, Studio assumes that the user's browser is already authenticated (via cookies) at the Opencast server URL. This pretty much only makes sense if studio is deployed on the same domain as the target Opencast server (e.g. in the path /studio ).
|
|||
upload.seriesId |
string | 3fe9ea49-a671-4d1e-9669-0c96ff0f8f79 |
✘ |
The ID of the series which the recording is a part of. When uploading the recording, it is automatically associated with that series. | |||
upload.workflowId |
string | fast |
✘ |
The workflow ID used to process the recording. | |||
upload.acl |
string or boolean | acl.xml |
✘ |
Defines which ACL to send when uploading the recording. See below for more information. | |||
recording.mimes |
array of strings | ["video/mp4", "video/webm"] |
✘ |
A list of preferred MIME types used by the media recorder. Studio uses the first MIME type in that list for which MediaRecorder.isTypeSupported returns true . If none of the specified ones is supported or if the browser does not support isTypeSupported , then Studio lets the browser choose a MIME-type.
|
|||
recording.videoBitrate |
positive integer | 2000000 |
✘ |
The target video bitrate of the recording in bits per second. Please note that specifying this for all users is usually a bad idea, as the video stream and situation is different for everyone. The resulting quality also largely depends on the browser's encoder. | |||
display.maxHeight |
positive integer | 1080 |
✘ |
Passed as height: { max: _ } MediaStreamConstraint to getDisplayMedia . Resolutions larger than that should be scaled down by the browser.
|
|||
display.maxFps |
positive integer | 30 |
✘ |
Passed as framerate: { max: _ } MediaStreamConstraint to getDisplayMedia . Most browsers capture with a maximum of 30 FPS by default anyway, so you might not need this.
|
|||
camera.maxHeight |
positive integer | 480 |
✘ |
Passed as height: { max: _ } MediaStreamConstraint to getUserMedia . Different maximum heights can affect the aspect ratio of the video.
|
|||
camera.maxFps |
positive integer | 30 |
✘ |
Passed as framerate: { max: _ } MediaStreamConstraint to getUserMedia . Setting this might lead to some users not being able to share their webcam!
|
|||
review.disableCutting |
boolean | true |
✘ |
Disables and hides the cutting tools from the review page when set to true . By default, this is false . It only makes sense to set this to true if your workflows can't handle the cutting information (SMIL file). The default Studio worflow in Opencast 8.4 and newer supports this.
|
Note: all data configured via settings.json
is as public as your Studio installation. For example, if your students can access your deployed studio app, they can also see the settings.json
. This is particularly important if you want to preconfigure an Opencast user.
Please also note that all settings related to video capture or recording should be treated carefully. Setting any of those means that you know better than the user's browser, which is unlikely as the browser has exact information about screen resolution, connected cameras, CPU usage and the like. So before setting those for all of your users, make sure to test those settings first!
{
"opencast": {
"serverUrl": "https://develop.opencast.org"
},
"upload": {
"workflowId": "fast",
"seriesId": "3fe9ea49-a671-4d1e-9669-0c96ff0f8f79",
}
}
GET parameters can simply be attached to the studio URL if the form …/?option1=value1&option2=value2&…
.
They are an easy way to provide a link with specific settings to someone.
An example of such a link would be:
https://studio.opencast.org/?opencast.serverUrl=https://develop.opencast.org&upload.workflowId=fast&upload.seriesId=3fe9ea49-a671-4d1e-9669-0c96ff0f8f79
You can also include your configuration in a JSON object, encode it as UTF-8 string then encode that as hex string and pass it with the config=
GET parameter. This might help to avoid problems if URLs (and thus the GET parameters) are processed (e.g. by an LMS) in a way that modifies special characters. For example:
- Stringified JSON:
{"opencast":{"loginProvided":true}}
- Encoded as hex string:
7B226F70656E63617374223A7B226C6F67696E50726F7669646564223A747275657D7D
- Pass to Studio:
https://studio.opencast.org?config=7B226F70656E63617374223A7B226C6F67696E50726F7669646564223A747275657D7D
You can encode your JSON string as hex string with this tool, for example. Be sure to disable the options "Use Hex Radix Prefix" and "Use Extra Spacing".
Note that this can't be used with other GET parameters. If config=
is specified, all other parameters are ignored.
To check if your configuration is correctly applied, you can open Studio in your browser and open the developer tools console (via F12). Studio prints the merged settings and the current state of the connection to the Opencast server there.
You can also check the "Network" tab in the browser's dev tools. There you can see where Studio tries to fetch settings.json
and your ACL template from and what your server returned.
With upload.acl
you can configure which ACL are sent (as an attachment) to the Opencast server when uploading. Possible values:
true
: use the default ACL (this is the default behavior)false
: do not send an ACL when uploading- Path to XML template (e.g.
acl.xml
or/config/acl.xml
). A path to an XML file specifying the ACL. If the path starts with/
it is considered absolute on the current server andserver.url${path}
is loaded. If it doesn't start with/
,server.url/$PUBLIC_URL/${path}
is loaded.
The ACL XML template is a Mustache template. The following variables are passed as view:
userName
: the username of the currnet user (e.g.admin
)userRole
: the user role of the current user (e.g.ROLE_USER_ADMIN
)roleOAuthUser
:"ROLE_OAUTH_USER"
if this role is inuser.roles
orundefined
otherwiseltiCourseId
: thecontext_id
taken from the/lti
endpoint orundefined
if the field does not exist.defaultReadRoles
: a convenience array of roles that usually have read access. Always containsuserRole
. IfltiCourseId
is defined, also contains"${ltiCourseId}_Learner"
and"${ltiCourseId}_Instructor"
.defaultWriteRoles
: a convenience array of roles that usually have read access. Always containsuserRole
. IfltiCourseId
is defined, also contains"${ltiCourseId}_Instructor"
.
The default ACL definition template simply gives read and write access to userRole
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Policy PolicyId="mediapackage-1"
RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:permit-overrides"
Version="2.0"
xmlns="urn:oasis:names:tc:xacml:2.0:policy:schema:os">
<Rule RuleId="user_read_Permit" Effect="Permit">
<Target>
<Actions>
<Action>
<ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue>
<ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
DataType="http://www.w3.org/2001/XMLSchema#string"/>
</ActionMatch>
</Action>
</Actions>
</Target>
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">{{ userRole }}</AttributeValue>
<SubjectAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:subject:role"
DataType="http://www.w3.org/2001/XMLSchema#string"/>
</Apply>
</Condition>
</Rule>
<Rule RuleId="user_write_Permit" Effect="Permit">
<Target>
<Actions>
<Action>
<ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">write</AttributeValue>
<ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
DataType="http://www.w3.org/2001/XMLSchema#string"/>
</ActionMatch>
</Action>
</Actions>
</Target>
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">{{ userRole }}</AttributeValue>
<SubjectAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:subject:role"
DataType="http://www.w3.org/2001/XMLSchema#string"/>
</Apply>
</Condition>
</Rule>
</Policy>