提高实时多媒体传输效率的三大方法

news2024/11/15 9:42:31

实时多媒体数据传输面临的挑战

实时多媒体数据的传输具有数据量巨大、对时延和时延抖动高度敏感及能容忍丢分组的特点。然而,当今互联网的网络层协议提供的仅是一种“尽最大努力服务”,对分组的端到端时延、时延抖动和分组丢失率等指标不做任何承诺。这对实时多媒体应用的实现提出了巨大的挑战。本文将讨论在应用层如何通过一些技术来克服这些问题,从而提高实时多媒体应用的性能。

1. 音频/视频压缩

音频和视频数据具有信息量巨大的特点,会消耗大量的存储空间和网络带宽,导致很大的传输时延。因此,在网上传送多媒体数据时,无一例外地需要采用各种信息压缩技术。例如:

  • 音频压缩标准:移动通信的GSM(13 kbit/s)、IP电话使用的G.729(8kbit/s)和G.723.1(6.4kbit/s和5.3 kbit/s)。
  • 立体声音乐的压缩技术:接近CD质量的MP3(Mpeg-1 audio layer-3) (128kbit/s或112 kbit/s)。
  • 视频压缩标准:VCD质量的MPEG1(1.5Mbit/s)和DVD质量的MPEG2(3~6Mbit/s)。

举例说明:例如,假设我们要在互联网上传输一段高清电影,如果不进行压缩,电影文件可能会达到数百GB,这对现有的网络带宽和存储设备都是巨大的挑战。通过使用MPEG2压缩,可以将其压缩到数GB,从而大大减少传输时间和存储空间。

2. 时延抖动消除

实时音频/视频源以恒定速率产生并发送分组,因而这些分组是等时(Isochronous)的。但由于端到端的时延抖动,通过互联网到达接收方的分组是非等时的。若接收方直接对这些非等时分组中的数据进行播放,会严重影响播放的质量。

image

解决办法:在接收端设置适当大小的播放缓存,在缓存中的分组达到一定数量后,再以恒定速率按顺序对这些分组的数据进行播放,这就是延迟播放。为了能等时播放流媒体数据,在发送分组时需要给每个分组打上一个时间戳(Timestamp)。通过时间戳,播放器可以准确地知道在什么时间播放哪个分组。

具体实施:例如,假设我们在观看一场在线视频直播,直播内容是以分组的形式发送的。如果某些分组由于网络拥塞而延迟到达,接收端的播放缓存可以确保这些分组在到达后仍能按顺序播放,从而避免播放中断或画面卡顿。

注意:利用缓存消除时延抖动的代价是增大了播放时延。实际应用需要在播放时延和分组丢失率之间进行折中。流式存储音频/视频能够容忍较大的播放时延,但对于实时交互音频/视频,大的播放时延是不可接受的。

image

3. 丢失分组恢复

网络拥塞等会导致分组丢失,数据丢失显然会直接影响多媒体的播放质量。虽然TCP可以有效解决分组丢失问题,但它会导致比UDP大很多的时延抖动,这对于时延敏感的实时交互音频/视频往往是不可接受的。因此,实时多媒体应用倾向于使用以下技术来重建丢失的分组:

  • 前向纠错(Forward Error Correction,FEC) :在原始分组流中添加冗余信息。对于少量的丢失分组,接收方能够用这些冗余信息重建丢失数据。例如,在每发送n个数据块之后,发送一个冗余数据块。这个冗余数据块是前n个数据块的异或。当这n个块中任何一个丢失了,接收方都能够完全重建丢失的块。
    image

举例说明:假设我们在观看一段在线视频,视频数据分为多个分组进行传输。每当发送10个数据块后,系统会发送一个冗余数据块。如果其中一个数据块丢失,接收端可以利用冗余数据块恢复丢失的数据,从而保证视频的连续播放。

  • 数据恢复:利用音频/视频流的短期自相似特性,当少量数据丢失时,接收方可以用收到的相邻数据来估算丢失数据,从而减少丢失数据对音视频播放质量的影响。

