如何使用JavaCV获取MP4实时视频流

时间:2014-01-22 10:26:43

标签: html5 video websocket streaming javacv

我正在尝试创建一个使用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数据作为流,但不知道如何做到这一点。请帮忙。 任何评论,建议将不胜感激。谢谢。

0 个答案:

没有答案