Nodejs中有人知道blob怎么和video在客户端相互转换吗
Nodejs中有人知道blob怎么和video在客户端相互转换吗
我用webrtc获得了一个视频的src 是
blob:http%3A//localhost%3A3000/29b08b55-c734-4b85-a893-bb86e1cf306d
然后我用webscoket的方式将这个地址进行了多播,但是在别的客户端可以收到这个地址,但是视频流无法使用,结果为
Failed to load resource: the server responded with a status of 404 (Not Found)
。
求大神指点。
当然,我可以帮助你解决这个问题。在WebRTC中,Blob
对象通常用于表示二进制数据,如视频或音频文件。而Video
标签则用于在网页上显示视频流。在客户端,你可以通过JavaScript来实现Blob
与Video
之间的转换。
问题分析
你提到的是通过WebSocket传输一个Blob URL
(例如blob:http://localhost:3000/...
),但在接收端无法加载该资源。这可能是因为Blob URL是本地浏览器生成的,并且只能在生成它的同一浏览器上下文中访问。
解决方案
步骤1:将Blob转换为ArrayBuffer
首先,我们需要从WebSocket接收到的Blob URL中提取出实际的二进制数据。由于Blob URL不能直接跨域共享,我们需要通过Blob URL获取实际的二进制数据(ArrayBuffer)。
function getBlobData(blobUrl, callback) {
const xhr = new XMLHttpRequest();
xhr.open('GET', blobUrl, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
if (xhr.status === 200) {
callback(xhr.response); // ArrayBuffer
}
};
xhr.send();
}
步骤2:创建新的Blob并生成新的URL
一旦我们有了ArrayBuffer,我们可以将其转换回Blob,并为这个Blob生成一个新的URL,这样就可以在任何地方访问它了。
function createNewBlobAndUrl(arrayBuffer) {
const blob = new Blob([arrayBuffer], { type: 'video/mp4' });
return URL.createObjectURL(blob);
}
步骤3:将新的Blob URL应用到Video元素
最后,我们将新生成的Blob URL设置为<video>
元素的源。
<video id="videoPlayer" controls></video>
<script>
const videoUrl = 'blob:http%3A//localhost%3A3000/29b08b55-c734-4b85-a893-bb86e1cf306d';
getBlobData(videoUrl, function(arrayBuffer) {
const newBlobUrl = createNewBlobAndUrl(arrayBuffer);
document.getElementById('videoPlayer').src = newBlobUrl;
});
</script>
总结
这种方法绕过了Blob URL的局限性,通过获取其实际的二进制数据(ArrayBuffer),然后再创建一个新的Blob和URL。这样,你可以在任何地方使用这个新的URL来播放视频。希望这能解决你的问题!
在客户端,Blob(Binary Large Object)可以直接与Video元素进行相互转换。Blob表示一个不可变的、原始数据的类文件对象,而Video元素则用于播放视频。
示例代码
Blob转Video
// 假设你已经有了一个Blob对象
const blob = new Blob([...], { type: 'video/mp4' });
// 创建一个URL对象,该对象包含一个唯一的URL,指向当前的Blob对象
const url = URL.createObjectURL(blob);
// 创建Video元素并设置其src属性
const video = document.createElement('video');
video.src = url;
// 将Video元素添加到DOM中
document.body.appendChild(video);
Video转Blob
// 假设你已经有了一个Video元素
const video = document.querySelector('video');
// 创建一个MediaRecorder对象,用于录制Video元素的媒体流
const mediaRecorder = new MediaRecorder(video.captureStream());
// 开始录制
mediaRecorder.start();
// 存储生成的Blob片段
let recordedChunks = [];
// 当录制生成新的数据块时触发
mediaRecorder.ondataavailable = function(event) {
recordedChunks.push(event.data);
};
// 当录制结束时触发
mediaRecorder.onstop = function() {
const blob = new Blob(recordedChunks, { type: 'video/mp4' });
// 创建一个URL对象,该对象包含一个唯一的URL,指向当前的Blob对象
const url = URL.createObjectURL(blob);
console.log(url); // 输出Blob的URL
};
// 停止录制
setTimeout(() => {
mediaRecorder.stop();
}, 5000); // 持续录制5秒
解释
-
Blob转Video:
- 使用
URL.createObjectURL()
方法创建一个临时的URL,指向当前的Blob对象。 - 将此URL赋值给Video元素的
src
属性。 - 最后将Video元素添加到DOM中以显示视频。
- 使用
-
Video转Blob:
- 使用
captureStream()
方法从Video元素获取媒体流。 - 使用
MediaRecorder
对象开始录制媒体流。 - 当有新数据块可用时,将其添加到
recordedChunks
数组中。 - 录制结束后,将所有数据块组合成一个Blob对象,并创建一个新的URL指向该Blob对象。
- 使用
关于WebSocket传输问题
你提到通过WebSocket传输Blob URL遇到了404错误,这是因为Blob URL是临时的,只在当前浏览器会话中有效。若要通过WebSocket传输Blob数据,应直接发送Blob对象或Blob的二进制表示(如ArrayBuffer),而不是Blob URL。