1 Обзор
WebRTC
принадлежит Google2011
Механизм обработки аудио и видео, исходный код которого был открыт в 2010 году, может собирать видеоданные в режиме реального времени, то есть он может вести прямую трансляцию или делать桌面录屏
,桌面分享
. Он относительно прост в использовании.
2. Разработка инструмента для записи экрана
Вот разработанный инструмент для записи экрана. Сначала создайте страницу на страницеvideo
Метка, используемая для отображения содержимого записи экрана, и создание еще четырех кнопок, одна屏幕分享
,Один开始录制
,Один停止录制
,Один下载视频
.
<button id="start">屏幕分享</button>
<button id="record">开始录制</button>
<button id="stop">结束录制</button>
<button id="download">下载视频</button>
<video autoplay playsinline id="player"></video>
При нажатии кнопки общего доступа к экрану черезgetDisplayMedia
метод для получения медиапотока рабочего стола, здесь вам нужно передать объект в качестве конфигурации, в объекте вы можетеvideo
а такжеaudio
Установите значение. Значение может быть логическим типом или типом объекта. Здесь сначала установите логическое значение для захвата видео, но не звука.
Возвращаемое значение представляет собойPromise
, затем вPromise
изthen
назначить потоковое мультимедиа наvideo
помеченsrcObject
Свойства могут быть очень простыми.
document.querySelector('#start').onclick = function() {
if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {
navigator.mediaDevices.getDisplayMedia({
video: true,
audio: false
}).then((stream) => {
document.querySelector('#player').srcObject = stream;
}).catch((err) => {
console.error(err);
})
} else {
alert('不支持这个特性');
}
}
Когда вы нажимаете кнопку общего доступа к экрану, в браузере появляется всплывающее окно с вопросом, какую часть контента записывать.Здесь вы можете выбрать запись всего экрана, интерфейса приложения или указанной вкладки браузера. .
Например, если я решу записать здесь весь экран, содержимое экрана моего компьютера будет отображаться в теге видео.
использоватьgetDisplayMedia
Можно захватить содержимое экрана.Если вы хотите записать содержимое и загрузить его по локальному запросу, используйте другой класс, предоставляемый WebRTC.MediaRecorder
.
У него много событий и методов. Он также очень прост в использовании. Просто создайте экземпляр напрямую. Необходимо передать два параметра, первыйstream
, то есть черезgetDisplayMedia
Полученный медиапоток, второй — необязательный параметр. ЕстьmimeType
Укажите, записывается ли аудио или видео и в каком формате выполняется запись.
Существует множество форматов, например аудио- и видеоформаты Google.video/webm
, audio/webm
, также можно установитьmp4
, вы также можете указать кодировку видеоvideo/webm;codecs=vp8
, video/webm;codecs=h264
или укажите кодировку звукаaudio/webm;codecs=opus
.
new MediaRecorder(stream, [, options]);
MediaRecorder
изapi
Есть и другие, перваяMediaRecorder.start(timeslice)
Это означает начать запись,timeslice
необязательный параметр, если он не установлен, он будет храниться в большомbuffer
, если этот параметр установлен, данные будут храниться в соответствии с периодом времени, например10s
Храните часть данных.
MediaRecorder.start()
это отключить запись, она сработает, когда запись будет остановленаdataavailable
событие, получить финалblob
данные.
MediaRecorder.pause()
Пауза записи
MediaRecorder.resume()
Возобновить запись
MediaRecorder.isTypeSupported()
Проверьте, поддерживается ли формат записываемого файла. Напримерmp4
,webm
,mp3
формат.
В дополнение к этим методам есть много событий. Как правило, есть два обычно используемых события. Первыйondataavailable
Когда эффективно собранные данные вызовут это событие, поэтому вы можете прослушивать это событие, когда полученные данные могут быть сохранены в области буфера данных, вы можетеe.data
получено в. Выполнение этого события фактически вызваноtimeslice
Решите, если не указано, то запишите все данные. Если он указан, он будет срабатывать периодически.
onerror
При возникновении ошибки это событие будет запущено, и запись автоматически остановится.
Внесите изменения здесь,getDisplayMedia
Полученный потоковый медиа больше не назначается напрямуюvideo
теги, но черезMediaRecorder
сохраняется и преобразуется вvideo
, так что не только можно назначитьvideo
,а такжеstream
Хранилище также можно скачать. БудуgetDisplayMedia
Возвращенный контент сохраняется в глобальномallStream
середина.
let allStream;
document.querySelector('#start').onclick = function() {
if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {
navigator.mediaDevices.getDisplayMedia({
video: true,
audio: false
}).then((stream) => {
allStream = stream;
document.querySelector('#player').srcObject = stream;
}).catch((err) => {
console.error(err);
})
} else {
alert('不支持这个特性');
}
}
При нажатии кнопки начала записи сначала нужно использоватьMediaRecorder.isTypeSupported
Методы для определения того, поддерживает ли браузер этот формат видео.
затем начните создаватьMediaRecorder
объект, переданный вallStream
Объект и объект конфигурации, здесь настраивается только формат видео какwebm
Формат.
Затем связатьondataavailable
Метод события, это событие будет обрабатывать собранные потоковые мультимедиа. По сути, это хранение данных во внешней переменнойbuf
середина.
окончательное исполнениеmediaRecorder.start
Начать запись.
let buf = [];
let mediaRecorder;
document.querySelector('#record').onclick = function() {
// 约束视频格式
const options = {
mimeType: 'video/webm;codecs=vp8'
}
// 判断是否是支持的mimeType格式
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.error('不支持的视频格式');
return;
}
try {
mediaRecorder = new MediaRecorder(allStream, options);
// 处理采集到的事件
mediaRecorder.ondataavailable = function(e) {
if (e && e.data && e.data.size > 0) {
// 存储到数组中
buf.push(e.data);
}
};
// 开始录制
mediaRecorder.start(10);
} catch (e) {
console.error(e);
}
}
Это позволит вам записать экран страницы. Функция загрузки требует помощиBlob
тип реализовать, создатьBlob
Type поддерживает передачуbuffer
Параметры и обозначенияbuffer
тип контента, .
При нажатии кнопки загрузки, чтобы закончить запись, то есть вызватьmediaRecorder
изstop
метод, но и судитьbuf
Есть ли контент, на случай, если кто-то кликнет и загрузит без записи, его нужно остерегаться....
использоватьnew
создание методаBlol
экземпляр, входящий записанныйbuf
а также媒体类型
, обратите внимание, что тип здесь должен использоваться так же, как и в предыдущей записиwebm
.
затем используйтеURL
изcreateObjectURL
метод будетblob
Преобразование в адресную ссылку. Загрузка относительно проста, создайтеa
тег, затем назначьте ссылку на видеоa
помеченhref
, имя файлаa
помеченdownload
Атрибуты. Последний автоматический триггерa
помеченclick
События в порядке.
document.querySelector('#download').onclick = function() {
mediaRecorder.stop();
if (buf.length) {
const blob = new Blob(buf, { type: 'video/webm'});
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.style.display = 'none';
a.download = 'aaa.webm';
a.click();
} else {
alert('还没有录制任何内容');
}
}
Также нажмите на совместное использование экрана, чтобы открыть страницу окна выбора.
Затем нажмите кнопку начала записи, и на рабочем столе появится значок записи экрана.
Наконец, нажмите кнопку загрузки, и записанное видео будет загружено. Поскольку я скачал его раньше, браузер автоматически добавил его здесь (1)
Посмотрите это видео.
Чтобы закончить запись, позвонитеmediaRecorder
объектstop
метод.
document.querySelector('#stop').onclick = function() {
if (mediaRecorder) {
mediaRecorder.stop();
}
}
На этом запись экрана завершена. Кстати, эту функцию можно использовать только вhttps
работать в среде, локальная разработка может поддерживать127.0.0.1
илиlocalhost
. Если развертывание формальное, не забудьте использоватьhttps
.
WebRTC
Также возможно получение видеопотока с камеры, нужно толькоgetDisplayMedia
заменитьgetUserMedia
Вот и все.
document.querySelector('#start').onclick = function() {
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({
video: true,
audio: false
}).then((stream) => {
document.querySelector('#player').srcObject = stream;
}).catch((err) => {
console.error(err);
})
} else {
alert('不支持这个特性');
}
}
WebRTC
Google надеется, что к более продвинутым функциям относятся трансляция аудио и видео, совместное использование удаленного рабочего стола, обмен мгновенными сообщениями и т. д.WebRTC
Он используется для быстрой разработки аудио- и видеозвонков между браузерами. Однако эти функции более сложны в разработке и будут внедрены, когда будет время.