通过Socket.io HTML5video/audio到Nodejs,但扭曲 – FFMPEG

我正在写这个非常简单的“skype克隆”。 我尝试了各种其他语言,python和分层Node.js与meteor,WebRTC,但Node.js + socket.io似乎工作最好,最干净,但我已经达到了路障,我无法得到这一切正常工作。

我有两个问题,1,我想我从HTML5 getUserMedia发送真实的数据,但我可能不会,我不知道如何testing或找出。 我认为使用“video.src = window.URL.createObjectURL(stream);” 使Blobstream成为一个实际的数据stream…但我不知道。

这是我的Broadcast.html这是一个非常简单的getUserMedia抢相机和麦克风…然后我连接到套接字,点击广播button,发射发射'join',并通过'webcamstream'的数据发送。

<video autoplay height="280"></video> <button class="recordbutton" onclick="startBroadcasting();">Broadcast</button> <script language="javascript" type="text/javascript"> var socket = io.connect('http://video.domain.com:3031'); socket.on('connect', function() { $('#conversation').append('Connected <br />'); }); function onVideoFail(e) { console.log('webcam fail!', e); }; function hasGetUserMedia() { return !!(navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia); } if (hasGetUserMedia()) { alert('It is working...'); } else { alert('getUserMedia() is not supported in your browser'); } window.URL = window.URL || window.webkitURL; navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; var video = document.querySelector('video'); var streamRecorder; var webcamstream; if (navigator.getUserMedia) { navigator.getUserMedia({audio: true, video: true}, function(stream) { video.src = window.URL.createObjectURL(stream); webcamstream = stream; }, onVideoFail); } else { alert ('failed'); } function startBroadcasting() { alert('Broadcast Now Clicked'); console.log(webcamstream); socket.emit('join', webcamstream); socket.emit('echo', 'echo1 echo2 echo3 <br />'); } socket.on('echo', function(data) { $('#conversation').append(data); }); 

这是app.js 2.我想在这里做的是从套接字'stream'消耗,但在它的地方我有一个testingvideo,看FFMPEG是否实际工作。 我使用https://github.com/schaermu/node-fluent-ffmpeg 。

当我用myth.mp4文件运行这个testing时,我得到一个out.avi然而它是0字节?

 var express = require('express'); var socket = require('socket.io'); var ffmpeg = require('fluent-ffmpeg'); var fs = require('fs'); var app = express(); app.configure(function(req, res){ app.use(express.static(__dirname + '/')); }); var server = app.listen(3031); var io = socket.listen(server); io.sockets.on('connection', function(socket) { socket.on('join', function(stream) { socket.stream = stream; socket.emit('echo', socket.stream + '<br />'); var proc = new ffmpeg({source:'/srv/www/domain.com/video/red/myth.mp4'}) .withAspect('4:3') .withSize('640x480') .applyAutopadding(true, 'white') .saveToFile('/srv/www/domain.com/video/red/out.avi', function(retcode, error){ socket.emit('echo', 'file has been converted succesfully <br />'); }); }); socket.on('echo', function(data) { socket.emit('echo', data); }); }); 

我在节点上没有发生错误启动,运行没有错误。 我得到一个0字节out.avi文件,每次我运行这个新鲜创build。

我有一个与CentOS / Nginx的linode VPS

node -v v0.10.21

FFMPEG ffmpeg版本1.2版本(c)2000-2013 FFmpeg开发者build立在2013年11月23日17:43:13用gcc 4.4.7(GCC)20120313(Red Hat 4.4.7-3)configuration:–enable-version3 – -enable-libopencore-amrnb –enable-libopencore-amrwb –enable-libvpx –enable-libfaac –enable-libmp3lame –enable-libtheora –enable-libvorbis –enable-libx264 –enable-libvo-aacenc –enable-libxvid –disable-ffplay –enable-shared –enable-gpl –enable-postproc –enable-nonfree –enable-avfilter –enable-pthreads –extra-cflags = -fPIC libavutil 52 18.100 / 52. 18.100 libavcodec 54. 92.100 / 54. 92.100 libavformat 54. 63.104 / 54. 63.104 libavdevice 54. 3.103 / 54. 3.103 libavfilter 3. 42.103 / 3. 42.103 libswscale 2. 2.100 / 2. 2.100 libswresample 0. 17.102 / 0. 17.102 libpostproc 52. 2.100 / 52. 2.100超快速audio和video编码器的使用:ffmpeg [options] [[infile options] -i infile] … {[outfile options] outfile} …

在此先感谢您的帮助。