Base64视频编码-好坏主意
Base64 video encoding - goodad idea?
我正在做一个使用cordova的移动前端项目,与我合作的后端开发人员坚持认为媒体文件(图像/视频)应该以base64编码的json文件传输。
现在,对于图像,它到目前为止是有效的。虽然它冻结UI几秒钟,但它可以以某种方式延迟。
然而,视频到目前为止是一个痛苦的处理,一个单一的/简单的视频传输的长度接近30万的长度。它使我可怜的笔记本电脑通过疯狂旋转,并在大约20秒后获得uri通过代码(它仍然不工作,我不想调试它,因为它几乎崩溃我的笔记本电脑每次刷新)。
所以我的问题是:
- base64编码在移动开发中是一种流行的媒体传输方式吗?
- 如果没有,您建议使用什么替代方法来传输/呈现这些视频?
我应该提一下,这些视频是为了让很多人(可能是几百人)同时观看,而另一个开发人员说他们的服务器无法处理这样的流量。
非常感谢你的建议,我在任何地方都找不到这个信息。[…后端开发者[…]]坚持媒体文件(图像/视频)应该以base64编码的json文件传输。
这是一个非常糟糕(和愚蠢)的想法。您不希望以字符串形式传输大量二进制数据。尤其是Unicode字符串。
在这里,你需要武装起来,说服你的后端开发人员不惜一切代价改变他的想法,播放一些Biber或Nickelback,甚至将他的背景图像更改为Hello Kitty,或者拍摄他的屏幕快照,将其设置为背景并隐藏所有图标和栏。这应该能帮你改变他的想法。如果没有,在他的办公室里最多放一个web basto,并锁上所有的门窗。
base64编码在移动开发中是一种流行的媒体传输方式吗?
它很受欢迎,有相对较长的历史,在Usenet等网站上很常见。然而,在那些日子里,数据量与今天相比非常低,因为所有的数据都是通过调制解调器传输的。
然而,仅仅因为它很流行并不意味着它是适合所有事情的工具。它不是很有效,因为它需要一个编码过程,将三个八位字节转换为四个字节,导致大小增加33%。
最重要的是:在JavaScript中,由于Unicode字符集,每个字符串字符存储为两个字节,因此您的数据翻倍并扩展33%。您的300 mb数据现在是300 x 2 x 1.33 = 798 mb(向您的后台显示!):)因为如果服务器不能处理大量的流量,这是一个真实的因素)。
这对于较小的文件工作得很好,但是对于您示例中的较大文件,这可能会导致时间和内存使用以及带宽的显著开销。当然,在服务器端,您需要用自己的开销来逆转这个过程。
如果没有,你建议用什么方法来传输/呈现这些视频?
我建议:
- 使用对数据的引用将元数据分离为JSON。JSON中没有二进制数据。
- 以原生字节单独传输媒体数据本身 (ArrayBuffer)。
- 同时发送到服务器。
服务器只需要将JSON数据解析为可食用的后端,二进制数据可以直接到磁盘。
Update我忘了提到,正如Pablo在他的回答中所做的那样,您可以查看流式数据。
然而,流几乎是缓冲的同义词,所以带宽将是相同的,只是以一种更暴力的方式提供(通常是UDP与TCP,即。丢失数据包不会破坏传输)。流式传输限制了你的选择,而不是在客户端进行缓冲。我的2美分…
不知道为什么总是提到"33%开销",这完全是胡说八道。是的,它最初确实会粗略地添加这个数量,但是有一个叫做gzip的小东西(听说过吗?)我已经做了大量的测试,差异通常可以忽略不计。事实上,有时gzip后的base64字符串实际上小于二进制文件。看看这家伙的测试所以,拜托,我们能不能停止传播绝对的虚构。
Base64是一种完全可以接受的检索视频的方法。事实上,它对于私人消息传递系统来说非常有效。例如,如果你使用的是AWS S3,你可以私下存储文件,这样就没有URL了。
然而,使用压缩的base64视频的主要缺点(我认为)是你需要等待整个视频加载,所以伪流是不可能的。
Base64是一种方便(但不高效)的传输二进制数据的方式。这是低效的,因为传输大小将比你最初传输的大33%。这不是一种流行的传输视频的方式。如果你打算流式传输视频,你应该寻找一个成熟的协议来做这件事。
我推荐一个流协议(有很多你可以选择的)。
我觉得这主意不好,视频文件很大。但是你可以尝试用小的视频文件。试试在线编码器https://base64.online/encoders/encode-video-to-base64在那里,您可以将视频转换为Base64 Data URI,并尝试插入HTML
结果如下:
<video controls><source src="data:video/mpeg;base64,AAABuiEAAQALgBexAAABuwAMgBexBeH/wMAg4ODgAAA..."></video>
- 视频HTML没有'无法在Internet Explorer 11上工作
- 播放当前视频时如何停止其他视频?JavaScript
- 使用Facebook live API创建实时视频对象时的隐私设置
- Brightcove获取/显示HTML中的当前视频标题和描述
- Twilio-显示所有连接参与者的远程参与者视频
- WebRTC视频聊天可以在FF中使用,但不能在Chrome中使用
- 是否可以使用iframe API在iOS浏览器上播放youtube视频
- 将地理编码结果转换为php变量以发布到mysql数据库
- 如何检查用户在html5视频播放器中观看了完整的视频
- Fullpage.js-视频+背景在同一部分
- html5视频中的Youtube类型注释
- 角度p2p视频聊天-远程流是黑视频
- tiltSlider播放/暂停视频元素(如果li有当前类)
- 可以在响应时隐藏iphone上的“播放”按钮以进行视频播放
- Javascript-在视频中跟踪鼠标位置
- 为什么可以'我在视频js中查看HLS
- 使用编解码器编码的视频文件.mov:Apple ProRes (apch) 无法通过 chrome 或 IE11 中的视
- Node.JS: FFmpeg管道视频编码没有创建缩略图
- Base64-用js编码视频文件
- Base64视频编码-好坏主意