2016-02-04 13 views
5

Tôi đang sử dụng MediaRecorder API cùng với các phương pháp Canvas captureStream để mã hóa một dòng VP8 video của một canvas trong trình duyệt. Dữ liệu này được gửi tới FFmpeg thông qua ổ cắm web nhị phân.MediaRecorder thay đổi kích thước mà không khiêu khích

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

Vì lý do nào đó, luồng dường như chuyển ngẫu nhiên sang dòng giữa có độ phân giải thấp hơn. FFmpeg là không hài lòng về điều này:

dòng Input # 0: 0 khung thay đổi từ kích thước: 1280x720 fmt: yuv420p kích thước: 1024x576 fmt: yuv420p

[VP8 @ 0x2a02c00] Upscaling không được thực hiện. Cập nhật phiên bản FFmpeg của bạn lên phiên bản mới nhất từ ​​Git. Nếu sự cố vẫn xảy ra, điều đó có nghĩa là tệp của bạn có một tính năng chưa được triển khai. [VP8 @ 0x2a02c00] Nếu bạn muốn giúp đỡ, tải lên một mẫu của tập tin này để ftp://upload.ffmpeg.org/incoming/ và liên hệ với các mailing list ffmpeg-devel. ([email protected])

Tôi nghi ngờ rằng nó có liên quan đến việc sử dụng CPU quá mức và Firefox đang cố gắng hữu ích bằng cách giảm kích thước video xuống. Câu hỏi của tôi:

  • Firefox có giảm tốc độ video không?
  • Nếu vậy, những điều kiện gây ra điều này xảy ra? (CPU tải? Suối backpressure?)
  • Có thể để ngăn chặn Firefox từ việc này?
  • Có một lời giải thích khác nhau cho hành vi này mà tôi đang thiếu?
+0

kích thước canvas có được cố định không? bạn có đang truyền trực tuyến luồng máy ảnh của mình vào canvas không? – mido

+0

@mido Kích thước Canvas là hoàn toàn cố định. Tôi đang vẽ khung trên requestAnimationFrame, giới hạn ở 30FPS thông qua "cách tiếp cận tinh tế hơn" ở đây: http://codetheory.in/controlling-the-frame-rate-with-requestanimationframe/ – Brad

+0

bạn có thể chia sẻ mã, tôi có thể cung cấp cho nó thử và xem liệu tôi có thể phát hiện ra vấn đề không .. – mido

Trả lời

3

Firefox sẽ rescale (downscale) WebRTC/getUserMedia video nếu phát hiện CPU của hệ thống đang bị quá tải. Có một vài prefs trong about: config điều khiển hành vi này, nhưng nó không thể điều khiển qua JS.

Bạn có thể tắt tính năng này bằng cách thiết lập

media.navigator.load_adapt = false

Bạn có thể ghé qua media.navigator.load_adapt khác. * Cờ đối với một số kiểm soát hành vi. Theo mặc định, bạn sẽ nhận được downscaling nếu CPU được chốt hơn 90% trong 3 giây.

+0

Sau khi thử nghiệm thêm, tôi thấy rằng 'media.navigator.load_adapt = false' không có ảnh hưởng đến việc video đầu ra có được tự động thu nhỏ giữa luồng hay không. Sau khi thảo luận thêm trong phòng IRC, tôi đã gợi ý rằng tôi mở báo cáo lỗi này: https://bugzilla.mozilla.org/show_bug.cgi?id=1250345 – Brad

Các vấn đề liên quan