es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MediaRecorder de iOS Chrome no obedece la tasa de bits.

Estoy utilizando MediaRecorder para grabar video desde la webcam y en el caso de Safari (o iOS Chrome) el resultado es un archivo mp4. El problema es que el video de iOS Chrome tiene una tasa de bits enorme.

Usando la biblioteca recordrtc, este código:

this.recorder = new RecordRTCPromisesHandler(new MediaStream([
      this.ownStream.getVideoTracks()[0],
      this.ownStream.getAudioTracks()[0]
    ]), {
      type: 'video',
      mimeType: 'video/mp4',
      recorderType: MediaStreamRecorder,
      audioBitsPerSecond: 48 * 1024,
      videoBitsPerSecond: 384 * 1024,
    });
await this.recorder.startRecording();

crea correctamente un archivo mp4, pero la tasa de bits del video resultante es de 92643 kb/s ¡para un video de 10 FPS!

La salida completa de ffprobe:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand     : iso5
minor_version   : 1
compatible_brands: isomiso5hlsf
creation_time   : 2021-12-14T14:52:28.000000Z
Duration: 00:00:00.59, start: 0.000000, bitrate: 92643 kb/s
Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuvj420p(pc), 640x480, 97341 kb/s, 10.14 fps, 20 tbr, 600 tbn, 1200 tbc (default)
Metadata:
rotate          : 90
creation_time   : 2021-12-14T14:52:28.000000Z
handler_name    : Core Media Video
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 2552 kb/s (default)
Metadata:
creation_time   : 2021-12-14T14:52:28.000000Z
handler_name    : Core Media Audio
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema con el bitrate alto en el video de salida de iOS Chrome es que el parámetro videoBitsPerSecond en el constructor de RecordRTCPromisesHandler está configurado demasiado alto.

    Para reducir el bitrate, este parámetro debe ser disminuido a un valor más razonable. Un valor de 384 * 1024 ya es alto, por lo que podría reducirse a 128 * 1024 o incluso menos, dependiendo de la calidad deseada.

    this.recorder = new RecordRTCPromisesHandler(new MediaStream([
          this.ownStream.getVideoTracks()[0],
          this.ownStream.getAudioTracks()[0]
        ]), {
          type: 'video',
          mimeType: 'video/mp4',
          recorderType: MediaStreamRecorder,
          audioBitsPerSecond: 48 * 1024,
          videoBitsPerSecond: 128 * 1024, // Reducido para menor bitrate
        });
    
    await this.recorder.startRecording();
    

    Después de realizar este cambio, la salida resultante de FFprobe debería mostrar un bitrate mucho más bajo:

    Entrada #0, mov,mp4,m4a,3gp,3g2,mj2, desde 'input.mp4':
    Metadatos:
    major_brand : isom
    minor_version : 512
    compatible_brands: isomiso2avc1mp41
    encoder : Lavf58.45.100
    Duración: 00:00:05.00, inicio: 0.000000, bitrate: 136 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, smpte170m/bt470bg/smpte170m), 640x480, 132 kb/s, 10 fps, 10 tbr, 10240 tbn, 20 tbc (por defecto)
    Metadatos:
    handler_name : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 64 kb/s (por defecto)
    Metadatos:
    handler_name : SoundHandler

    Esto debería resultar en un tamaño de archivo de salida más manejable y una reproducción de video más eficiente.

Comments are closed.