如何将 PNG 图像数据数组转换为视频文件
如何将png图像数据数组转换为视频文件?
问题的出现原因:
当前,使用MediaRecorder
+ canvas.captureStream
方法是目前最好的方式。但遗憾的是,截至目前只有Chrome和Firefox支持这种方法。
解决方法:
另一种方法是在浏览器支持webp编码时(目前只有Chrome支持),可以使用以下代码:
let frames = []; // <-- frames must be *webp* dataURLs let webmEncoder = new Whammy.Video(fps); frames.forEach(f => webmEncoder.add(f)); let blob = await new Promise(resolve => webmEncoder.compile(false, resolve)); let videoBlobUrl = URL.createObjectURL(blob);
这段代码使用whammy库将一组webp图像合并成一个webm视频。在支持webp编码的浏览器中,可以使用canvas.toDataURL("image/webp")
从画布中获取webp dataURL。有关Firefox对webp支持的相关bug报告,请参见此处。
另一种跨浏览器的方法是使用libwebp.js将canvas.toDataURL()
输出的png dataURL转换为webp图像,然后将其传递给whammy编码器以获得最终的webm视频。不幸的是,png到webp的编码过程非常缓慢(在我的笔记本上几秒钟的视频需要数分钟)。
编辑:我发现使用MediaRecorder
/captureStream
方法得到的输出视频质量较低,与whammy方法相比。因此,除非有办法控制捕获流的质量,否则whammy方法似乎是最好的方法,其他两种方法作为备选方案。请参阅此问题了解更多细节。可以使用以下代码段检测浏览器是否支持webp
编码(从而支持whammy方法):
let webPEncodingIsSupported = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');
如何将一组PNG图像数据转换成视频文件?
最新版本的浏览器中,可以使用canvas.captureStream方法将画布绘制转换为webm视频流,并且可以使用MediaRecorder进行录制。但是这些功能仍然不稳定,并且可能需要在用户首选项中设置一些标志才能使用。
以下是将图像数据转换为视频文件的解决方法(代码):
var cStream, recorder, chunks = []; rec.onclick = function() { this.textContent = 'stop recording'; // set the framerate to 30FPS var cStream = canvas.captureStream(30); // create a recorder fed with our canvas' stream recorder = new MediaRecorder(cStream); // start it recorder.start(); // save the chunks recorder.ondataavailable = saveChunks; recorder.onstop = exportStream; // change our button's function this.onclick = stopRecording; }; function saveChunks(e) { chunks.push(e.data); } function stopRecording() { recorder.stop(); } function exportStream(e) { // combine all our chunks in one blob var blob = new Blob(chunks) // do something with this blob var vidURL = URL.createObjectURL(blob); var vid = document.createElement('video'); vid.controls = true; vid.src = vidURL; vid.onended = function() { URL.revokeObjectURL(vidURL); } document.body.insertBefore(vid, canvas); } // make something move on the canvas var x = 0; var ctx = canvas.getContext('2d'); var anim = function() { x = (x + 2) % (canvas.width + 100); // there is no transparency in webm, // so we need to set a background otherwise every transparent pixel will become opaque black ctx.fillStyle = 'ivory'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'black'; ctx.fillRect(x - 50, 20, 50, 50) requestAnimationFrame(anim); }; anim();
如果要在视频中添加音频,可以在调用`new MediaRecorder(cStream)`之前使用`cStream.addTrack(anAudioStream.getAudioTracks()[0])`,但是这样只能在Chrome浏览器中工作。
以上是如何将一组PNG图像数据转换成视频文件的解决方法。