首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >直播( Socket )-如何同步音视频?

直播( Socket )-如何同步音视频?
EN

Stack Overflow用户
提问于 2010-10-29 12:26:00
回答 3查看 7.9K关注 0票数 8

1-哪个更适合用于流媒体视频?TCP或UDP套接字,为什么?

2-在直播时,音频和视频分别来自服务器,那么如何确保我在设备上显示的视频和播放的音频是同步的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-29 12:46:06

我不久前写了一个语音聊天应用程序,TCP是不可能的,如果你正在寻找接近实时的数据流,UDP多播真的是唯一的方法。不过,在UDP上使用流媒体有两个主要问题:

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

Stack Overflow用户

发布于 2010-10-29 12:32:19

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

票数 1
EN

Stack Overflow用户

发布于 2016-02-05 04:21:06

今天甚至通过HTTP的youtube流..。这是一个nodejs应用程序,它可以将文件流式传输到浏览器客户端...以此为起点,实现视频与音频的同步直播

代码语言:javascript
运行
复制
// 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 + "/");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4048965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档