精华内容
下载资源
问答
  • FLV流媒体格式

    千次阅读 2012-10-16 14:41:24
    FLV 是FLASH VIDEO的简称,FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件...

    FLV 是FLASH VIDEO的简称,FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点

     

    基本简介

    在线视频

      英文名:Flash Video

      FLV视频格式的定义

      目前许多在线视频网站都采用此视频格式。如搜狐视频新浪播客六间房56优酷酷6土豆youtube等。FLV已经成为当前视频文件的主流格式

      

    视频分享传播

      FLV是目前被众多新一代视频分享网站所采用,是目前增长最快、最为广泛的视频传播格式。是在sorenson公司的压缩算法的基础上开发出来的。FLV格式不仅可以轻松的导入Flash中,速度极快,并且能起到保护版权的作用,并且可以不通过本地的微软或者REAL播放器播放视频。

    FLV视频格式

    普及

      网络宽带的普及使中国网民数量跃升至全球第一,同时也造就了众多的网络神话,GOOGLE斥巨资收购YouTube,似乎将国内外本身已经够火的Web2.0视频网站被广泛关注。而流行的风潮似乎又是第一时间刮到了国内,在这个充分发挥自我个性的年代,视频、播客等网站在国内如雨后春笋般兴起,新的网络战役一触即发,这对于FLV视频格式的普及无疑是一个巨大的推动力。

      FLV(Flash Video)流媒体格式是随着Flash MX的推出而发展而来的一种新兴的视频格式。FLV文件体积小巧,清晰的FLV视频1分钟在1MB左右,一部电影在100MB左右,是普通视频文件体积的1/3。再加上CPU占有率低、视频质量良好等特点使其在网络上盛行,目前网上的几家著名视频共享网站均采用FLV格式文件提供视频,就充分证明了这一点。

      

    优势

      FLV作为一种新兴的网络视频格式,能得到众多的网站支持并非偶然。除了FLV视频格式本身占有率低、视频质量良好、体积小等特点适合目前网络发展外,丰富、多样的资源也是FLV视频格式统一在线播放视频格式的一个重要因素。现在,从最新的变形金刚到越狱再到各项体育节目,甚至于网友制作的自拍视频等都可以在网络中轻而易举的找到。

      目前在互联网上提供FLV视频的有两类网站,一种是专门的视频分享网站如美国的YouTube网站、国内的六间房土豆网等。另一种是门户网站提供了视频播客的板块,提供了自己的视频频道,如新浪视频播客等,也是使用FLV格式的视频。此外,百度最近也推出了关于视频搜索的功能,里面搜索出来的视频基本都是采用了流行的FLV格式

      

    使用

      Web 2.0时代,要说什么类型网站最火,自然是以国外的Youtube,国内的优酷土豆网、UUME为代表的视频分享网站了。这类网站提供的视频内容可谓各有千秋,但它们无一例外的都使用了Flash作为视频播放载体,支撑这些视频网站的技术基础就是——Flash 视频(FLV) 。

      FLV 是一种全新的流媒体视频格式,它利用了网页上广泛使用的Flash Player 平台,将视频整合到Flash 动画中。也就是说,网站的访问者只要能看Flash动画,自然也能看FLV 格式视频,而无需再额外安装其它视频插件,FLV视频的使用给视频传播带来了极大便利。

      看了上面这些,相信大家也跃跃欲试了吧,下面我们就来讲讲如何在网页中使用FLV 视频。

      从Flash MX 2004开始,软件就提供了FLV 格式支持,不过笔者建议大家使用目前最新版本的Flash 8(目前最新的版本是Flash CS5了),这个版本的Flash中有一个独立的FLV转换工具:Flash 8 Video Encoder。点击系统菜单“程序”→“Macromedia”→“Macromedia Flash 8 Video Encoder”进入。

      进入程序后,可以看到软件界面非常简单。实际上使用这一工具转换普通视频为FLV视频很容易,只需几步即可完成。

      点击“增加”按纽,软件自动调用系统“打开”对话,选择需要导入的视频即可。Flash 8 Video Encoder支持转换的视频格式相当广泛,如:AVIWMVMPEGASFMOV等常见视频格式。视频添加进队列后,如果你不需要做特殊修改,那么点击“开始队列”按纽,程序即开始视频转换。软件转换视频的速度,笔者总的感觉还是较快,当然这与原始视频大小及设置的视频数据速率有关。整个转换过程,主窗口下方都有信息提示,并且还能看到实时的进度预览。转换结束后,在转换视频同一文件夹下,我们就能得到一个同名的FLV文件。

      当然,上述这些只是按照默认设置进行转换的情况,实际情况下,我们对于视频转换的控制还可以很多,点击主窗口“设置”按纽进入高级设置对话框。

      在视频编码设置对话框中,最显著的就是FLV视频品质设置,默认是“Flash 8 - 中等品质(400kbps)”,软件内置7种不同的编码设置组合。我们也可以选择自定义设置,点击“显示高级设置”按纽,软件将显示自定义的设置界面。

      软件提供了两种视频解码器供选择:On2 VP6(用于Flash Player 8,支持Alpha 通道)、Sorenson Spark(用于Flash Player 7,适用于低配置用户);“调整视频大小”也颇有用,我们很容易生成制定尺寸的动画;如果你只重视视频效果,那么你还可以对“音频编码”开刀,将默认编码数率设置低些,那么输出的文件还会更小巧。高级设置中的选择还很多,它甚至还提供了简单的视频编辑功能,点击“裁切和修剪”标签。

      裁切使用很简单,软件提供了四个方向的控制,输入数值以裁切视频,或者点击“三角”按纽显示控制滑块,拖动滑块直观地调整视频尺寸,视频预览区会实时用虚线勾画裁切范围。

      修剪的使用也不复杂,在视频预览区下方可以看到一个蓝色的视频进度指示条,拖动上方的“倒三角”按纽定位视频播放进度。进度指示条下方有两个按纽,它们就是“开始点”和“结束点”定位按纽,分别拖动按纽到所需位置,即完成简单的视频修剪。

      得到了FLV文件,其实我们并不能直接在网页中使用,我们还需要将它嫁接到Flash动画中去。如同大家在各种视频网站中看到的一样,我们创建的Flash视频并不是简单播放就算了,它也是带播放控制的。

      运行Flash 8,创建新的Flash 文档,点击菜单“文件”→“导入”→“导入视频”,进入“导入视频”对话框。

      可以看到,选择视频时会有两种不同的选择:“在您的计算机上”、“已经部署到”,这两者是有区别的,不过目前我们仅需在本地测试动画,选择“在您的计算机上”。点击“浏览”按纽,通过系统打开对话框,载入我们刚生成的FLV文件,点击“下一个”按纽继续。

      接下来选择“部署方式”为:“从Web 服务器渐进式下载”,进入“外观”选项。

      Flash 8目前已经为播放FLV视频内置了数十个播放控制器,它们的外观各异,控制选项也有区别,你可以根据自己的需要,选择一个合适的播放控制器,最后点击“完成”按纽结束。

      返回Flash 8主窗口工作区,可以看到我们刚插入的视频已经布置到位了,此时你可以直接按Ctrl+Enter测试动画了。

      

     

    可以提供多种不同方式

    本地flv文件

      作为一个独立的FLV文件。虽然Flash视频文件通常是交付使用的Flash Player的控制, FLV文件本身是全功能对自己的和可以发挥的或转换为其他格式,由本地存储如硬盘或CD上。[引文需要]

      

    嵌入式swf

      在一个嵌入式的SWF文件使用Flash创作工具(支持在Flash Player 6和更高版本)。整个档案必须在移交之后,才可以开始播放。改变影片需要重建的SWF文件。

      

    逐步下载

      逐步通过HTTP下载(支持在Flash Player 7和更高版本)。此方法使用的ActionScript ,包括一外部托管的Flash视频文件的客户端播放。渐进式下载有几个优势,包括缓冲,使用通用的HTTP服务器,并有能力再用一个单一的SWF Player的多重闪光视频源。Flash Player 8中包括支持随机存取内部的视频文件使用部分下载功能的HTTP ,有时这是被称为流。不过,不同的流使用rtmp ,HTTP的“分流” ,不支持实时广播。流通过HTTP需要自订播放器和注射液的具体Flash视频中继载有确切的出发位置在字节时间码的每一个关键帧。使用此特定的信息,自定义的Flash视频播放器,可要求任何部分的Flash视频文件,开始在指定的关键帧。举例来说,Google视频和YouTube支持渐进式下载并可以寻求任何部分的视频前缓冲完成。服务器端的一部分,这个“ HTTP的伪分流”的方法是相当简单的执行,例如在PHP中,作为Apache的httpd模块,或1 lighttpd模块。丰富的媒体项目提供球员和Flash组件兼容的“HTTP伪分流”的方法。

      

    rtmp方式

      流通过rtmp到Flash Player的使用Flash媒体服务器(以前称为闪光通信服务器),风险投资, electroserver , wowza Pro或开放原始码red5服务器。截至2008年4月,有4个流录音机,供本议定书,重新编码screencast软件排除在外。

    FLV播放器的生成

    简介

      FLV的播放器是一个类型的媒体播放器是用来播放Flash视频从PC ,以及从互联网网站。一般的FLV播放器,可以单独使用,而不需要使用Adobe Flash创作或发展工具。

      有几个视频播放器作出的具体发挥的FLV文件,其中包括:

      Web的解剖学的FLV播放器(网络)

      系列JW的FLV播放器(网络)

      丰富的媒体项目的FLV播放器(网络)

      applian的FLV播放器桌面

      马亭devisser的的FLV播放器(桌面)

      sonettic电影院的FLV播放器(网络)

      wimpy桌面的FLV播放器(桌面)

      flowplayer嵌入视频播放器(网络)

      操作系统的FLV -开放源代码,嵌入的F LV播放器(网络)

      moyea桌面的Flash Player (桌面)

      nflv播放器-能发挥u nrewindable/ u nforwardable。F LV的影片(桌面)

      瑞士法郎&的FLV播放器(在Mac OS - x )的(桌面)

      videolan -v lc媒体播放器(桌面)

      其他媒体播放器的基础上, ffmpeg图书馆应能发挥回的Flash Video格式的视频[ 3 ] 。上市下面是一些例子,媒体播放器,支持Flash视频格式:

      

    生成

      通过动画预览,我们可以发现,目前默认的Flash动画尺寸比播放器宽了不少,我们需要重新设置一下。鼠标在工作区中选择“播放器控件”,调用“属性”面板(Ctrl+F3),修改X、Y轴值为“0.0”,这样我们就将“播放器控件”这个元件定位到了工作区的左上方顶点处。点击菜单“修改”→“文档”,进入“文档属性”对话框,选择“匹配”值为“内容”,点击“确定”返回,现在Flash文档的尺寸就与播放器一致了。

      如果大家制作的FLV视频动画只打算在本地计算中播放,那么就直接输出SWF文件即可,如果是准备在网络中调用,那么还需要做一些事情。

      先上传自己制作的FLV文件到网络服务器,获得文件远程网络地址:如:http: //www.scxp.net/01.flv。接下来,选择工作区中的“播放器控件”,调用“参数”面板,找到“contentPath”字段,修改它的值为“http://www.scxp.net/01.flv”(原始值就是最开始大家设置的本地FLV文件路径)。

      点击菜单“文件”→“导出”→“导出影片”,例:设置导出影片地址为“D:/”,文件名为“01.swf”。接下来,设置播放器版本为“Flash Player 8”,ActionScript版本为“ActionScript 2.0”,点击“确定”完成。

      进入“D:/”,可以看到,除了刚生成的“01.swf”文件外,还多了个 “SteelOverPlaySeekMute.swf”文件,它也是调用Flash视频必须的文件,现在将这两个文件也上传到你的服务器中即可。以后你在网上任何地方需要调用Flash视频时,只需要插入服务器上的那个“01.swf”动画的网络地址即可。

      注:设置Flash动画调用的FLV文件为网上远程路径后,本地预览“01.swf”文件会有安全警告,这是正常的情况,大家不必担心。

      另外,目前很多的具有视频功能的MP3也支持flv格式

      

    FLV-Adobe公司媒体播放器

      chameleo gom播放器

      MPlayer的(使用ffmpeg )

      使用RealPlayer

      vlc媒体播放器

      xine (用途ffmpeg )

      任何播放器,可以使用ffdshow (基于ffmpeg )DirectShow的编解码器:

      媒体播放器的经典

      Winamp中

      Windows Media Player中

      变焦播放器

      任何播放器使用的QuickTime ,安装后的FLV的组成部分

    FLV视频文件的下载

      在线观看的flv视频文件基本都不提供下载,如果想把它下载下来,也很简单,在此介绍两种方法:

      

    temp文件下载

      第一种(比较麻烦),该方法对多数视频适用。

      首先,正常观看视频,不要关闭浏览器其次,等视频加载完毕,进入C:\Documents and Settings\你的用户名\Local Settings\Temporary Internet Files

      (这只是默认位置,若无法访问请打开“Internet选项”(IE中菜单栏内“工具”-->“Internet选项”)单击“浏览历史记录”中“设置”,“查看文件”(不同版本IE操作可能有所区别))

      这个文件夹(有可能要用到文件夹选项中的“显示全部文件”才可看见),然后,查找扩展名为flv的文件即可,可以按时间排序,很容易找到。也可以按大小,视频文件一般都比较大,排在顶部本方法适合任何flv视频网站

      

    专业下载工具

      还有一种(推荐, 非常轻松地下载)可借助flv视频下载软件,例如:现在流行的有狂雷视频下载、维棠下载等,都是比较成熟的软件,可提供播放、下载、转换等功能。狂雷界面简单易用,知名度高,其本身是一个flv资源平台,提供的flv资源自然丰富,狂雷视频下载像迅雷一样,功能丰富,而且下载速度是同类所有下载软件中最快的,支持优酷分段视频的自动合并,还具有强大的视频转换功能,可根据手机型号来转换FLV视频到您手机支持的视频格式维棠像FLASHGET一样,操作比较复杂,只有下载,没有搜索功能。还有像其他的flv小软件,比如xmlbar之类的,不过功能有点简单,易操作性一般。

      另外还可以通过flvcd网站在线解析视频地址,直接浏览器另存为下载,无需安装插件.

      相信flv下载软件伴随着flv的发展共同进步!~

    利用flash MX 制作 flash video

      FLV流媒体格式是一种新的视频格式,全称为Flash Video。Flash MX 2004对其提供了完美的支持,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点。下面我们就来介绍一下如何使用小巧的FLV流媒体文件。

      

    建立FLV流媒体格式文件

      首先,打开Flash MX 2004,新建一个Flash文档。将准备好的AVI格式的视频文件导入到库中。导入过程会出现向导提示,总共分2步,分别是“编辑”和“编码”的处理。

      按照默认值进行处理,我们选择“导入整个视频”,单击“下一步”按钮然后“结束”完成导入过程。按下“Ctrl+L”组合键打开库,双击刚刚导入的AVI文件图标,打开“嵌入视频属性”界面。

      单击“导出”生成FLV格式文件。

      通过以上操作我们成功地将视频AVI格式转换成为了FLV格式。这其中发生了什么变化呢?在默认参数的转化下。使23MB的AVI文件变成了541KB的FLV文件。让一个大块头“瘦”下来,这就可以轻松的放到网络中使用了。

      

    使用FLV流媒体文件

      新建一个Flash文档,按下“Ctrl+F7”组合键打开组件窗口,将Media Componets中的MediaPlayback组件拖入场景中。

      用鼠标选中刚拖入的MediaPlayback组件,按下“Alt+F7”组合键打开“组件检查器”界面。组件检查器中的参数含义如下:定义了播放文件的类型为FLV,也可以播放MP3文件;URL中需要指定FLV文 件的路径,因为我们将FLV文件和Flash文件放在了同一目录中,所以这里只要指定文件名就可以了;Automatically Play为自动播放;Control Placement和Control Visibility分别为播放面板的位置和是否可见。

      设置完成后,我们可以通过按下“Ctrl+Enter”组合键测试效果。视频图像和声音让你耳目一新!

      这样一个FLV格式流媒体播放器就完成了。别看它制作简单,但功能还算齐全,特别是它提供了下载进度的显示,可以一边下载一边播放。这样我们的网站再也不用愁那些“大块头”的视频文件怎么放上去了。Flash MX 2004支持很多视频格式转化为FLV,自己动手做做,你会发现很多新技巧。不断的探索,你会成长的很快!

    FLV文件结构解析

      FLV是一个二进制文件,由文件头(FLV header)和很多tag组成。tag又可以分成三类:audio,video,script,分别代表音频流视频流,脚本流(关键字或者文件信息之类)。

      

    FLV Header

      一般比较简单,包括文件类型之类的全局信息

      文件类型3bytes 总是FLV(0x46 0x4C 0x56),否则。..

      版本1byte 一般是0x01,表示FLV version 1

      流信息1byte 倒数第一bit是1表示有视频,倒数第三bit是1表示有音频,其他都应该是0(有些软件如flvtool2可能造成倒数第四bit是1,不过也没发现有什么不对)

      header长度4bytes 整个文件头的长度,一般是9(3+1+1+4),有时候后面还有些别的信息,就不是9了

      

    FLV Body

      FLV body就是由很多tag组成的,一个tag包括下列信息:

      previoustagsize 4bytes 前一个tag的长度,第一个tag就是0

      tag类型1byte

      三类:

      * 8 -- 音频tag

      * 9 -- 视频tag

      * 18 -- 脚本tag

      数据区长度3bytes 时间戳3bytes 单位毫秒,如果是脚本tag就是0

      扩展时间戳1byte 作为时间戳的高位

      streamsID 3bytes 总是0(不知道干啥用)

      数据区

      根据不同的tag类型就有不同的数据区

      Audio tag 数据区

      audio信息1byte 前四位bits表示音频格式:

      * 0 -- 未压缩

      * 1 -- ADPCM

      * 2 -- MP3

      * 5 -- Nellymoser 8kHz momo

      * 6 -- Nellymoser

      下面两位bits表示samplerate:

      * 0 -- 5.5kHz

      * 1 -- 11kHz

      * 2 -- 22kHz

      * 3 -- 44kHz

      下面一位bit表示每个采样的长度:

      * 0 -- snd8Bit

      * 1 -- snd16Bit

      下面一位bit表示类型:

      * 0 -- sndMomo

      * 1 -- sndStereo

      audio数据区

      不定

      video tag 数据区

      video信息1byte

      前四位bits表示类型:

      * 1 -- keyframe

      * 2 -- inner frame

      * 3 -- disposable inner frame (H.263 only)

      后四位bits表示编码器id:

      * 2 -- Seronson H.263

      * 3 -- Screen video

      * 4 -- On2 VP6

      * 5 -- On2 VP6 without channel

      * 6 -- Screen video version 2

      video数据区

      不定

      script tag 数据区

      略n字。..

      

      

     

    展开全文
  • 如果你拿到了一个流媒体文件的下载地址,想实现在线播放,但又懒得自己写播放器,你可以通过如下方法调用本地应用来进行播放: [java] view plaincopy Intent it = new Intent();  ...

    如果你拿到了一个流媒体文件的下载地址,想实现在线播放,但又懒得自己写播放器,你可以通过如下方法调用本地应用来进行播放:

    [java] view plaincopy
    1. Intent it = new Intent();  
    2. it.setAction(Intent.ACTION_VIEW);  
    3. it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    4. Uri uri = Uri.parse(url);//此url就是流媒体文件的下载地址  
    5. it.setDataAndType(uri, type);//type的值是 "video/*"或者 "audio/*"  
    6. startActivity(it);  

    什么是流媒体文件呢?

    俗话说,就是音频文件和视频文件。 android支持下列格式的流媒体:

    if (end.equals("avi") || end.equals("mp4") || end.equals("mov")
    || end.equals("flv") || end.equals("3gp") || end.equals("m4v")
    || end.equals("wmv") || end.equals("rm") || end.equals("rmvb")
    || end.equals("mkv") || end.equals("ts") || end.equals("webm")) {
    // video
    type = "video/*";
    } else if (end.equals("mid") || end.equals("midi") || end.equals("mp3")
    || end.equals("wav") || end.equals("wma") || end.equals("amr")
    || end.equals("ogg") || end.equals("m4a")) {
    // audio
    type = "audio/*";

    展开全文
  • 流媒体

    千次阅读 2012-06-27 16:49:23
    流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒体文件时,基本上只有下载...

    流媒体简介

    随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒体文件时,基本上只有下载和流式传输两种选择。通常说来,A/V文件占据的存储空间都比较大,在带宽受限的网络环境中下载可能要耗费数分钟甚至数小时,所以这种处理方法的延迟很大。如果换用流式传输的话,声音、影像、动画等多媒体文件将由专门的流媒体服务器负责向用户连续、实时地发送,这样用户可以不必等到整个文件全部下载完毕,而只需要经过几秒钟的启动延时就可以了,当这些多媒体数据在客户机上播放时,文件的剩余部分将继续从流媒体服务器下载。

    流(Streaming)是近年在Internet上出现的新概念,其定义非常广泛,主要是指通过网络传输多媒体数据的技术总称。流媒体包含广义和狭义两种内涵:广义上的流媒体指的是使音频和视频形成稳定和连续的传输流和回放流的一系列技术、方法和协议的总称,即流媒体技术;狭义上的流媒体是相对于传统的下载-回放方式而言的,指的是一种从Internet上获取音频和视频等多媒体数据的新方法,它能够支持多媒体数据流的实时传输和实时播放。通过运用流媒体技术,服务器能够向客户机发送稳定和连续的多媒体数据流,客户机在接收数据的同时以一个稳定的速率回放,而不用等数据全部下载完之后再进行回放。

    由于受网络带宽、计算机处理能力和协议规范等方面的限制,要想从Internet上下载大量的音频和视频数据,无论从下载时间和存储空间上来讲都是不太现实的,而流媒体技术的出现则很好地解决了这一难题。目前实现流媒体传输主要有两种方法:顺序流(progressive streaming)传输和实时流(realtime streaming)传输,它们分别适合于不同的应用场合。

    顺序流传输

    顺序流传输采用顺序下载的方式进行传输,在下载的同时用户可以在线回放多媒体数据,但给定时刻只能观看已经下载的部分,不能跳到尚未下载的部分,也不能在传输期间根据网络状况对下载速度进行调整。由于标准的HTTP服务器就可以发送这种形式的流媒体,而不需要其他特殊协议的支持,因此也常常被称作HTTP流式传输。顺序流式传输比较适合于高质量的多媒体片段,如片头、片尾或者广告等。

    实时流传输

    实时流式传输保证媒体信号带宽能够与当前网络状况相匹配,从而使得流媒体数据总是被实时地传送,因此特别适合于现场事件。实时流传输支持随机访问,即用户可以通过快进或者后退操作来观看前面或者后面的内容。从理论上讲,实时流媒体一经播放就不会停顿,但事实上仍有可能发生周期性的暂停现象,尤其是在网络状况恶化时更是如此。与顺序流传输不同的是,实时流传输需要用到特定的流媒体服务器,而且还需要特定网络协议的支持。

    二、流媒体协议

    实时传输协议(Real-time Transport Protocol,PRT)是在Internet上处理多媒体数据流的一种网络协议,利用它能够在一对一(unicast,单播)或者一对多(multicast,多播)的网络环境中实现传流媒体数据的实时传输。RTP通常使用UDP来进行多媒体数据的传输,但如果需要的话可以使用TCP或者ATM等其它协议,整个RTP协议由两个密切相关的部分组成:RTP数据协议和RTP控制协议。实时流协议(Real Time Streaming Protocol,RTSP)最早由Real Networks和Netscape公司共同提出,它位于RTP和RTCP之上,其目的是希望通过IP网络有效地传输多媒体数据。

    2.1 RTP数据协议

    RTP数据协议负责对流媒体数据进行封包并实现媒体流的实时传输,每一个RTP数据报都由头部(Header)和负载(Payload)两个部分组成,其中头部前12个字节的含义是固定的,而负载则可以是音频或者视频数据。RTP数据报的头部格式如图1所示:


    图1 RTP头部格式
     

    其中比较重要的几个域及其意义如下: 

    • CSRC记数(CC)  表示CSRC标识的数目。CSRC标识紧跟在RTP固定头部之后,用来表示RTP数据报的来源,RTP协议允许在同一个会话中存在多个数据源,它们可以通过RTP混合器合并为一个数据源。例如,可以产生一个CSRC列表来表示一个电话会议,该会议通过一个RTP混合器将所有讲话者的语音数据组合为一个RTP数据源。
    • 负载类型(PT)  标明RTP负载的格式,包括所采用的编码算法、采样频率、承载通道等。例如,类型2表明该RTP数据包中承载的是用ITU G.721算法编码的语音数据,采样频率为8000Hz,并且采用单声道。
    • 序列号  用来为接收方提供探测数据丢失的方法,但如何处理丢失的数据则是应用程序自己的事情,RTP协议本身并不负责数据的重传。
    • 时间戳  记录了负载中第一个字节的采样时间,接收方能够时间戳能够确定数据的到达是否受到了延迟抖动的影响,但具体如何来补偿延迟抖动则是应用程序自己的事情。

    从RTP数据报的格式不难看出,它包含了传输媒体的类型、格式、序列号、时间戳以及是否有附加数据等信息,这些都为实时的流媒体传输提供了相应的基础。RTP协议的目的是提供实时数据(如交互式的音频和视频)的端到端传输服务,因此在RTP中没有连接的概念,它可以建立在底层的面向连接或面向非连接的传输协议之上;RTP也不依赖于特别的网络地址格式,而仅仅只需要底层传输协议支持组帧(Framing)和分段(Segmentation)就足够了;另外RTP本身还不提供任何可靠性机制,这些都要由传输协议或者应用程序自己来保证。在典型的应用场合下,RTP一般是在传输协议之上作为应用程序的一部分加以实现的,如图2所示:


    图2 RTP与各种网络协议的关系
     

    2.2 RTCP控制协议

    RTCP控制协议需要与RTP数据协议一起配合使用,当应用程序启动一个RTP会话时将同时占用两个端口,分别供RTP和RTCP使用。RTP本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完成。通常RTCP会采用与RTP相同的分发机制,向会话中的所有成员周期性地发送控制信息,应用程序通过接收这些数据,从中获取会话参与者的相关资料,以及网络状况、分组丢失概率等反馈信息,从而能够对服务质量进行控制或者对网络状况进行诊断。

    RTCP协议的功能是通过不同的RTCP数据报来实现的,主要有如下几种类型: 

    • SR  发送端报告,所谓发送端是指发出RTP数据报的应用程序或者终端,发送端同时也可以是接收端。
    • RR  接收端报告,所谓接收端是指仅接收但不发送RTP数据报的应用程序或者终端。
    • SDES  源描述,主要功能是作为会话成员有关标识信息的载体,如用户名、邮件地址、电话号码等,此外还具有向会话成员传达会话控制信息的功能。
    • BYE  通知离开,主要功能是指示某一个或者几个源不再有效,即通知会话中的其他成员自己将退出会话。
    • APP  由应用程序自己定义,解决了RTCP的扩展性问题,并且为协议的实现者提供了很大的灵活性。

    RTCP数据报携带有服务质量监控的必要信息,能够对服务质量进行动态的调整,并能够对网络拥塞进行有效的控制。由于RTCP数据报采用的是多播方式,因此会话中的所有成员都可以通过RTCP数据报返回的控制信息,来了解其他参与者的当前情况。

    在一个典型的应用场合下,发送媒体流的应用程序将周期性地产生发送端报告SR,该RTCP数据报含有不同媒体流间的同步信息,以及已经发送的数据报和字节的计数,接收端根据这些信息可以估计出实际的数据传输速率。另一方面,接收端会向所有已知的发送端发送接收端报告RR,该RTCP数据报含有已接收数据报的最大序列号、丢失的数据报数目、延时抖动和时间戳等重要信息,发送端应用根据这些信息可以估计出往返时延,并且可以根据数据报丢失概率和时延抖动情况动态调整发送速率,以改善网络拥塞状况,或者根据网络状况平滑地调整应用程序的服务质量。

    2.3 RTSP实时流协议

    作为一个应用层协议,RTSP提供了一个可供扩展的框架,它的意义在于使得实时流媒体数据的受控和点播变得可能。总的说来,RTSP是一个流媒体表示协议,主要用来控制具有实时特性的数据发送,但它本身并不传输数据,而是必须依赖于下层传输协议所提供的某些服务。RTSP可以对流媒体提供诸如播放、暂停、快进等操作,它负责定义具体的控制消息、操作方法、状态码等,此外还描述了与RTP间的交互操作。

    RTSP在制定时较多地参考了HTTP/1.1协议,甚至许多描述与HTTP/1.1完全相同。RTSP之所以特意使用与HTTP/1.1类似的语法和操作,在很大程度上是为了兼容现有的Web基础结构,正因如此,HTTP/1.1的扩展机制大都可以直接引入到RTSP中。

    由RTSP控制的媒体流集合可以用表示描述(Presentation Description)来定义,所谓表示是指流媒体服务器提供给客户机的一个或者多个媒体流的集合,而表示描述则包含了一个表示中各个媒体流的相关信息,如数据编码/解码算法、网络地址、媒体流的内容等。

    虽然RTSP服务器同样也使用标识符来区别每一流连接会话(Session),但RTSP连接并没有被绑定到传输层连接(如TCP等),也就是说在整个RTSP连接期间,RTSP用户可打开或者关闭多个对RTSP服务器的可靠传输连接以发出RTSP 请求。此外,RTSP连接也可以基于面向无连接的传输协议(如UDP等)。

    RTSP协议目前支持以下操作: 

    • 检索媒体  允许用户通过HTTP或者其它方法向媒体服务器提交一个表示描述。如表示是组播的,则表示描述就包含用于该媒体流的组播地址和端口号;如果表示是单播的,为了安全在表示描述中应该只提供目的地址。
    • 邀请加入  媒体服务器可以被邀请参加正在进行的会议,或者在表示中回放媒体,或者在表示中录制全部媒体或其子集,非常适合于分布式教学。
    • 添加媒体  通知用户新加入的可利用媒体流,这对现场讲座来讲显得尤其有用。与HTTP/1.1类似,RTSP请求也可以交由代理、通道或者缓存来进行处理。

    三、流媒体编程

    RTP是目前解决流媒体实时传输问题的最好办法,如果需要在Linux平台上进行实时流媒体编程,可以考虑使用一些开放源代码的RTP库,如LIBRTP、JRTPLIB等。JRTPLIB是一个面向对象的RTP库,它完全遵循RFC 1889设计,在很多场合下是一个非常不错的选择,下面就以JRTPLIB为例,讲述如何在Linux平台上运用RTP协议进行实时流媒体编程。

    3.1 环境搭建

    JRTPLIB是一个用C++语言实现的RTP库,目前已经可以运行在Windows、Linux、FreeBSD、Solaris、Unix和VxWorks等多种操作系统上。要为Linux 系统安装JRTPLIB,首先从JRTPLIB的网站(http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.html)下载最新的源码包,此处使用的是jrtplib-2.7b.tar.bz2。假设下载后的源码包保存在/usr/local/src目录下,执行下面的命令可以对其进行解压缩:

     
    [root@linuxgam src]# bzip2 -dc jrtplib-2.7b.tar.bz2 | tar xvf -
    

    接下去需要对JRTPLIB进行配置和编译:

    [root@linuxgam src]# cd jrtplib-2.7
    [root@linuxgam jrtplib-2.7b]# ./configure 
    [root@linuxgam jrtplib-2.7b]# make
    

    最后再执行如下命令就可以完成JRTPLIB的安装:

    [root@linuxgam jrtplib-2.7b]# make install
    

    3.2 初始化

    在使用JRTPLIB进行实时流媒体数据传输之前,首先应该生成RTPSession类的一个实例来表示此次RTP会话,然后调用Create()方法来对其进行初始化操作。RTPSession类的Create()方法只有一个参数,用来指明此次RTP会话所采用的端口号。清单1给出了一个最简单的初始化框架,它只是完成了RTP会话的初始化工作,还不具备任何实际的功能。


    代码清单1:initial.cpp
    #include "rtpsession.h"
    		
    int main(void)
    {
    	RTPSession sess;
    	sess.Create(5000);
    	return 0;
    }
    

    如果RTP会话创建过程失败,Create()方法将会返回一个负数,通过它虽然可以很容易地判断出函数调用究竟是成功的还是失败的,但却很难明白出错的原因到底什么。JRTPLIB采用了统一的错误处理机制,它提供的所有函数如果返回负数就表明出现了某种形式的错误,而具体的出错信息则可以通过调用RTPGetErrorString()函数得到。RTPGetErrorString()函数将错误代码作为参数传入,然后返回该错误代码所对应的错误信息。清单2给出了一个更加完整的初始化框架,它可以对RTP会话初始化过程中所产生的错误进行更好的处理:


    代码清单2:framework.cpp
    #include <stdio.h>
    #include "rtpsession.h"
    int main(void)
    {
      RTPSession sess;
      int status;
      char* msg;
      sess.Create(6000);
      msg = RTPGetErrorString(status);
      printf("Error String: %s\\n", msg);
      return 0;
    }
    

    设置恰当的时戳单元,是RTP会话初始化过程所要进行的另外一项重要工作,这是通过调用RTPSession类的SetTimestampUnit()方法来实现的,该方法同样也只有一个参数,表示的是以秒为单元的时戳单元。例如,当使用RTP会话传输8000Hz采样的音频数据时,由于时戳每秒钟将递增8000,所以时戳单元相应地应该被设置成1/8000:

    sess.SetTimestampUnit(1.0/8000.0);
    

    3.3 数据发送

    当RTP会话成功建立起来之后,接下去就可以开始进行流媒体数据的实时传输了。首先需要设置好数据发送的目标地址,RTP协议允许同一会话存在多个目标地址,这可以通过调用RTPSession类的AddDestination()、DeleteDestination()和ClearDestinations()方法来完成。例如,下面的语句表示的是让RTP会话将数据发送到本地主机的6000端口:

    unsigned long addr = ntohl(inet_addr("127.0.0.1"));
    sess.AddDestination(addr, 6000);
    

    目标地址全部指定之后,接着就可以调用RTPSession类的SendPacket()方法,向所有的目标地址发送流媒体数据。SendPacket()是RTPSession类提供的一个重载函数,它具有下列多种形式:

    int SendPacket(void *data,int len)
    int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc)
    int SendPacket(void *data,int len,unsigned short hdrextID,void *hdrextdata,
    int numhdrextwords)
    int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc,
    		unsigned short hdrextID,void *hdrextdata,int numhdrextwords)
    

    SendPacket()最典型的用法是类似于下面的语句,其中第一个参数是要被发送的数据,而第二个参数则指明将要发送数据的长度,再往后依次是RTP负载类型、标识和时戳增量。

    sess.SendPacket(buffer, 5, 0, false, 10);
    

    对于同一个RTP会话来讲,负载类型、标识和时戳增量通常来讲都是相同的,JRTPLIB允许将它们设置为会话的默认参数,这是通过调用RTPSession类的SetDefaultPayloadType()、SetDefaultMark()和SetDefaultTimeStampIncrement()方法来完成的。为RTP会话设置这些默认参数的好处是可以简化数据的发送,例如,如果为RTP会话设置了默认参数:

    sess.SetDefaultPayloadType(0);
    sess.SetDefaultMark(false);
    sess.SetDefaultTimeStampIncrement(10);
    

    之后在进行数据发送时只需指明要发送的数据及其长度就可以了:

    sess.SendPacket(buffer, 5);
    

    3.4 数据接收

    对于流媒体数据的接收端,首先需要调用RTPSession类的PollData()方法来接收发送过来的RTP或者RTCP数据报。由于同一个RTP会话中允许有多个参与者(源),你既可以通过调用RTPSession类的GotoFirstSource()和GotoNextSource()方法来遍历所有的源,也可以通过调用RTPSession类的GotoFirstSourceWithData()和GotoNextSourceWithData()方法来遍历那些携带有数据的源。在从RTP会话中检测出有效的数据源之后,接下去就可以调用RTPSession类的GetNextPacket()方法从中抽取RTP数据报,当接收到的RTP数据报处理完之后,一定要记得及时释放。下面的代码示范了该如何对接收到的RTP数据报进行处理:

    if (sess.GotoFirstSourceWithData()) {
      do {
        RTPPacket *pack;					
        pack = sess.GetNextPacket();					
        // 处理接收到的数据
        delete pack;
      } while (sess.GotoNextSourceWithData());
    }
    

    JRTPLIB为RTP数据报定义了三种接收模式,其中每种接收模式都具体规定了哪些到达的RTP数据报将会被接受,而哪些到达的RTP数据报将会被拒绝。通过调用RTPSession类的SetReceiveMode()方法可以设置下列这些接收模式:

    • RECEIVEMODE_ALL  缺省的接收模式,所有到达的RTP数据报都将被接受;
    • RECEIVEMODE_IGNORESOME  除了某些特定的发送者之外,所有到达的RTP数据报都将被接受,而被拒绝的发送者列表可以通过调用AddToIgnoreList()、DeleteFromIgnoreList()和ClearIgnoreList()方法来进行设置;
    • RECEIVEMODE_ACCEPTSOME  除了某些特定的发送者之外,所有到达的RTP数据报都将被拒绝,而被接受的发送者列表可以通过调用AddToAcceptList ()、DeleteFromAcceptList和ClearAcceptList ()方法来进行设置。

    3.5 控制信息

    JRTPLIB是一个高度封装后的RTP库,程序员在使用它时很多时候并不用关心RTCP数据报是如何被发送和接收的,因为这些都可以由JRTPLIB自己来完成。只要PollData()或者SendPacket()方法被成功调用,JRTPLIB就能够自动对到达的RTCP数据报进行处理,并且还会在需要的时候发送RTCP数据报,从而能够确保整个RTP会话过程的正确性。

    而另一方面,通过调用RTPSession类提供的SetLocalName()、SetLocalEMail()、SetLocalLocation()、SetLocalPhone()、SetLocalTool()和SetLocalNote()方法,JRTPLIB又允许程序员对RTP会话的控制信息进行设置。所有这些方法在调用时都带有两个参数,其中第一个参数是一个char型的指针,指向将要被设置的数据;而第二个参数则是一个int型的数值,表明该数据中的前面多少个字符将会被使用。例如下面的语句可以被用来设置控制信息中的电子邮件地址:

    sess.SetLocalEMail("xiaowp@linuxgam.com",19);
    

    在RTP会话过程中,不是所有的控制信息都需要被发送,通过调用RTPSession类提供的EnableSendName()、EnableSendEMail()、EnableSendLocation()、EnableSendPhone()、EnableSendTool()和EnableSendNote()方法,可以为当前RTP会话选择将被发送的控制信息。

    3.6 实际应用

    最后通过一个简单的流媒体发送-接收实例,介绍如何利用JRTPLIB来进行实时流媒体的编程。清单3给出了数据发送端的完整代码,它负责向用户指定的IP地址和端口,不断地发送RTP数据包:


    代码清单3:sender.cpp
    #include <stdio.h>
    #include <string.h>
    #include "rtpsession.h"
    // 错误处理函数
    void checkerror(int err)
    {
      if (err < 0) {
        char* errstr = RTPGetErrorString(err);
        printf("Error:%s\\n", errstr);
        exit(-1);
      }
    }
    int main(int argc, char** argv)
    {
      RTPSession sess;
      unsigned long destip;
      int destport;
      int portbase = 6000;
      int status, index;
      char buffer[128];
      if (argc != 3) {
        printf("Usage: ./sender destip destport\\n");
        return -1;
      }
      // 获得接收端的IP地址和端口号
      destip = inet_addr(argv[1]);
      if (destip == INADDR_NONE) {
        printf("Bad IP address specified.\\n");
        return -1;
      }
      destip = ntohl(destip);
      destport = atoi(argv[2]);
      // 创建RTP会话
      status = sess.Create(portbase);
      checkerror(status);
      // 指定RTP数据接收端
      status = sess.AddDestination(destip, destport);
      checkerror(status);
      // 设置RTP会话默认参数
      sess.SetDefaultPayloadType(0);
      sess.SetDefaultMark(false);
      sess.SetDefaultTimeStampIncrement(10);
      // 发送流媒体数据
      index = 1;
      do {
        sprintf(buffer, "%d: RTP packet", index ++);
        sess.SendPacket(buffer, strlen(buffer));
        printf("Send packet !\\n");
      } while(1);
      return 0;
    }
    

    清单4则给出了数据接收端的完整代码,它负责从指定的端口不断地读取RTP数据包:


    代码清单4:receiver.cpp
    #include <stdio.h>
    #include "rtpsession.h"
    #include "rtppacket.h"
    // 错误处理函数
    void checkerror(int err)
    {
      if (err < 0) {
        char* errstr = RTPGetErrorString(err);
        printf("Error:%s\\n", errstr);
        exit(-1);
      }
    }
    int main(int argc, char** argv)
    {
      RTPSession sess;
      int localport;
      int status;
      if (argc != 2) {
        printf("Usage: ./sender localport\\n");
        return -1;
      }
       // 获得用户指定的端口号
      localport = atoi(argv[1]);
      // 创建RTP会话
      status = sess.Create(localport);
      checkerror(status);
      do {
        // 接受RTP数据
        status = sess.PollData();
    	// 检索RTP数据源
        if (sess.GotoFirstSourceWithData()) {
          do {
            RTPPacket* packet;
            // 获取RTP数据报
            while ((packet = sess.GetNextPacket()) != NULL) {
              printf("Got packet !\\n");
              // 删除RTP数据报
              delete packet;
            }
          } while (sess.GotoNextSourceWithData());
        }
      } while(1);
      return 0;
    }
    

    本文源码 下载

    四、小结

    随着多媒体数据在Internet上所承担的作用变得越来越重要,需要实时传输音频和视频等多媒体数据的场合也将变得越来越多,如IP电话、视频点播、在线会议等。RTP是用来在Internet上进行实时流媒体传输的一种协议,目前已经被广泛地应用在各种场合,JRTPLIB是一个面向对象的RTP封装库,利用它可以很方便地完成Linux平台上的实时流媒体编程。


    参考资料

    • 1. 在JRTPLIB的网站http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.html上,可以下载到JRTPLIB最新的源码包,并且还能找到一些与RTP相关的资源。

    • 2. 顾淑珍等编著,宽带增值服务开发实例,北京:机械工业出版社,2002

    • 3. 黄永峰等编著,IP网络多媒体通信技术,北京:人民邮电出版社,2003
    展开全文
  • 流媒体传输类型 主流的流媒体协议 流媒体协议原理 ...(二) 苹果支持的HLS原理(实况直播、文件点播) (三) Adobe Flash 支持的RTMP协议(支持文件播放 ...  一个完整的多媒体文件是由音频和视频两部分组成的,H264、X...

      一个完整的多媒体文件是由音频和视频两部分组成的,H264、Xvid等就是视频编码格式,MP3、AAC等就是音频编码格式,字幕文件只是附加文件。目前大部分的播放器产品对于H.264 + AAC的MP4编码格式支持最好,但是MP4也有很多的缺点,比如视频header很大,影响在线视频网站的初次加载时间。为了降低头部体积,需要进行视频本身的物理分段等等。对MPEG2-TS格式视频文件进行物理切片,分成一小段,这种方式被Apple公司的HTTP Live Streaming (HLS)技术采用。另外一种是使用Fragmented MP4文件格式,这是一种文件内部的逻辑分割方式,而视频文件还是完整的,这种技术被 Microsoft Smooth Streaming和Adobe HTTP Dynamic Streaming采用。很多在线视频网站在带宽耗费的压力下,主要选择的是adobe公司提供的FLV或F4V,FLV是流媒体封装格式,可将其数据看为二进制字节流。总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。

    流媒体传输类型

      流媒体在播放前不是完全下载整个文件,而是把开始部分内容存入内存,数据流是随时传送随时播放。
    流媒体服务器提供的流式传输方式有两种:顺序流式传输和实时流式传输两种方式。
      顺序流式传输是顺序下载,在下载文件的同时用户可观看在线媒体。如果使用普通的HTTP服务器,将音视频数据以从头至尾方式发送,则为顺序流媒体传输。
      实时流式传输总是实时传送,特别适合现场事件。一般来说,如果视频为现场直播,或使用专用的流媒体服务器,或应用如RTSP等专用实时协议,即为实时流媒体传输。实时流式传输必须匹配连接带宽,这意味着图像质量会因网络速度降低而变差。
      在流式传输时,流媒体数据具有实时性,等时性等基本特点,流服务期和客户终端要保证各种媒体间的同步关系,因此,流媒体传输对“最大延时”,“延时抖动”等QoS参数都有严格要求。
      实时流传输既可传输实况直播,也可传输完整的音视频文件(专用协议流式)。
      顺序流媒体不可用于实况直播,仅能传输完整的音视频文件(HTTP渐进式)。

    区别 实时流 顺序流
    音视频数据源 实时从录制设备上采集,或(使用专用协议传输的)文件 可播放的音视频文件
    服务器类型 专用流媒体服务器,如:QuickTime Streaming Server,Real Server,Windows Media Server,Flash Media erver 普通的HTTP服务器,或FTP服务器
    传输协议 专用协议RTSP,HLS或RTMP等 一般的HTTP协议,与传输网页的协议相同
    跳播 可随机访问任意片段 在给定时刻,用户只能观看已下载的那部分,而不能跳到还未下载的部分

    主流的流媒体协议

    主流的流媒体协议主要有: RTMP, HLS, RTSP等。

    区别 RTMP HLS RTSP
    全称 Real Time Message Protocol Http Live Stream Real Time Streaming Protocol
    上层协议 TCP或HTTP HTTP RTP,RTCP
    软件模型 C\S B\S C\S
    研发主要来自 Adobe Apple Microsoft
    针对客户端 支持Flash类产品的浏览器 支持HTML5的浏览器 苹果的Safari浏览器 支持HTML5的浏览器 播放器
    视频格式要求 FLV, F4V MP4
    服务器要求 专用Flash服务器Flash Media Server Red5 普通HTTP服务器 专用RTSP流媒体服务器
    实况直播要求 专用编码器上传Flash Media Encoder 专用编码器上传 Apple开发工具 与服务器相关,自定义上传
    文件播放要求 FLV ,F4V文件即可,服务器会自动分解为F4f 数据文件 f4x索引文件 TS数据文件,M3u8索引文件 与服务器相关,与播放器相关

    流媒体协议原理

    (一) HTTP渐进式下载原理(仅支持文件播放)

      HTTP边下载边播放,严格意义上讲,不是直播协议。他的原理是先下载文件的基本信息,音频视频的时间戳,再下载音视频数据,以播放mp4为例,先下载文件头,根据文件头指引下载文件尾,然后再下载文件的音视频数据。
    这里写图片描述
      播放方式:浏览器调用系统播放器播放;
      使HTML5的Video标签,浏览器支持直接播放。

    (二) 苹果支持的HLS原理(实况直播、文件点播)

    服务器端有三个组件:
    其一:编码器(media encoder), 用于将设备输出的格式转为H264和AAC,并封装为MPEG-2传输流;
    其二:流分段器(stream segmenter), 用于实况直播,将MPEG-2流分割为多个小片段后输出;
    其三:文件分段器(file segmenter), 用于文件点播,将文件分隔为多个小片段后输出;
    分发原理
    数据经以上三部分处理后为.ts文件(媒体数据)及.m3u8文件(媒体数据索引)存在于服务器之上。 客户端访问.m3u8后按索引下载.ts文件进行播放。
    这里写图片描述
    下面为某m3u8文件内容:

    #EXTM3U
    #EXT-X-TARGETDURATION:30
    #EXTINF:30,
    http://192.169.1.176/sample_100k-1.ts
    #EXTINF:30,
    http://192.169.1.176/sample_100k-2.ts
    #EXTINF:30,
    http://192.169.1.176/sample_100k-3.ts
    #EXT-X-ENDLIST

    根据这个文件,播放器会依次下载sample_100k-1.ts,sample_100k-2.ts,sample_100k-3.ts
    HLS的文件点播

    1. 使用苹果开发工具“文件分段器”将基于H264和AAC或MP3的MPEG4分段,生成.ts和.m3u8文件,存储于普通服务器上。
    2. 苹果应用程序或苹果浏览器可以通过访问.m3u8文件获取到索引,并下载所需要的数据片段来播放。

    HLS的实况直播

    1. 使用苹果开发工具“流分段器”将基于H264、AAC、MP3的MPEG2传输流分段,可使用其它工具将MPEG4音视频文件加载到MPEG2传输流当中。生成.ts和.m3u8文件,存储于普通服务器上。
    2. 苹果应用程序或苹果浏览器可以通过访问.m3u8文件获取到索引,并下载所需要的数据片段来播放。

    (三) Adobe Flash 支持的RTMP协议(支持文件播放 和 实况直播)

      RTMP(Real Time Messaging Protocol) 是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议。它有四种变种:

    1. 工作在TCP之上的明文协议,使用端口1935;
    2. RTMPS通过TLS/SSL连接;
    3. RTMPT封装在HTTP请求之中,可穿越防火墙;
    4. RTMPS类似RTMPT,但使用的是HTTPS连接;

      RTMP协议(Real Time Messaging Protocol)是被Flash用于对象,视频,音频的传输。这个协议建立在TCP协议或者轮询HTTP协议之上。RTMP协议就像一个用来装数据包的容器,这些数据既可以是AMF格式的数据,也可以是FLV中的视/音频数据。一个单一的连接可以通过不同的通道传输多路网络流,这些通道中的包都是按照固定大小的包传输的。必须采用Flash服务器FMS(Flash Media Server) 或 RED5.
    FMS的文件点播
      1. 服务器将F4v 或 Flv文件转化为RTMP流或HTTP流
      2. 客户端获取RTMP流,提取相应的Flv 或 F4v文件片段进行播放。
    FMS的实况直播
      1. 设备端将数据转化为F4v片段,通过RTMP流上传到服务器
      2. 服务器转发RTMP流到客户端
      3. 客户端获取RTMP流,提取数据片段播放。
    这里写图片描述
    这里写图片描述

    (四) RTSP协议

      该协议用于C/S模型,是一个基于文本的协议,用于在客户端和服务器端建立和协商实时流会话。
      实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频的受控点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。
      实时流协议(RTSP)建立并控制一个或几个时间同步的连续流媒体。尽管连续媒体流与控制流交换是可能的,通常它本身并不发送连续流。换言之,RTSP充当多媒体服务器的网络远程控制。RTSP连接没有绑定到传输层连接,如TCP。在RTSP连接期间,RTSP用户可打开或关闭多个对服务器的可传输连接以发出RTSP请求。此外,可使用无连接传输协议,如UDP。RTSP流控制的流可能用到RTP,但RTSP操作并不依赖用于携带连续媒体的传输机制。

    协议支持的操作如下

    • 从媒体服务器上检索媒体:用户可通过HTTP或其它方法提交一个演示描述。如演示是组播,演示式就包含用于连续媒体的的组播地址和端口。如演示仅通过单播发送给用户,用户为了安全应提供目的地址。
    • 媒体服务器邀请进入会议:媒体服务器可被邀请参加正进行的会议,或回放媒体,或记录其中一部分,或全部。这种模式在分布式教育应用上很有用,会议中几方可轮流按远程控制按钮。
    • 将媒体加到现成讲座中:如服务器告诉用户可获得附加媒体内容,对现场讲座显得尤其有用。如HTTP/1.1中类似,RTSP请求可由代理、通道与缓存处理。

    下面区分几种操作模式

    • 单播:用户选择的端口号将媒体发送到RTSP请求源。
    • 服务器选择地址多播:媒体服务器选择多播地址和端口,这是现场直播或准点播常用的方式。
    • 用户选择地址多播:如服务器加入正在进行的多播会议,多播地址、端口和密钥由会议描述给出。

      RTSP控制通过单独协议发送的数据流,与控制通道无关。例如,RTSP控制可通过TCP连接,而数据流通过UDP。因此,即使媒体服务器没有收到请求,数据也会继续发送。在连接生命期,单个媒体流可通过不同TCP连接顺序发出请求来控制。所以,服务器需要维持能联系流与RTSP请求的连接状态。RTSP中很多方法与状态无关,但下列方法在定义服务器流资源的分配与应用上起着重要的作用:

    1. SETUP:让服务器给流分配资源,启动RTSP连接。
    2. PLAY与RECORD:启动SETUP分配流的数据传输。
    3. PAUSE:临时停止流,而不释放服务器资源。
    4. TEARDOWN:释放流的资源,RTSP连接停止。

    标识状态的RTSP方法使用连接头段识别RTSP连接,为响应SETUP请求,服务器连接产生连接标识。

    • RTSP为纯粹的传输控制协议。
    • RTSP协议本身不与它负载的媒体数据相关。
    • RTSP协议需要自定义客户端向服务器发送RTSP命令。

    流媒体服务器的协议栈

      在TCP/IP参考模型中,传输层通信协议TCP和UDP都不能满足流媒体传输的QoS要求。由于TCP协议采用滑动窗口控制机制,数据传送随着流控窗口动态的启动和关闭,难以满足流媒体实时和等时的传送要求。UDP协议的无连接特点能够提高传输速率,虽然可以在某种程度上满足流媒体的实时性要求,但是由于其本身的不可靠性,也无法满足流媒体传输的需要。
      针对传输层协议的矛盾,为了实现流媒体在IP上的实时传送播放,设计流媒体服务器时需要在传输层协议(TCP/UDP)和应用层之间增加一个通信控制层。在增加的通信控制层,采用相应的实时传输协议,主要有:数据流部分的实时传输协议RTP(Real-time Transport Protocol),用于控制部分的实时传输控制协议RTCP(Real-time Control Protocol)和实时流化协议RTSP(Real-time Streaming Protocol)。
    这里写图片描述
    流媒体服务器的协议栈,如图1所示。
    RTP协议主要是用来传送实时的流媒体信息,数据报主要包括多媒体数据,以及所携带负载的时间戳,顺序号等。
    RTCP协议的数据报主要包括了接收者收到某个多媒体流的服务质量信息Qos,用于对服务器端的反馈。
    RTSP是一种控制协议,包括通信连接前的设定,从服务器送出的多媒体资料的控制。用于控制具有实时性的数据传输。它提供对流媒体的类似VCR(Video Cassette Recorder)的控制功能,如播放、暂停、快进、录制等,也就是RTSP对多媒体服务器实施网络远程控制。
    这里写图片描述
    流媒体服务器的功能框图,如图2所示。
    当服务器收到RTSP请求,它首先产生RTSP请求对象。服务器通过RTSP协议的应答信息将请求的内容以流会话(streaming session)的形式描述,内容包括数据流包含多少个流、媒体类型、和编解码格式。一个流会话由一个或多个数据流组成,如视频流和音频流等。实际的数据流通过RTP协议传递到客户端。RTP在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。RTP本身并不能为顺序传送数据包提供可靠的传送机制,它依靠RTCP一起提供流量控制和拥塞控制服务。在RTP会话期间,各连接者监视下层网络的性能,并将相关信息放入RTCP包,周期性地传送RTCP包来通知发送方。发送方也可以用RTCP包提供每次的会话信息,包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料。因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,因有效的反馈和最小的开销使传输效率最佳化。
      通过流媒体服务器的协议栈的设计,可以明确流媒体服务器是在传输层协议(TCP,UDP)上解释RTP,RTCP,RTSP协议的,所有的客户连接请求都是以TCP的端口获得的,流媒体数据也都是打成RTP包,通过UDP端口发出去的,因此,对于TCP,UDP端口事件的调度以及如何把大量的流媒体数据从磁盘空间传递到网络上成为制约流媒体服务器性能的主要因素。
    这里写图片描述

    传统流媒体服务器的处理流程,如图3所示。
       流媒体服务器面对一个单一的客户,完成的过程如下:
       1)在客户端发出RTSP连接请求后,服务器通过对TCP端口的监听,读入请求。
       2)解析请求内容,调入相应的流媒体文件。
       3)形成RTP包,分发数据流包,获得RTCP包。
    4)数据包发送完毕,关闭连接。
    这里写图片描述
    这里写图片描述

    上图是RTSP直播服务器的系统框图。
    从摄像头采集实时图像,送到编码器进行实时编码,一般是生成TS格式的数据流,然后数据流输出到视频直播服务器。客户端先发送请求到web服务器,然后再重定向到RTSP视频服务器,从视频服务器读取数据,同时实现播放,暂停等功能。

    流媒体的传输技术

    一、单播:
    主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。
    单播的优点:
    1. 服务器及时响应客户机的请求
    2. 服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。
    单播的缺点:
    1. 服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。

    二、 广播:
    主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。
    广播的优点:
    1. 网络设备简单,维护简单,布网成本低廉
    2. 由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。
    广播的缺点:
    1.无法针对每个客户的要求和时间及时提供个性化服务。
    2. 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。
    3. 广播禁止在Internet宽带网上传输。

    三、组播:
    主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。
    组播的优点:
    1. 需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。
    2. 由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。
    3. 此协议和单播协议一样允许在Internet宽带网上传输。
    组播的缺点:
    1.与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。
    2.现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中。

    自适性串流技术

    自适性串流(ABS - adaptive bitrate streaming),是一种在电脑网络使用的一种串流技术。过去的流媒体技术多使用 RTP/RTSP,但现在的技术则大多基于 HTTP,并为更高效在大型分布式HTTP网络(例如互联网)分发而设计。
    此技术根据实时检测的用户的带宽和CPU使用率,调整视频流的质量。这需要使用一种可以将单一视频源输出为多码率的编码器。播放器客户端依赖可用资源在不同码率的流之间切换。”结果就是:更少缓存、更快的开始播放、为低端和高端链接都提供良好的体验。
    根据当前广泛使用的实现,更具体来说,自适应串流(ABS):
    使用 HTTP 传送视频流;
    使用多码率编码源内容;
    每个单码率的流被切成小的,几秒钟的小切片;
    流媒体客户端首先获取所有码率的切片索引信息。一开始,客户端先请求最低码率的串流。如果客户端判断下载速度比当前码率的切片串流快,它就去请求下一个更高码率的串流。随着播放的进行,如果客户端发现下载速度比当前码率的切片串流慢,转而请求下一个较低码率的串流。
    切片大小和具体实现密切相关,不过一般都在2~10秒之间。每个切片由一个完整的GOP序列组成,一个GOP序列里面有1个或者多个I帧,GOP序列的第一个帧必须是I帧,并且每个切片都能单独的解码播放显示。
    与传统的流媒体技术比较,缺点:需要额外的存储,更多的编码代价,复杂的只适应码率逻辑。
    这里写图片描述
    Adaptive streaming overview
    这里写图片描述
    Adaptive streaming in action

    MPEG-DASH (Dynamic Adaptive Streaming over HTTP)
    MPEG-DASH 是基于HTTP的自适应串流方案中的唯一国际标准。MPEG-DASH 技术由 MPEG 主导开发:
    2010年开始DASH相关工作,2011年1月成为国际标准草案,2011年11月成为国际标准[3],2012年4月,MPEG-DASH 以ISO/IEC 23009-1:2012 发表。
    MPEG-DASH 基于3GPP第9版的 Adptive HTTP streaming(AHS)和 Open IPTV Forum第2版的 HTTP Adaptive Streaming (HAS)。作为与MPEG合作的一部分,3GPP第10版采用了DASH(采用特别的编码和操作模式),用于无线网络。
    可用的 MPEG-DASH 实现有:
    bitmovin GmbH 的开源 DASH 客户端库 libdash 和 DASHEncoder

    Adobe HDS (HTTP Dynamic Streaming)
    Flash Player 和 Flash Media Server 的最新版支持传统的 RTMP 协议和 HTTP协议。后者和Apple和微软基于HTTP的方案类似。
    基于HTTP的流的优势是:
    不需要防火墙开普通web浏览器所需端口以外的任何端口
    允许视频切片在浏览器、网关和CDN的缓存,从而显著降低源服务器的负载。
    HDS 的文件格式为 FLV/F4V/MP4,索引文件为 f4m,同时支持直播和时移。

    Apple HLS (HTTP Live Streaming)
    是一种基于HTTP的媒体流通信协议,在 iPhone 3.0 及更新版中成为标准功能。
    2010年10月,所有自适应串流方案都作为产权提供时,Apple 将HLS提交到 IETF,成为正式的 RFC.
    HLS 串流使用扩展名为 .m3u8 的文件作为索引,文件切片格式为TS,支持直播和时移。支持的客户端包括 iPad, iPhone, STB,VLC和其他支持的设备。

    Microsoft MSS (Microsoft Smooth Streaming)
    Smooth Streaming 是IIS的媒体服务扩展,用于支持基于HTTP的自适应串流。
    在2010年11月发布的 IIS Media Services 4.0 中,微软引入了一项使 Live Smooth Streaming H.264/AAC 视频动态封装成 Apple HLS 格式的功能,直接提供给 iOS 设备,而不需要再次编码。同时支持直播和点播把1080P全高清视频发送到Silverlight客户端。
    MSS 的文件切片格式为 mp4(fragmented-mp4),索引文件为ism/ismc,同时支持直播和时移。

    流行视频网站的流媒体服务器架构
    为了能够提供各类设备的在线视频播放需求,对于在线视频流媒体服务,提出了很多需求,对于早期建立的视频网站(土豆,优酷,ku6等)都只提供一种视频流媒体格式(FLV)的支持,我们称之为单一的流媒体服务架构,如图:
    这里写图片描述
    图1 :单一流媒体服务的架构图
    但是,在实际业务运营中遇到了很多问题:
    1) 视频存储的压力很大
    同一种视频码流(h.264),因为针对不同平台应用设备(如表2)的播放需求,需要不同的封装格式,需要将产生大量重复视频流存储的压力,视频网站的视频量巨大,多支持一种格式将产生几百TB级的存储压力,从机房到机柜,视频流同步等环节负载和压力都是巨大的。
    2) 封装后的视频格式是否真的被播放
    视频流封装完成后,同步到各地的中心节点后,是否真的有视频流请求产生,还是仅仅处于视频准备状态,是否会影响中心节点的磁盘占用,缓存节点的命中率不高。
    3) 封装格式的功能性升级,导致老视频再次封装

    封装格式的不断发展,TS流,HTTP live Stream的不断优化,将导致现有的视频流不断需要翻新或重复封装。 为了解决上述各类问题,视频网站流媒体服务的研发工程师进行了多格式的流媒体服务架构探索,提供了各类视频封装格式的流媒体封装反向代理接口,该接口能够通过URL的请求,完成对特定视频编码格式(h.264)的封装。
    这里写图片描述
    图2:多格式的流媒体服务架构
    如图所示,“流媒体容器封装服务“成为多格式视频流服务的核心,对于这个流媒体的封装服务,通过对h.264的视频编码流进行不同格式的封装,提供了多种视频流的推送。对于这个服务,我们希望能够尽快为视频的cache服务推送视频流,所以,在硬盘方面,选择了每分钟15000转的SAS硬盘,降低同一视频流的不同封装请求的IO延迟等待。
    作为最简单和原始的流媒体解决方案,单一流媒体服务架构唯一显著的优点在于它仅需要维护一个标准的视频流文件,而这样的服务器基础设施在互联网中已经普遍存在,其安装和维护的工作量和复杂性比起多格式流媒体服务架构来说要简单和容易的多。然而其缺点和不足却也很多,首先是维护的工作量较大,多份相同视频文件由于封装格式不相同,需要同时维护多个实体的码流文件,大量的占用磁盘的空间,再次,转码集群需要针对多种不同的封装格式,进行多次的视频转码,抢占很多资源,缺乏灵活的控制功能和扩展机制。

    展开全文
  • 流媒体服务器原理和架构解析

    万次阅读 多人点赞 2016-07-25 09:54:09
    一个完整的多媒体文件是由音频和视频两部分组成的,H264、Xvid等就是视频编码格式,MP3、AAC等就是音频编码格式,字幕文件只是附加文件。目前大部分的播放器产品对于H.264 + AAC的MP4编码格式支持最好,但是MP4也有...
  • 一句话:RTSP发起/终结流媒体、RTP传输流媒体数据 、RTCP对RTP进行控制,同步。 因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码中没有看到相关的部分。而在私有RTSP的代码中,有关控制、同步等,是在RTP ...
  • 通过Nodejs搭建流媒体服务器1. 借助 Node-Media-Server 搭建自己的流媒体服务器2. 推流3. 拉流 1. 借助 Node-Media-Server 搭建自己的流媒体服务器 通过查看该模块Github地址了解详细介绍 1. 新建项目,在项目中安装...
  • 流媒体技术基础-流媒体传输协议(三) 作者/来源:未知 实时流协议RTSP   实时流协议RTSP(RealTimeStreamingProtocol)是由RealNetworks和Netscape共同提出的,该协议定义了一对多应用程序如何有效地通过IP...
  • Linux下的实时流媒体编程

    千次阅读 2007-01-09 15:26:00
    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术...
  • 流媒体技术 rtp/rtcp/rtsp资料精华!

    千次阅读 2014-09-01 14:40:59
    流媒体技术(或称为流式媒体技术)就是把连续的影像和声音信息经过压缩处理后放到网络服务器上,让浏览者一边下载一边观看、收听,而不需要等到整个多媒体文件下载完成就可以即时观看的技术。流媒体技术并不是单一的...
  • 流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP 电话等应用场合的技术基础。RTP 是进行实时流媒体传输的标准协议和关键...
  • 流媒体相关知识介绍 及其 RTP 应用

    千次阅读 2012-07-24 14:13:06
    一、流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒体文件时,基本上只有...
  • Linux下的实时流媒体编程

    千次阅读 2006-09-26 09:32:00
    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术...
  • 2.1当前的流媒体server.3 2.2Wowza功能...3 3.Nginx-based RTMP server.5 3.1 Nginx rtmp 功能点...5 3.2编译nginx rtmp模块...6 3.3配置以及功能介绍...6 3.4用nginx-rtmp-module搭建直播环境...8 3.5Nginx rtmp...
  • 一、流媒体简介随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒体文件时,基本上只有下载...
  • Linux下的实时流媒体编程(RTP,RTCP,RTSP)

    千次阅读 2014-04-16 10:42:30
    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术...
  • 流媒体相关知识介绍及其RTP应用

    千次阅读 2009-05-29 21:32:00
    一、流媒体简介随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒体文件时,基本上只有下载...
  • 公司是搞视频类的互联网公司,本人虽为开发人员,但因为业务相关,因此也要懂得视频和流媒体方面的知识,于是把公司图书阁里的《流媒体技术入门与提高》借回来看。我手上的是第二版。 流式技术解决方案 所谓流式...
  • StreamingMedia——流媒体技术原理

    千次阅读 2015-01-06 14:03:55
    1、概述  流媒体技术是一种专门用于网络多媒体信息传播和处理的新技术,该技术能够在网络上实现传播和播放同时进行的实时工作模式,相...“流”的重要作用体现在可以明显的节省时间,由于常规视频媒体文件比较大,并
  • 流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP 电话等应用场合的技术基础。RTP 是进行实时流媒体传输的标准协议和关键...
  • Linux 下的实时流媒体(RTP)编程

    千次阅读 2007-08-01 20:33:00
    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP 电话等应用场合的技术基础。RTP 是进行实时流媒体传输的标准协议和关键...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,070
精华内容 4,828
关键字:

下列是流媒体格式的文件