#javascript #html #video #canvas #webrtc
#javascript #HTML #Видео #холст #webrtc
Вопрос:
Раньше я getusermedia()
транслировал веб-камеру и микрофон в браузер. Но при захвате видео с помощью canvas выводится черное изображение! ctx.drawImage(video, 0,0,640,480);
почему отображается черное изображение и как это исправить? Ингмарс решил проблему mah.
window.open(canvas.toDataURL('image/jpeg'));
Теперь, если мне нужно видео продолжительностью не более 10 секунд, я подумал о циклическом просмотре кадров и присоединении к .png один за другим. Возможно ли это? Если нет альтернативы?
Комментарии:
1. Вы использовали какой-то цикл для
drawImage
? Это не сработает, если вы вызвали его только один раз. Вам необходимо обновить контекст canvas для каждого кадра.2. Какой цикл следует использовать @Ingmars
3. Проверьте мой ответ ниже
4. @Ingmars setinterval() должен запускаться при запуске потокового видео
video.play()
или при.takesnapshot
нажатии кнопки?5. Для работы setInterval видео уже должно воспроизводиться. Canvas — это просто зеркало текущего содержимого видеоэлемента. Если видео не воспроизводится, canvas ничего не покажет и впоследствии не сможет
toDataURL()
.
Ответ №1:
Вам нужен цикл:
//assuming canvas, ctx and video is set previously and available in all scopes.
var fps = 1000/25; //Approximately 25 frames per second
var videoDrawInterval = setInterval( function() {
ctx.drawImage(video, 0, 0, 640, 480);
}, fps );
something.onclick = function() {
clearInterval( videoDrawInterval );
var snapshotImg = new Image();
snapshotImg.src = canvas.toDataURL('image/jpeg', 0.5); //Second param is jpg quality
var win = window.open( '', 'Snapshot', 'width=640, height=480' );
win.document.body.appendChild( snapshotImg );
}
Имейте в виду, что сжатие jpeg поддерживается не во всех браузерах, поэтому для тестирования я бы предложил использовать формат png:
canvas.toDataURL( 'image/png' );
Комментарии:
1. нет, если он / она хочет только скриншот, нет необходимости в цикле, если это всего лишь один снимок экрана.