例如:最简单的方法就是用丢失分组的前一个分组来代替丢失分组。效果更好但计算量更大的方法是使用内插法,根据丢失分组的前后数据来估计它们之间的数据。

  • 数据交织(Interleaving) :打乱原始媒体流中数据单元的顺序,把原来连续的数据单元分散到不同的分组中,单个分组丢失仅导致重建流中多个小的间隔,而不是一个大的间隔。

    image

具体实施:例如,假设我们有一个视频文件,视频数据按照顺序分为多个分组。通过数据交织技术,这些分组的数据单元会被重新排列,使得即使一个分组丢失,也只会影响视频流中的小部分数据,而不会导致大面积的缺失。

总结

通过合理使用音频/视频压缩技术时延抖动消除技术丢失分组恢复技术,可以显著提高实时多媒体数据传输的效率与质量。这些技术不仅能够降低传输时延和时延抖动,还能在网络拥塞导致分组丢失时有效恢复数据,从而提升用户的体验。

实时运输协议(RTP)

前面已讲到,TCP并不适合传输实时多媒体数据。相比而言,UDP更加适合于实时多媒体通信,但是UDP缺少实时多媒体网络应用所需的序号、时间戳等机制。因此有必要定义一种新的协议,为一些多媒体网络应用提供有用的支持。RTP(实时传输协议,Real-time Transport Protocol)就是这样一个协议。

RTP能够用于传输多种格式的多媒体数据。RTP分组封装在UDP报文中进行传输,在UDP之上为实时多媒体网络应用提供端到端的传输服务。下面介绍RTP首部的主要字段,如图6—29所示。

image

  • 有效载荷类型:有效载荷类型字段(7位)指明音频/视频编码类型。接收方根据该字段把接收到的数据恢复成原始的音频/视频信号。RTP支持多种媒体格式,如PCM、MP3、H.261/H.263、MPEG1/2/4等。
  • 序号:RTP为产生的每一个分组设置一个连续递增的16位序号。接收方可以通过序号检测是否丢失了分组,然后通过数据恢复技术重构丢失的数据,以实现数据播放的连续性。要注意的是,RTP本身并不提供修复数据的任何措施,而只是把数据丢失的信息提供给媒体应用,并由应用来决定如何处理。
  • 时间戳:时间戳字段(32位)反映了RTP有效载荷中的第一个字节的采样时刻。接收方使用时间戳来消除网络中引入的分组时延抖动,使接收方能够以恒定速率播放媒体。时间戳还可用于视频应用中声音和图像的同步。
  • 同步源标识符:32位的同步源(Synchronous Source,SSRC)标识符用来标识RTP流的来源。SSRC标识符 与IP地址无关,在新的RTP流开始时随机产生。由于RTP使用UDP传送,因此可以有多个RTP流(例如,使用几个摄像机从不同角度拍摄同一节目所产生的多个RTP流)复用到一个UDP用户数据报中。接收端可以根据SSRC标识符将收到的RTP流送到各自的终点。若随机产生的SSRC标识符恰好已分配给了其他RTP流,则重新选择另一个SSRC标识符。

流式存储音频/视频

为了帮助读者理解流式存储音频/视频的工作原理,下面我们从简单使用万维网服务器的先下载再播放方式开始,逐步进行改进,来实现流式存储音频/视频。

1. 从万维网服务器下载后播放

压缩的音频/视频文件像其他文件一样存储在万维网服务器上,用户浏览器使用HTTP的GET请求报文从服务器下载要播放的音频/视频文件。万维网服务器通过响应报文把文件发送到用户浏览器,然后浏览器借助于媒体播放器(Media Player)播放该文件,如图6—30所示。

image

这种方法很简单,但不是“流式”,必须把整个文件下载下来才能播放。压缩后的音频/视频文件仍然非常大,音频文件可能有几十到几百兆字节,而视频文件往往超过几百兆字节。用户在文件播放之前需要等待几分钟甚至几小时。

2. 使用媒体服务器边下载边播放

