我使用Node.js通过Websocket将实时webm视频流式传输到一个网页,该网页将在标签中播放.以下是服务器和客户端的代码:
服务器:
var io = require('./libs/socket.io').listen(8080, {log:false});
var fs = require('fs');
io.sockets.on('connection', function (socket)
{
console.log('sono entrato in connection');
var readStream = fs.createReadStream("video.webm");
socket.on('VIDEO_STREAM_REQ', function (req)
{
console.log(req);
readStream.addListener('data', function(data)
{
socket.emit('VS',data);
});
});
});
Run Code Online (Sandbox Code Playgroud)
客户:
<html>
<body>
<video id="v" autoplay> </video>
<script src='https://localhost/socket.io/socket.io.js'></script>
<script>
window.URL = window.URL || window.webkitURL;
window.MediaSource = window.MediaSource || window.WebKitMediaSource;
if(!!! window.MediaSource)
{
alert('MediaSource API is not available!');
return;
}
var mediaSource = new MediaSource();
var video = document.getElementById('v');
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('webkitsourceopen', function(e)
{ …Run Code Online (Sandbox Code Playgroud) 我们正在开发一个应用程序,必须由可能有一些涉及使用kinect来移动光标的视觉问题的人使用,因此我们需要使它比平常更大.但是,此应用程序不直接与kinect接口,因此我们无法使用其API.
我们使用WPF在C#(.NET 4.5)中编程.问题是在高分辨率设备中默认光标大小不能大于32x32像素或64x64像素.
我们首先尝试使实际的鼠标光标不可见,然后使用Graphics对象,使用Graphics.FromHwnd(applicationWindowHandler).它成功绘制图像,但它留下了过去光标位置的踪迹.
有没有办法使用常规的Windows鼠标光标,或至少一种方法来删除跟踪(如强制当前窗口刷新的"无效"方法)?
我们已经尝试过这些解决方案,但没有运气:
www.hsys.com/CustomCursorArticlePart1.htm
www.hsys.com/CustomCursorArticlePart2.htm
csharparticles.blogspot.it/2005/03/custom-drawing-cursors.html
我正在使用Node.js作为流服务器来传输由FFMPEG发送的实时Webm视频(从另一个应用程序执行,流通过HTTP完成)并由使用该标记的webapp接收.
这就是我正在做的事情:FFMPEG使用以下命令流式传输接收到的帧:
ffmpeg -r 30 -f rawvideo -pix_fmt bgra -s 640x480
-i \\.\pipe\STREAM_PIPE -r 60
-f segment -s 240x160 -codec:v libvpx -f webm
http://my.domain.com/video_stream.webm
Run Code Online (Sandbox Code Playgroud)
(该流来自一个应用程序,该应用程序使用Kinect作为源并通过管道与FFMPEG通信,一帧接一个地发送)
当webapp连接时,它立即从服务器接收此响应:
HTTP/1.1 200 OK
X-Powered-By: Express
content-type: video/webm
cache-control: private
connection: close
Date: Fri, 06 Dec 2013 14:36:31 GMT
Run Code Online (Sandbox Code Playgroud)
并且会立即附加Webm标头(先前存储在服务器上,具有与源流相同的分辨率和帧速率,并在VLC上进行测试).然后webapp开始接收FFMPEG流传输的数据.以下是Mkvinfo GUI的屏幕截图,显示了标题的字段:

但是,即使Chrome控制台的"网络"标签显示存在实际的数据流(意味着流式传输的内容不完全是垃圾,否则连接将被丢弃),播放器也不会显示任何内容.我们尝试手动将我们的标头添加到webapp收到的转储视频中,而VLC播放它很好,但标签不会发生这种情况.
什么可能导致这个问题?我们是否遗漏了FFMPEG方面的编码或者我们在标题上存储了错误的值(或者它们还不够)?
PS:我不能依赖外部流服务器.
PPS:我们尝试了以下实验:
我正在使用VP8 .NET库从笔记本电脑摄像头转换视频流,我想将其存储在webm文件中(无需音频).为此,我使用库中文档中提供的代码作为示例,我添加了几行代码将编码流写入文件.这是代码:
class EncodingSession
{
private readonly VP8.Encoder Encoder;
static FileStream fs = new FileStream("provavideo.webm", FileMode.CreateNew);
BinaryWriter w = new BinaryWriter(fs);
public EncodingSession(int width, int height, int fps)
{
Encoder = new VP8.Encoder(width, height, fps);
}
public byte[] Encode(Image frame)
{
Encoder.ForceKeyframe();
byte[] array = Encoder.Encode((Bitmap)frame);
w.Write(array);
return array;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会产生有效的webm文件,可能是因为缺少webm标头.我的问题是:如何添加有效的webm标头(如果这确实是需要的话)?是否需要将其他内容添加到我的文件中?
c# ×2
html5-video ×2
node.js ×2
webm ×2
.net ×1
dom ×1
ffmpeg ×1
html5 ×1
javascript ×1
kinect ×1
mouse-cursor ×1
video ×1
vp8 ×1
websocket ×1
wpf ×1