2010-10-29 70 views

回答

5

前段时间我写了一个语音聊天应用程序,而TCP无法解决问题,如果您正在寻找接近实时的数据流,UDP多播真的是唯一的选择。有有虽然流的东西在UDP上两个主要问题:

  1. 丢包。在音频的情况下,这是一个非常简单的修复。通常丢弃的数据包不会产生可听见的差异(数据包单独解压缩)。然而,在处理视频时,尤其是在视频被压缩(通常是视频)的情况下,找出一个合适的传输协议来确保网络的稳健性是一项艰巨的任务,尤其是如果您是从头开始的话。视频帧被分成不同的数据包。弄清楚这些数据包丢失后该怎么做很难。
  2. 音频和视频之间的同步。这是一个非常棘手的问题,我建议阅读RTSP(实时流协议)等协议。这不是一件容易的事,但是这里有一些介绍性的信息:http://www.cs.columbia.edu/~hgs/rtsp/ - 有时它通过发送单独的同步数据包(某些协议通过TCP发送这些数据包)告诉播放器声音应该如何与视频匹配。
1

我会做UDP。然而这取决于你想要什么。 UDP将丢弃数据包而不是等待(TCP)。权衡是你是否想要一个稳定的,但有时是缓慢和昂贵的,或者是有效的,但有时可能无法交付。当你想要实现它以及你如何使用它时,选择是你的。

0

今天甚至YouTube的流通过HTTP ...这里是一个应用程序的NodeJS哪些流文件浏览器客户端...使用为出发点与音频流媒体直播视频很好地同步

// usage 
// do following on server side (your laptop running nodejs) 
// node this_file.js 
// 
// then once above is running point your browser at 
// http://localhost:8888 
// 
// of course your browser could be on your mobile or own custom app 



var http = require('http'), 
    fs = require('fs'), 
    util = require('util'); 

var path = "/path/to/audio/or/video/file/local/to/server/cool.mp4"; // put any audio or video file here 

var port = 8888; 
var host = "localhost"; 

http.createServer(function (req, res) { 

    var stat = fs.statSync(path); 
    var total = stat.size; 

    if (req.headers.range) { // meaning client (browser) has moved the forward/back slider 
             // which has sent this request back to this server logic ... cool 
    var range = req.headers.range; 
    var parts = range.replace(/bytes=/, "").split("-"); 
    var partialstart = parts[0]; 
    var partialend = parts[1]; 

    var start = parseInt(partialstart, 10); 
    var end = partialend ? parseInt(partialend, 10) : total-1; 
    var chunksize = (end-start)+1; 
    console.log('RANGE: ' + start + ' - ' + end + ' = ' + chunksize); 

    var file = fs.createReadStream(path, {start: start, end: end}); 
    res.writeHead(206, { 'Content-Range': 'bytes ' + start + '-' + end + '/' + total, 'Accept-Ranges': 'bytes', 'Content-Length': chunksize, 'Content-Type': 'video/mp4' }); 
    file.pipe(res); 

    } else { 

    console.log('ALL: ' + total); 
    res.writeHead(200, { 'Content-Length': total, 'Content-Type': 'video/mp4' }); 
    fs.createReadStream(path).pipe(res); 
    } 
}).listen(port, host); 

console.log("Server running at http://" + host + ":" + port + "/");