0

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

为此,我已经下载并安装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"}
]

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

我的问题是您如何流式传输到视频内容(最好使用 videogular),有没有人知道人们使这成为可能的示例?

服务器端代码

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

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

然后通过管道传输文件的输出。

然后使用它来流式传输文件

4

2 回答 2

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"} ]
于 2015-06-01T17:11:48.153 回答
1

如果您的硬盘驱动器上有视频文件,并且您想使用它们的文件名来提供它们,那么您应该像使用任何其他资源一样使用Express Static来提供它们

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

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

然后视频文件./videos/myvid.mp4将以http://localhost:8000/videos/myvid.mp4 的形式提供

于 2015-06-02T13:35:33.263 回答