/**
* Base64 转 Blob对象
* @param dataURI
* @returns {Blob}
*/
function dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
let byteString
if (dataURI.split(',')[0].indexOf('base64') >= 0) {
byteString = atob(dataURI.split(',')[1])
} else {
byteString = unescape(dataURI.split(',')[1])
}
// separate out the mime component
let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
// write the bytes of the string to a typed array
let ia = new Uint8Array(byteString.length)
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i)
}
return new Blob([ia], {
type: mimeString
})
}
最近在做的一个项目中视频上传的功能需要获取视频的第一帧(要显示预览,没有第一帧图放个空白块实在不美观),而后端没法及时的返回,用JS会更方便点。之前也有类似的需求,应该是比较常见的需求了,这里整理一下。 一般来说,我们的视频是本地上传的,在监听到input['file'] onchange的事件后,可以如下这样做,
不出意外的话,有的时候你会看到图片是黑的。。。第一反应就是哪有出了问题,,实际上这是因为有些视频第一帧就是黑的。所以这里可以做点优化,比如取视频的第n秒做预览图,除非你这视频前几秒都是黑的~~,如下:
既然拿到了图片数据,自然也就可以上传到服务器保存起来,通过以下函数将Base64的图像资源(dataURI)转换成blob对象,然后以FormData的形式提交,
后端一般来说会对视频进行转码或者加密,在这个过程中也可以获取到视频的第一帧,也可以使用一些云服务来处理视频,比如腾讯的云点播(Vod)。
这样就可以比较好的处理了这个问题。 这里有一个demo的地址