为了实现边下载边播放,可以把实际的音频/视频文件存储在另一个媒体服务器(Media Server)上。万维网服务器中只存储一个元文件(Metafile)。元文件是一个描述音频/视频文件相关信息的小文件。浏览器使用HTTP从万维网服务器下载要播放的音频/视频文件的元文件,然后媒体播放器根据元文件提供的音频/视频文件的URL和格式信息直接与媒体服务器建立连接,在下载音频/视频文件的同时进行播放。

image

具体实施步骤

  1. 万维网浏览器使用GET报文连接万维网服务器,请求下载音频/视频文件。万维网服务器响应关于元文件的信息(如音频/视频文件的URL等)。
  2. 万维网浏览器把元文件传递给媒体播放器。
  3. 媒体播放器发送SETUP报文与媒体服务器建立连接,媒体服务器给出响应。
  4. 媒体播放器发送PLAY报文并开始播放(下载)。
  5. 从媒体服务器下载音频/视频文件。
  6. 媒体播放器发送PAUSE报文控制流媒体数据的传送。

请注意,万维网浏览器和万维网服务器之间的交互使用的是HTTP。但媒体播放器和媒体服务器之间控制命令的交互使用的是实时流协议(Real-Time Streaming Protocol,RTSP)。RTSP是一种带外控制协议,仅用来控制流媒体数据的传送,但其本身并不直接传送流媒体数据。借助于RTSP,用户在播放流媒体时,就能像在影碟机上那样控制播放,如暂停/继续、快退、快进等。

总结

通过上述方法和技术,实时多媒体应用可以在当前互联网环境下实现更高的传输效率和更好的用户体验。希望本文对基础小白读者们有所帮助,让您对实时多媒体数据传输中的挑战及解决方法有一个初步的了解。如果您有更多的建议或问题,欢迎在评论区留言。

图文来源:《计算机网络教程》第六版微课版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL的延迟复制

目录 1 MySQL 延迟复制介绍 1.1 延迟复制语法: 1.2 延迟复制可用于多种用途: 1.3 延迟复制的有关的参数 1.4 延迟复制的操作 2 MySQL 延迟复制 实操 2.1 实验环境 2.2 对 SLAVE --MySQL-3 进行延迟复制操作 2.3 停止相关进程的原因 2.4 实验测试 2.5 动…

Variomes:支持基因组变异筛选的高召回率搜索引擎

《Bioinformatics》2022 Variomes: https://candy.hesge.ch/Variomes Source code: https://github.com/variomes/sibtm-variomes SynVar: https://goldorak.hesge.ch/synvar 文章摘要(Abstract) 动机(Mot…

读软件开发安全之道:概念、设计与实施07密码学(上)

1. 加密工具 1.1. 加密工具之所以没有得到充分使用,就是因为人们往往认为密码学是一个准入门槛极高的专业领域 1.2. 如今的加密学大部分都源自纯数学,所以只要能够正确使用,加密学确实行之有效 1.2.1. 不代表这些算法本身确实无法破解&…

机器学习 | 基于wine数据集的KMeans聚类和PCA降维案例

KMeans聚类:K均值聚类是一种无监督的学习算法,它试图根据数据的相似性对数据进行聚类。无监督学习意味着不需要预测结果,算法只是试图在数据中找到模式。在k均值聚类中,我们指定希望将数据分组到的聚类数。该算法将每个观察随机分…

四大消息队列:Kafka、ActiveMQ、RabbitMQ、RocketMQ对比

四大消息队列:Kafka、ActiveMQ、RabbitMQ、RocketMQ对比 1. 社区活跃度2. 持久化消息3. 技术实现4. 高并发性能5. RabbitMQ与Kafka对比 💖The Begin💖点点关注,收藏不迷路💖 在软件开发中,消息队列&#xf…

【Redis】Redis数据结构——Hash 哈希

哈希 命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloat命令小结 内部编码使用场景缓存⽅式对⽐ ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中&#…

Python furl库:一键搞定复杂URL操作

