2016-02-04 4 views
5

Я использую API MediaRecorder вместе с методом Canvas captureStream для кодирования видеопотока VP8 холста в браузере. Эти данные отправляются в FFmpeg через двоичный веб-сокет.MediaRecorder изменяет размер без провокации

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); 

По какой-то причине поток, по-видимому, случайно переключается на средний поток с более низким разрешением. FFmpeg не устраивает по этому поводу:

Входной поток # 0: 0 кадр изменен с размером: 1280x720 FMT: yuv420p по размеру: 1024x576 FMT: yuv420p

[vp8 @ 0x2a02c00] Upscaling не реализован. Обновите версию FFmpeg до последней из Git. Если проблема все еще возникает, это означает, что в вашем файле есть функция, которая не была реализована. [vp8 @ 0x2a02c00] Если вы хотите помочь, загрузите образец этого файла в ftp://upload.ffmpeg.org/incoming/ и обратитесь в список рассылки ffmpeg-devel. ([email protected])

Я подозреваю, что это имеет какое-то отношение к чрезмерному использованию ЦП и что Firefox пытается помочь, уменьшив видео. Мои вопросы:

  • Включает ли Firefox масштабирование видео на лету?
  • Если да, то какие условия вызывают это? (Загрузка процессора? Сброс противодавления?)
  • Возможно ли предотвратить использование Firefox?
  • Есть ли другое объяснение поведению, которое мне не хватает?
+0

Размер холста фиксированный? вы передаете поток камеры в холст? – mido

+0

@mido Размер холста полностью фиксирован. Я рисую рамки на requestAnimationFrame, ограниченный 30FPS через «более совершенный подход» здесь: http://codetheory.in/controlling-the-frame-rate-with-requestanimationframe/ – Brad

+0

вы можете поделиться кодом, я мог бы дать это попытка и посмотреть, могу ли я обнаружить проблему. – mido

ответ

3

Firefox будет масштабировать (уменьшать) видео WebRTC/getUserMedia, если он обнаруживает, что процессор системы перегружен. Есть несколько префов в: config, которые управляют этим поведением, но не управляются через JS.

Вы можете отключить эту функцию, установив

media.navigator.load_adapt = ложный

Вы можете посмотреть на другой media.navigator.load_adapt. * Флаги для некоторого контроля над поведением. По умолчанию вы получите масштабирование, если процессор будет привязан более чем на 90% в течение 3 секунд.

+0

После дальнейшего тестирования я обнаружил, что 'media.navigator.load_adapt = false' не влияет на динамическое масштабирование выходного видео в середине потока. После более подробного обсуждения в комнате IRC было предложено открыть этот отчет об ошибке: https://bugzilla.mozilla.org/show_bug.cgi?id=1250345 – Brad