Мне совершенно непонятно, почему вы это делаете, но HTMLAttributes может быть только строками, и ничем иным.
Таким образом, когда вы делаете cvs.setAttribute('recordedChunks', mediaRecordedChunks);
, вы на самом деле делаете cvs.setAttribute('recordedChunks', mediaRecordedChunks.toString());
, и поскольку mediaRecordedChunks
содержит только объект Blob в это время, он сгенерирует строку "[object Blob]"
:
const mediaRecordedChunks = [ new Blob([]) ];
const cvs = document.createElement( "canvas" );
cvs.setAttribute( "recordedChunks", mediaRecordedChunks );
console.log( cvs.getAttribute( "recordedChunks" ) );
И это то, что вы сохраняете в своем файле (вы можете попробовать открыть его в текстовом редакторе).
Из этой строки вы не сможете делать что-либо, связанное с исходными чанками, которые вы записали.
Лучше всего сделать так, чтобы ваш код сохранения мог напрямую обращаться к массиву mediaRecordedChunks
, либо в виде области видимости, либо передавая его как аргумент функции, которая содержит сохраняющую часть.
// refactor your saving code to be a function
const saveMedia = ( chunks ) => {
const blob = new Blob( chunks );
//...
};
А затем, когда вы хотите сохранить, вызывайте ее из части, где mediaRecordedChunks
было объявлено
saveMedia( mediaRecordedChunks );
Если вы абсолютно необходимо использовать атрибут , как бы плохо он ни был , затем создайте blobURI из своей записывающей части и сохраните его как атрибут canvas, хотя не забывайте отзывать предыдущий на каждом новое dataavailable событие.
//...
mediaRecorder.ondataavailable = function(e) {
mediaRecordedChunks.push( e.data );
const oldURL = cvs.getAttribute( 'recordedChunks' );
URL.revokeObjectURL( oldURL );
const newURL = URL.createObjectURL( mediaRecordedChunks );
cvs.setAttribute( 'recordedChunks', newURL );
};
//...
А в вашем коде сохранения
if( localCanvas ) {
const url = localCanvas.getAttribute( 'recordedChunks' );
const link = window.document.createElement( 'a' );
link.href = url;
link.download = 'test_output.webm';
document.body.append( link );
link.click();
link.remove();
}