Захват видео с альфа-каналом с помощью canvas.captureStream()
Я пытаюсь захватить содержимое элемента canvas с альфа-каналом. Когда я делаю это, я получаю значения RGB правильно, но альфа-канал, кажется, теряется при воспроизведении результирующего видео. Есть ли способ добиться этого?
Я запускаю следующий код:
var stream = canvas.captureStream(60);
var recorder = new MediaRecorder(stream);
recorder.addEventListener('dataavailable', finishCapturing);
recorder.addEventListener('stop', function(e) {
video.oncanplay = video.play;
video.src = URL.createObjectURL(new Blob(blobs, {type:"video/webm; codecs=vp9"}));
});
startCapturing();
recorder.start();
Вот plnkr, демонстрирующий проблему: http://plnkr.co/edit/z3UL9ikmn6PtVoAHvY0B?p=preview
1 ответ
В настоящее время нет параметров для включения (канал прозрачности VP8/9) из MediaRecorder API.
Можно было бы открыть вопрос о git-репозитории W3C Mediacapture-Record.
Для этого я могу догадаться по нескольким причинам:
Из того, что я понимаю, альфа-канал webm в значительной степени является взломом Chrome, и в действительности он не реализован в самом кодеке и не полностью стабилизирован.
MediaRecorder должен иметь возможность кодировать во многих форматах, даже если текущие реализации поддерживают только видео webm/VP8 и webm/VP9 (только chrome). Так что это будет означать, что им придется каким-то образом сохранить альфа-канал в сыром потоке, только для этого нового
canvas.captureStream
метод. Исторически MediaStream в основном исходил из интерфейса getUserMedia, и не было необходимости получать прозрачность оттуда.Chrome, единственный поддерживаемый веб-дисплеем YUVA в своем стабильном канале (FF поддерживает его в ночных 54), по-прежнему не может включать
duration
внутри их записанных файлов, давайте исправим это перед добавлением хакерскихalpha_mode=true
,
Тем не менее, вы можете легко добиться этого самостоятельно:
Если вам действительно нужен прозрачный веб-файл (читается только в Chrome и FF ночью), вы можете использовать второй холст для записи, установить его фон (используя fillRect
) в цветность, которая не будет отображаться в других местах на ваших рисунках, нарисуйте оригинал и запишите его поток. После записи используйте ffmpeg для перекодирования записанного видео, на этот раз с альфа-каналом:
// all #00FF00 pixels will become transparent.
ffmpeg -i in.webm -c:v libvpx -vf "chromakey=0x00ff00:0.1:0.1,format=yuva420p" -auto-alt-ref 0 out.webm
Я лично нуждался в -auto-alt-ref 0
флаг, не уверен, что все это нужно, хотя
Но из-за этой другой ошибки Chrome вам на самом деле придется добавить этот другой холст на экран и скрыть его с помощью css (opacity: 0; width:0px; height:0px;
следует сделать).
TL; DR
Реализации этого API далеки от стабилизации, никто еще не сделал запрос на такую функцию, хотя он может появиться в ближайшем будущем, и пока может быть выполнен на стороне сервера.