更多Python学习内容:ipengtao.com 在Web开发和数据处理的过程中,URL的解析、修改和构建是不可避免的操作。然而,直接操作URL字符串不仅繁琐,而且容易出错。Python的furl库提供了一种简单且强大的方法来处理URL,使得URL…

简易的 Websocket + 心跳机制 + 尝试重连

文章目录 演示大纲基础 WebSocket前端: 添加心跳机制前端: 尝试重新连接历史代码 还没有写完,bug 是有的,我在想解决办法了… 演示 大纲 基础的 webSocket 连接前后端:添加心跳机制后端无心跳反应,前端尝试重新连接设置重新连接…

Java 日常反常识踩坑

作者:若渝 本文主要是日常业务开发中自身碰到过跟常识不一致的坑,问题虽然基础,但却可能造成比较大的线上问题。 一、转 BigDecimal 类型时精度丢失 public class Test { public static void main(String[] args) { BigDecimal bi…

算法-分隔链表

一、题目描述 (一) 题目 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。 (二) 示例 示例 1: 输入:…

用Python实现9大回归算法详解——07. 支持向量机回归算法

1. 支持向量机回归的基本概念 支持向量机回归(Support Vector Regression, SVR)是支持向量机(SVM)的一个应用,主要用于回归任务。与分类任务中的 SVM 类似,SVR 通过找到一个最大化边界(即支持向…

[WUSTCTF2020]spaceclub

上sublime txt 每一行的长短对应一个二进制位,长空格是1,短空格是0,全部替换掉得到 上python脚本 import binasciiwith open(attachment_5.txt, r) as file:lines file.readlines() # 逐行读取文本内容output # 初始化输出字符串# 遍历…

vscode 写了未定义的方法不报错,配置全局ESLint

最近接触了一个旧的vue2的项目,里面没有ts和eslint配置 在正在维护的页面里复制了其他页面的一个方法,方法里面包含lodash的cloneDeep,cloneDeep在这个页面并没有引入,但是vscode却没有提示,很不友好,容易…

JUC阻塞队列(五):SynchronousQueue

1、SynchronousQueue介绍 SynchronousQueue与前边的其他几个阻塞队列的差异是挺大的,在一般逻辑中队列是一个用 来存储数据的中间容器(前边几个阻塞队列也是用来存放数据的),但SynchronousQueue 却不是用来存放数据的,…

自动控制——用描述函数法分析非线性系统的稳定性与自激振荡

用描述函数法分析非线性系统的稳定性与自激振荡 引言 在控制系统中,非线性系统的稳定性和自激振荡(self-oscillation)问题往往较线性系统更为复杂。为了分析这些问题,描述函数法(Describing Function Method&#xf…

QtWebEngineView加载本地网页

直接加载放在exe同级目录下的资源是不行的,需要把资源通过qrc放到exe里面,然后通过类似qrc:/robotHtml/index.html这样的路径加载才行。 mWebView new QWebEngineView(parent);// mWebView->load(QUrl::fromLocalFile("./robotHtml/index.html&…

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图,我这边选择高德地图,层级选择0-15级别即可,进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…

联想LJ2405打印机清零方法

联想LJ2405D_LJ2455D_LJ2605D硒鼓清零方法 在设备待机状态下,打开前盖,然后按住开始键不松手,直到所有指示灯全部亮起后再松开手,然后将硒鼓取出再装回,盖上前盖,清零操作完成。 联想LJ2405打印机碳粉清零…

编程学习之路:如何克服挫折感,成为更好的自己

目录 编程学习之路:如何克服挫折感,成为更好的自己 一、小瓜有话说 1、学习的广度可以带动深度 2、清空大脑和清空代码都是解决问题的方式 ①清空大脑:睡个觉,拉个屎,吃顿饭。 ②清空代码:换一种思维…

花钱买不到系列-深刻理解进程地址空间

花钱买不到系列—linux虚拟地址空间-CSDN博客https://blog.csdn.net/weixin_49529507/article/details/141272458?spm1001.2014.3001.5501 在上一篇文章中,引出了虚拟地址这块,也用大富翁给儿子们画饼的例子解释,通过大富翁的例子&…