[...] 后端开发人员 [...] 坚持认为媒体文件(图片/视频)应该作为 base64 编码的 json 文件传输。
这是一个非常糟糕(而且愚蠢)的想法。您不希望将大量二进制数据作为字符串传输,尤其不是 Unicode 字符串。
在这里,您需要武装起来,用任何手段说服您的后端开发人员改变他的想法,播放一些 Biber 或 Nickelback,甚至将他的背景图像更改为 Hello Kitty 的某些东西,或者拍摄他的屏幕截图,将其设置为背景并隐藏所有图标和栏。这应该有助于改变他的想法。如果没有,请在他的办公室安装 webasto 并锁定所有门窗。
base64 编码是移动开发中传输媒体的流行方式吗?
它很受欢迎,并且具有相对较长的历史,在 Usenet 等地方变得非常普遍。然而,在那些日子里,数据量与今天相比非常低,因为所有数据都通过调制解调器传输。
但是,仅因为它很受欢迎并不意味着它是万能的工具。它不太高效,因为它需要一个编码过程,将三个八位组转换为四个字节,导致大小增加了33%。
此外:在JavaScript中,每个字符串字符由于Unicode字符集而以两个字节存储,因此您的数据会增加一倍并扩展33%。您的300 MB数据现在变成了300 x 2 x 1.33 = 798 MB(向您的后端开发人员展示这个! :) 因为如果服务器无法处理大量流量,这是一个真实的因素)。
对于较小的文件,这种方法效果不错,但对于像您的示例中那样的较大文件,这可能会导致时间和内存使用方面的显着开销,当然还有带宽。当然,在服务器端,您需要使用自己的开销来反转这个过程。
“如果不行,您会推荐使用哪种替代方式来传输/呈现这些视频?”
我建议:
- 将元数据单独作为JSON,并使用对数据的“引用”。 JSON中不包含二进制数据。
- 将媒体数据本身分别以“原生字节”(ArrayBuffer)的形式传输。
- 同时将两者发送到服务器。
- 然后,服务器只需将JSON数据解析为后端可用的格式,二进制数据可以直接写入磁盘。
更新:我忘记提到,正如Pablo在他的答案中所提到的,您可以考虑流式传输数据。
然而,流媒体与缓冲几乎是同义词,所以带宽基本相同,只是以一种更加强力的方式提供(通常是UDP与TCP之间的区别,即数据包的丢失不会中断传输)。但是,与客户端缓冲相比,流媒体会限制您的选择。
这只是我的个人观点...