2016-02-04 15 views
5

Sto utilizzando l'API MediaRecorder insieme al metodo Canvas captureStream per codificare un flusso video VP8 di una tela nel browser. Questi dati vengono inviati a FFmpeg tramite socket web binario.MediaRecorder modifica le dimensioni senza provocazione

var outputCaptureStream = $('canvas')[0].captureStream(30); 
var mediaRecoder = new MediaRecoder(outputCaptureStream, { 
    mimeType: 'video/webm' 
}); 

mediaRecorder.ondataavailable = function (e) { 
    ffmpegStdin.write(e.data); 
} 

mediaRecoder.start(1000); 

Per qualche motivo, il flusso sembra passare in modo casuale a un mid-stream di risoluzione inferiore. FFmpeg non è felice di questo:

Il flusso di input # 0: 0 cornice modificata da dimensioni: 1280x720 fmt: YUV420P alla dimensione: 1024x576 fmt: YUV420P

[VP8 @ 0x2a02c00] upscaling non è implementata. Aggiorna la tua versione di FFmpeg alla più recente da Git. Se il problema si verifica ancora, significa che il tuo file ha una funzionalità che non è stata implementata. [vp8 @ 0x2a02c00] Se si desidera aiutare, caricare un esempio di questo file su ftp://upload.ffmpeg.org/incoming/ e contattare la mailing list ffmpeg-devel. ([email protected])

Sospetto che abbia qualcosa a che fare con un uso eccessivo della CPU e che Firefox stia cercando di essere utile ridimensionando il video. Le mie domande:

  • Firefox ridimensiona il video al volo?
  • In tal caso, quali condizioni causano ciò? (Carico della CPU? Backoffure dello streaming?)
  • È possibile impedire a Firefox di farlo?
  • C'è una spiegazione diversa per questo comportamento che mi manca?
+0

è la dimensione della tela fissa? stai trasmettendo in streaming la tua videocamera? – mido

+0

@mido La dimensione della tela è completamente fissa. Sto disegnando frame su richiestaAnimationFrame, con un limite di 30 FPS tramite "l'approccio migliore" qui: http://codetheory.in/controlling-the-frame-rate-with-requestanimationframe/ – Brad

+0

puoi condividere il codice, potrei dare prova e vediamo se riesco a individuare il problema .. – mido

risposta

3

Firefox esegue il ridimensionamento (riduzione) del video WebRTC/getUserMedia se rileva che la CPU del sistema è in sovraccarico. Ci sono alcune prefs in about: config che controllano questo comportamento, ma non è controllabile tramite JS.

è possibile disattivare la funzione impostando

media.navigator.load_adapt = false

Potete guardare l'altro media.navigator.load_adapt. * Bandiere per un certo controllo sul comportamento. Per impostazione predefinita, il downscaling si verifica se la CPU viene ancorata a più del 90% per 3 secondi.

+0

Dopo ulteriori test, ho trovato che 'media.navigator.load_adapt = false' non ha alcuna influenza sul fatto che il video di output sia scalato dinamicamente a metà-stream. Dopo ulteriori discussioni nella sala IRC, è stato suggerito di aprire questo bug report: https://bugzilla.mozilla.org/show_bug.cgi?id=1250345 – Brad

Problemi correlati