来自节点的angular $ sce trustAsResourceUrl

时间:2015-06-01 11:44:09

标签: angularjs node.js videogular

我尝试制作流媒体服务,将文件内容(在本例中为视频)流式传输到视频元素中。

出于此目的,我已经下载并安装了videogular,现在正在尝试设置它,但我确定该怎么做。

根据视频加载视频的文档,您需要这样的语法:

sources: [
    {src: $sce.trustAsResourceUrl(myMp4Resource), type: "video/mp4"}
]

当你想在没有流媒体的情况下加载内容时,这很好。

但是比如说你有一个节点服务器在端口8105上运行,而你想要收集的文件的id为1,那么结果可能如下所示:

sources: [
    {src: $sce.trustAsResourceUrl('http://localhost:8105/loadvideo/1'), type: "video/mp4"}
]

然而,在我尝试这样做时,它只会告诉我资源不是实际资源。

我的问题是你如何流式传输视频内容(最好是视频内容),有没有人知道人们做到这一点的例子?

服务器端代码

好的,所以我最初的想法(我知道这是对上述代码的更改)是创建一个route,其路径为:

    router.route('/retrieveFile')
    .post(function (request, response) {
        var path = '../' + request.body.data;
        var file = fs.createReadStream(path);
        file.pipe(response);
    });

然后输出文件的输出。

然后使用它来传输文件

2 个答案:

答案 0 :(得分:1)

要将文件作为文件提供,您需要在管道

之前设置相应的标题

要加载文件,您将此代码放入路由器,以及您使用post的位置,如果您没有充分理由我只使用getall

如果客户决定断开中间流

,您可能还希望能够结束传输

或者,您可能希望使用res.download代替流,在这种情况下会自动处理相应的标头和中断。

所以整个代码可能如下所示:

router.route('/path/to/video.mp4')
.all(function(req, res){
    res.header('content-disposition', 'filename="video.mp4"')
    var stream = fs.createReadStream('./resources/video.mp4');
    stream.pipe(res);
    require('on-finished')(res, stream.abort.bind(stream));

    // or simply
    res.download(fs.readSync('/path'))
});

然后您可以使用http://localhost:8000/path/to/video.mp4直接将视频加载到浏览器中,只要它可以播放,或者只是提供下载。或者,您可以在videgular

中使用此网址
sources: [ {src: $sce.trustAsResourceUrl('http://localhost:8000/path/to/video.mp4'), type: "video/mp4"} ]

答案 1 :(得分:1)

如果您的硬盘上有视频文件,而您希望使用其文件名为所有视频文件提供服务,那么您应该像使用其他资源一样使用Express Static来提供服务

您可以添加路径前缀' / videos'将它们与常规资源区分开来。

app.use('/videos', express.static('videos'));

然后视频文件./videos/myvid.mp4可用作http://localhost:8000/videos/myvid.mp4