@@ -284,17 +284,38 @@ export class MediaAPI {
284
284
private camera_recorder : MediaRecorder = null ;
285
285
286
286
initializeCameraRecorder ( stream : MediaStream , opts ?: MediaRecorderOptions ) {
287
- if ( ! opts ) {
288
- opts = { mimeType : "video/webm" } ;
289
- } else if ( ! opts . mimeType ) {
290
- opts . mimeType = "video/webm" ;
287
+ let mimeType = this . getCompatibleMimeType ( ) || "video/webm" ;
288
+ const recorderOptions : MediaRecorderOptions = {
289
+ ... opts ,
290
+ mimeType
291
291
}
292
292
293
293
this . camera_stream = stream ;
294
- const recorder = new MediaRecorder ( stream , opts ) ;
294
+ const recorder = new MediaRecorder ( stream , recorderOptions ) ;
295
295
this . camera_recorder = recorder ;
296
296
}
297
297
298
+ // mimetype checking code adapted from https://github.com/lookit/lookit-jspsych/blob/develop/packages/record/src/videoConfig.ts#L673-L699
299
+ /** returns a compatible mimetype string, or null if none from the array are supported. */
300
+ private getCompatibleMimeType ( ) : string {
301
+ const types = [
302
+ // chrome firefox edge
303
+ "video/webm;codecs=vp9,opus" ,
304
+ "video/webm;codecs=vp8,opus" ,
305
+ // general
306
+ 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"' ,
307
+ // safari
308
+ "video/mp4;codecs=h264,aac" ,
309
+ "video/mp4;codecs=hevc,aac" ,
310
+ ]
311
+ for ( const mimeType of types ) {
312
+ if ( MediaRecorder . isTypeSupported ( mimeType ) ) {
313
+ return mimeType ;
314
+ }
315
+ }
316
+ return null ;
317
+ }
318
+
298
319
getCameraStream ( ) : MediaStream {
299
320
return this . camera_stream ;
300
321
}
0 commit comments