【发布时间】:2018-08-24 08:35:12
【问题描述】:
我正在玩在 Meteor 中下载和提供 mp3 文件。
我正在尝试在 MeteorJS 服务器端下载 MP3 文件 (https://www.sample-videos.com/audio/mp3/crowd-cheering.mp3)(以规避 CORS 问题),然后将其传回客户端以在 AUDIO 标记中播放。
在 Meteor 中,您使用 Meteor.call 函数来调用服务器方法。配置不多,就是一个方法调用和一个回调。
当我运行该方法时,我收到:
content:
"ID3���@K `�)�<H� e0�)������1������J}��e����2L����������fȹ\�CO��ȹ'�����}$A�Lݓ����3D/����fijw��+�LF�$?��`R�l�YA:A��@�0��pq����4�.W"�P���2.Iƭ5��_I�d7d����L��p0��0A��cA�xc��ٲR�BL8䝠4���T��..etc..", data:null,
headers: {
accept-ranges:"bytes",
connection:"close",
content-length:"443926",
content-type:"audio/mpeg",
date:"Mon, 20 Aug 2018 13:36:11 GMT",
last-modified:"Fri, 17 Jun 2016 18:16:53 GMT",
server:"Apache",
statusCode:200
这是工作的Mp3文件(内容长度与我在MeteorJS服务器端写入磁盘的文件完全相同,并且可以播放)。
但是,我的以下代码不允许我将响应转换为 BLOB: ```
MeteorObservable.call( 'episode.download', episode.url.url ).subscribe( ( result: any )=> {
console.log( 'response', result);
let URL = window.URL;
let blob = new Blob([ result.content ], {type: 'audio/mpeg'} );
console.log('blob', blob);
let audioUrl = URL.createObjectURL(blob);
let audioElement:any = document.getElementsByTagName('audio')[0];
audioElement.setAttribute("src", audioUrl);
audioElement.play();
})
当我运行代码时,Blob 大小错误,无法播放
Blob(769806) {size: 769806, type: "audio/mpeg"}
size:769806
type:"audio/mpeg"
__proto__:Blob
Uncaught (in promise) DOMException: Failed to load because no supported source was found.
在后端,我只是在使用import { HTTP } from 'meteor/http' 的方法中运行return HTTP.get( url );。
我一直在尝试使用 btoa 或 atob 但这不起作用,据我所知,它已经是一个 base64 编码文件,对吧?
我不确定为什么 Blob 构造函数会创建一个比后端返回的源文件更大的文件。而且我不确定它为什么不播放。
谁能指出我正确的方向?
【问题讨论】:
-
完全奇怪,我可以确认这一点,并且我尝试了几乎所有可能的方法,即使使用 npm 请求模块但没有机会。然而,内容不是 base64 编码的,而是需要首先放入 UTF8Array 的二进制字符串,但这也不会创建代表可播放文件的 blob。也许你打开了一个问题,因为我认为这与 EJSON 有关,它用于格式化通过 ddp 发送到客户端的内容。
-
我已经标记了 Meteor 平台的问题。我觉得奇怪的是,我从服务器返回的源代码看起来与我预览文件本身时相同。以ID3开头??似乎也以同样的方式结束。但是,是的,格式一定有问题。您认为有更好的方法将内容流式传输到客户端吗?我的最终目标是将二进制文件存储在 IndexedDB 中以供离线播放。由于 CORS 问题,我必须通过 Meteor/nodejs 服务器进行路由。
-
我更喜欢 ostrio:files 和 gridfs 但这需要你将文件保存在服务器上
-
是的,我有一个使用 Mongo 的 gridFS (medium.com/@richard534/…) 的示例,但是是的,我实际上只是想代理它们。我创建了一个小型 nodejs 服务器来执行此操作,但我必须查看是否可以将其捕获并将其存储到 IndexedDB 中。
标签: meteor blob audio-streaming