Base64视频编码-好坏主意

Base64 video encoding - goodad idea?

本文关键字:视频 编码 Base64      更新时间:2023-09-26

我正在做一个使用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>