如何将视频数据流式传输到视频元素
How to stream video data to a video element?
我有一个Node.js进程,它将视频流输出到我的Node.js应用程序中。
在客户端,有一个<video>
标签。我想将Node.js中的视频流式传输到视频标签的src
属性中。我以前的经验告诉我,我们必须为此使用blob
对象。然而,我不能百分之百地确定我将如何以及为什么使用它
我正在考虑的另一个可能的解决方案是在我的服务器上创建某种临时文件,然后将流写入该文件,然后作为视频的源。然而,这似乎并不直观。那么,我想知道,对于这样的问题,是否有一个更成熟的解决方案。
m3u8格式通常用于流式传输。视频流/转码是一项资源密集型的工作。如果你有选择的话,我建议你使用第三方服务。
您可能需要查看以下选项:
-
BinaryJS。它是基于websockets的双向实时二进制数据传输工具。
-
来自火卫一实验室的JSMpeg流服务器(以防捕获)。您所需要做的就是启动
ffmpeg
,并将其指向nodejs脚本正在运行的域和端口。你可以在这里找到更多信息。 -
直接用管道输送溪流。好的答案张贴在这里。简而言之,您只需要指定
Accept-Ranges
、Content-Range
、Content-Length
和Content-Type
标头,然后创建相关的Read流(使用start
和end
选项)并将其通过管道发送到response
对象。
实际上我两周前在一次黑客马拉松上尝试过这个。我最终几乎没有让这个flv流工作,我在下面发布了它。我的意图是建立一个图书馆,使这将需要的大部分流程自动化。
正如您所看到的,我在服务器上打开了一个新端口来处理流向客户端的单独数据流。这反映在客户端的src标记中。
你需要三样东西:
-
这是ffmpeg的Linux版本。
-
js侧的Flowplayer。
-
npm-fluent ffmpeg
//StreamServer.js
var express = require('express'), app = express(), ffmpeg = require('fluent-ffmpeg'); module.exports = function () { app.stream(req, res) { res.contentType('flv'); // make sure you set the correct path to your video file storage var pathToMovie = '/path/to/storage/' + req.params.filename; var proc = ffmpeg(pathToMovie) // use the 'flashvideo' preset (located in /lib/presets/flashvideo.js) .preset('flashvideo') // setup event handlers .on('end', function () { console.log('file has been converted succesfully'); }) .on('error', function (err) { console.log('an error happened: ' + err.message); }) // save to stream .pipe(res, { end: true }); }; }
//routes.js
'use strict'; var stream = require('../controllers/streaming.server.controller'), streamServer = require('../controllers/StreamServer.js'), express = require('express');
//streaming.server.controller.js
module.exports = function (app) { app.get('/api/stream', function (req, res) { streamServer.stream(req, res); }); }; var path = require('path'), express = require('express'), app = express(), routes = require('../routes/routes.js')(app), ffmpeg = require('fluent-ffmpeg'); app.listen(4000);
编辑:客户端部分:
https://github.com/fluent-ffmpeg/node-fluent-ffmpeg/tree/master/examples/flowplayer
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="/flowplayer.min.js"></script>
<title>node-fluent-ffmpeg</title>
</head>
<body>
<!-- this A tag is where your Flowplayer will be placed. it can be anywhere -->
<a
href="http://localhost:4000/api/stream"
style="display:block;width:520px;height:330px"
id="player">
</a>
<!-- this will install flowplayer inside previous A- tag. -->
<script>
flowplayer("player", "/flowplayer.swf");
</script>
</body>
</html>
(只需更改href属性)
- 通过socket.io从浏览器流式传输视频
- 使用HTML5流式传输加密版权内容(音频/视频)
- 将视频从Flash流式传输到HTML5
- 如何检查是否存在“;没有到主机的路由”;在流式传输视频的过程中一遍又一遍
- 如何将视频数据流式传输到视频元素
- 检查视频是否正在流式传输
- 使用 Jquery 连接到 Restful API 以流式传输视频
- 如何使用 JW 播放器流式传输视频
- 如何在 2 个客户端之间直接连接流式传输视频
- 可以在不使用 RTSP 的情况式传输实时视频
- 如何播放/提供/流式传输视频到本地html站点?VLC/FFMPEG
- 通过服务器将视频从一个客户端流式传输到另一个客户端
- 我想从我的网络服务器流式传输视频,但我只想在有观众的时候流式传输
- 如何“;streamus”;chromeextension仅流式传输youtube视频的音频
- HTML5/javascript流式传输已播放的视频列表
- 如何在web浏览器上为Live555服务器通过rtsp协议流式传输视频
- 如何将C#视频(图像)流式传输到HTML5客户端
- 如何使用PhoneGap流式传输视频
- 调用javascript通过流式传输在Android中重现视频
- 无法通过websocket向Firefox传输视频