我正在尝试创建一个使用JavaCV获取流视频数据的应用程序并将其发送到Web套接字服务器。然后,Web套接字服务器将视频数据分发给连接的客户端。 1.应用程序使用JavaCV从我的PC的网络摄像头获取实时流数据(MP4)。 2.应用程序继续将其发送到Web套接字服务器。 3.服务器将其作为二进制文件并将其发送到连接的客户端。 4. Web浏览器连接到服务器,浏览器上运行的Javascript在从服务器接收后显示实时视频。
我是JavaCV和OpenCV的新手。下面的代码段用于使用com.googlecode.javacv.CanvasFrame绘制视频,没有任何问题。但是,我不确定如何将MP4数据作为实时流数据获取。
try {
FrameGrabber grabber = FrameGrabber.createDefault(0);
grabber.setFormat("mp4");;
grabber.setFrameRate(30);
grabber.setImageWidth(640);
grabber.setImageHeight(480);
grabber.start();
double frameRate = grabber.getFrameRate();
long wait = (long) (1000 / (frameRate == 0 ? 10 : frameRate));
ByteBuffer buf = null;
while (true) {
Thread.sleep(wait);
IplImage image = grabber.grab();
if(image != null) {
buf = image.getByteBuffer();
send(buf); // Send video data using web socket.
}
}
} catch (FrameGrabber.Exception ex) {
Logger.getLogger(WSockClient.class.getName()).log(Level.SEVERE, null, ex);
}
以下是Web套接字服务器和Javascript / HTML5客户端的代码。 如果应用程序从本地磁盘读取MP4文件并将其发送到服务器,则这两个代码都可以正常工作。但是像上面这样使用JavaCV的数据似乎无法在浏览器上显示。 服务器只接收数据并将其分发给客户端。我相信似乎没有问题。这是代码。
@OnMessage
public void binaryMessage(ByteBuffer buf, Session client) throws IOException, EncodeException {
for (Session otherSession : peers) {
if (!otherSession.equals(client)) {
otherSession.getAsyncRemote().sendBinary(buf, new StreamHandler());
}
}
}
这是Javascript / HTML5。
<body>
<video controls width="640" height="480" autoplay></video><br>
<canvas id="canvas1" width="640" height="480"></canvas><br>
</body>
<script>
var ws;
var protocol = 'ws';
var host = "localhost:8080";
var url = protocol + "://" + host + "/live/stream";
ws = new WebSocket(url);
ws.binaryType = 'arraybuffer';
ws.addEventListener("open",onOpenWebSocket,false);
ws.addEventListener("close",onCloseWebSocket,false);
ws.addEventListener("message",onMessageWebSocket,false);
window.addEventListener("unload",onUnload,false);
...
function onMessageWebSocket(event){
var blob = new Blob([event.data], {type: 'video/mp4'});
var rb = blob.slice(0, blob.size, 'video/mp4');
video.src = window.URL.createObjectURL(rb);
}
...
</script>
我认为我需要使用JavaCV获取MP4数据作为流,但不知道如何做到这一点。请帮忙。 任何评论,建议将不胜感激。谢谢。