首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 流媒体开发的一些经验,希望对初学者有所帮助 [已结贴,结贴人:toxyboy]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2007-01-16 19:03:12 楼主
    见到网络上好多朋友从事流媒体开发,而不得法,到处求助而又有很少人回复,本人也是深有感触,现在断断续续的从事了一年多

    的directshow的开发,对directshow有了一点点了解,在此写出来给那些初学者一些帮助,当然,本人水平也很差,如果在说明的

    过程中有错误或者不对的地方,请大家多提意见和指正。。
    1、首先说下媒体格式
    audio:我所了解的wav、mp3、wma三中格式,基本上我都是先把它们解码成pcm的基本音频格式进行处理的。至于如何转换成wav

    (PCM)格式的我就不多说了,通过一些decode解码器,在用wavedest的filter写到文件就成wav文件了,在这里我说一下两个wav文

    件的合成。基本的音频文件的合成可以使用每个数据的叠加,数据的/2叠加等方法来合成两个音频数据。至于声音文件的放大,可

    以对每个数据按照比例放大,当然要注意越界的问题。这里所说的合成是采样率、位数都相同的情况下。还有就是pcm数据的组成

    格式,比如,8位的wav歌曲,双声道,它数据的存放格式是左、右、左、右这种格式,对于声道的拆分也可以采用这种格式。
    video:常见的压缩格式有h263   h263++,mpeg1(avi,vcd)等基本是参照mpeg1的和h263是不同的两中标准。mpeg2居于dvd品质的

    压缩格式,和dvd有一小点区别,mpeg4是现在最流行的基于网络的流媒体压缩格式,用的开源的有xvid,vidx等编解码器。最后就

    是h264,是mpeg和定义h263的两个组织共同定义的,同等品质下的压缩率是mpeg4的一半。本人水平有限,对编解码没有研究,基

    本上都是用别人的,编解码我就不多说了。对音频的处理,我只限于对基本的bmp图的处理。下面说说如何将音频数据和无压缩的

    原始bmp图合成为avi。通过capture拿到sample,然后扩充dump的fi个合成sample戳,然后用wmwriter把这两个sample写到文件里

    面。

    2、下面说说简单的流媒体传输
    基于directshow的架构的流,基本上是以sample为核心的,就是说我们只要拿到一个sample,把它通过网络发送出去,接收端接收

    到以后把它复原(可以自己实现Allocater来开发smaple   pool,也可以直接从编解码的input   pin来获得sample来填充),然后通

    过output   pin   把它deliver到后面的filter就可以了
    先说一个不处理的音频、视频流的传输
    audio   capture-> audio   sender   #####   net   #####   audio   receiver   ->   audio   render
    vidio   caputre->   video   sender   ####   new   #####   video   receiver   ->   video   render

    先说sender:重载CBaseInputPin,然后在媒体格式设置的时候,如下
    HRESULT GetMediaType   (IN     int     iPos,OUT   CMediaType   *         pmt)  
    {
    if(iPos==0)
    {
    pmt-> InitMediaType();
    pmt-> SetType(&MEDIATYPE_Video);
    pmt-> SetType(&MEDIASUBTYPE_RGB24);
    return   S_OK;
    }
    return   VFW_S_NO_MORE_ITEMS   ;
    }

    HRESULT CheckMediaType   (IN     const   CMediaType   *     pmt)
    {
    ASSERT(pmt);
    //if(pmt-> majortype   !=   MEDIATYPE_Video   &&   pmt-> subtype   !=   MEDIASUBTYPE_XVID_TRANSPORT) return  

    S_FALSE;
    if(pmt-> majortype   ==   MEDIATYPE_Video   &&   pmt-> subtype   ==   MEDIASUBTYPE_RGB24)
    {
    VIDEOINFO   *pInfo   =   (VIDEOINFO   *)   pmt-> Format();
    if(pInfo-> bmiHeader.biWidth   ==   160   &&  
    pInfo-> bmiHeader.biHeight==120 ) return   S_OK;
    }
    return   E_INVALIDARG;
    }
    然后在input   的receive事件里面   发送sample的数据就可以了。
    至于receive端:有两种模式,一种是自己实现IMemAllocator,这时候就要破坏pin协商的时候的(DecideAllocator)的input端

    的开辟的请求,可以参考dsnetwork的receiver,一种就是默认的从output   pin,GetDeliveryBuffer得到sample接口,然后把接收

    到的值的buf填充就可以了,然后调用output   pin   的deliver   下发下去就可以了。
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-16 19:22:301楼 得分:0
    下面就说说数据传输:我本人的开发基本都是windows的,服务器中转基本就用到了window的网络模型,基本上流媒体的传输都是先将数据encoder,然后传输在decoder,所以我们服务器收到的基本上都是与帧相关的,也就是说,如果数据丢失,特别是关键帧丢失将对显示造成很大影响,这里就需要特别注意关键帧的处理。windows的服务器架构,udp的一班采用重叠+事件选择模型,还有就是在客户端发送的时候要注意发送的网络环境,注意封包的大小。这里有些人可以采用rtp的jrtplib库来进行传送,如果要自己实现发送协议,则需要对网络开发要有相当的了解和开发经验。具体细节我就不展开了,我想能开发流媒体的开发水平因该有相当的造诣了吧。我看到网上很多人在问directshow的例子编译通不过,或者拿个opensource的例子编译通不过,那我建议你们先学好基础。好了,不废话了,那个例子来说明吧:
    directshow下面有个dsnetshow的例子,然后在下载编解码器,vidx或者xvid都可以,里面pin的媒体类型你们可以上www.vchelp.net里面查看下,可以得到详细的说明,然后修改receiver,和解码器连接然后在render就基本的框架出来了,如果想用jrtplib,则发送和接收的地方采用jrtplib的api就可以了。不过我看了看jrtplib的例子,我不打算采用它的,我是用自己的协议和自己封装的windows的重叠来作中转服务器和接收的。因为jrtplib里面对于接收到的数据还要在填充到sample里面的buf,相当于在一次的copy,这个对于高性能的服务器来说,造成的响应速度有很大影响,我相信大家都因该知道完成端口的一个有点就在于接收的数据是直接copy到用户的层,而不是先copy到socket   cache里面,然后在从cache   copy   到用户层的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-16 19:25:382楼 得分:0
    好了,还没吃饭呢,一口气写了这么多,如果大家对我说的有兴趣,那我后续会写一些我的经验,如果大家觉得没什么用,那我后面就不废话了。还有,里面的话没有组织,可能有些乱,还有些错误,希望不要误导了大家或者引起高手的鄙视。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zjl3638656
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-17 10:23:153楼 得分:0
    支持!来到这里的要么是高手,要么是新手。新手问问题,高手回答。搂主能主动介绍经验,非常钦佩,严重支持
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zaodt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-17 10:39:214楼 得分:0
    学了知识还有分拿,上哪找这么好的事啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • vishr
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-17 11:58:305楼 得分:0
    主题:基于嵌入式DSP的H.264视频编解码设计与优化


    招生简章、报名表下载

    培训内容:
    1,   视频编解码算法的移植方法
    2,   基于C64和C64+的算法优化方法
    3,   阐述xDIAS算法封装标准,以及和xDM的关系
    4,   实现Davinci平台的T264算法移植优化和封装,构建实现Davinci视频编解   码演示系统

    第一天:
    1,TI   视频相关产品发展趋势概述(TI   公司)
    2,基于TI_C64核DSP(DM642)CPU框架介绍;媒体处理指令集介绍;CACHE结构、DMA架构;
    3,H.264视频压缩标准阐述,T264编码器框架介绍;
    4,基于DM642的H.264视频编解器设计和优化思路:264编码算法优化设计、根据DSP的CACHE结构、DMA架构进行H.264编码器程序框架设计优化、基于媒体处理指令集的汇编语言优化设计。

    第二天:基于DM642的算法优化,T264编码器框架介绍,基于DM642的T264   编码器移植。
                    例子:
                  例A:T264编码器在CCS上移植,
                  例B:integer_DCT优化:从C语言——〉Intrinsic——〉线形汇编,
                  例C:针对T264运动估计算法,根据DSP框架的优化设计与实现

    第三天:
    1,DAVINCI框架介绍;基于DAVINCI的设计理念简介;
    2,DAVINCI内部DSP(C64+)子系统框架介绍;
    3,基于DSPLINK的ARM与DSP进行通信机制介绍;
    4,xDIAS与xDM的关系及各自算法封装,   VISA接口机制。
            例子:基于DAVINCI_xDM_VISA   的T264编码器算法封装。
    5,研讨,总结

              作为学习例子我们将提供一套能在DM642上实现15fps@baseline   CIF   的T264编码程序。基于这套程序的继续优化,将可以达到大约30fps的实时CIF格式压缩。   另外,还提供给大家我们自己整理过的TI分类文档。

    培训费:3000元/人,含教材费、午餐费(午餐标准25元/位)
    三人及三人以上集体报名   八折优惠。

    时间:   2007年1月29、30、31,每天9:00—17:30

    地点:   上海交通大学

    要求:   对DSP有基本了解,掌握C语言,熟悉视频编、解码标准。

    报名:   下载报名表,填写完整后mail至vishr@sina.com或者传真至(+86)21-34293702

    特点:  
    1,为嵌入式多媒体开发的入门者提供一些方向性的指导,使他们可以尽快上手,少看一些不必要的文档和少走一些弯路;
    2,为关心和已经涉及到DAVINCI开发的工程人员提供一次有关算法封装的培训;
    3,提供DAVINCI与DM642平台和实用的源代码;
    4,由专门从事视频编解码的技术开发人员现场指导;
    5,参加培训的学员在培训期间订购闻亭的Davinci开发板可享受优惠政策。


    联系人:   高小姐   021-34293702

    主办方:   德州仪器(TI)
                          闻亭数字系统(北京)有限公司
                          上海炜寅信息科技有限公司


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-18 13:15:246楼 得分:0
    再顶一把,没人看   就结帖了。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luoqintao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-18 13:59:197楼 得分:0
    不错的文章
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pjlpjl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-18 21:13:268楼 得分:0
    想问一个问题,不知道能否回答一下:什么是3GPP音视频打包?就是RTP打包吗?在3G网络上传输的音视频格式是什么样的阿?跟有线网络相同吗   ?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-22 09:36:229楼 得分:0
    楼上的:本人没有搞过无线网传输,不过有一点我觉得可以肯定的就是,不管是无线还是有线,都一样的,对于开发者来说考虑的可能就是带宽的问题,如果无线支持的传输带宽和有线一样的时候,你也可以传输mpeg2的数据了。不是说无线网一定要什么格式,有线一定要什么格式。考虑格式是因为带宽的问题。
    3gpp打包,rtp打包,这些术语我想你应该问google而不是我。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • highclous
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-22 10:55:0910楼 得分:0
    顶了!
    搂主继续!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-22 11:29:2511楼 得分:0
    写到这里,也不知道还能写些什么了,希望各位能提出具体的有针对性的问题,一起来讨论。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wincar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-22 12:36:3512楼 得分:0
    支持楼主,我提个问题。

          多点到多点的视频,用p2p怎么做?谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-22 12:47:5413楼 得分:0
    汗,这个偶不专业,要用到p2p的技术,关系到架构以及处理逻辑的问题,这就不是俺这种非专业人士所能解答的了,不过我的理解是技术含量和系统架构以及网络经验的要求非常高,不然搞出来的基本都是废品。。
    可以看看rtp协议,我想它对流的传输和控制基本够用了,需要的就是你要如何处理分发和共享机制也就是处理p2p的问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Oversense
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-22 20:59:0514楼 得分:0
    楼主挺不错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • SuperKan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-23 11:34:4915楼 得分:20
    Hi:
            At   it   happens   I   have   a   problem   how   to   let   WMP   load   our   source   streaming   filter.   You   known   WMP   can   play   remote   files   on   the   Internet;   I   guess   it   must   load   the   File   Source   (URL)   that   can   parse   the   protocol   of   http;   then   it   can   download   the   media   content   and   play   them.

                      So   I   want   to   do   like   the   File   Source   (URL)   to   load   our   source   streaming   filter   and   parse   the   protocol   RTSP.   And   I   do   followings:

    [HKEY_CLASSES_ROOT\rtsp]

    @= "RTSP "

    "Source   Filter "= "{11D7C001-211E-4492-BEDA-B0AF7348B12D} "

     

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shell\URLProtocols\rtsp]

     

                But   when   I   input   our   RTSP   address,   the   Windows   Media   Player   doesn’t   load   our   source   streaming   filter   automatically.   At   last   I   look   forward   to   your   good   advices   on   the   problem.   Thank   your   very   much.

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hsabrina
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-25 21:41:5816楼 得分:0
    搂主一年的时间把技术问题掌握得这样透彻,足以看得出学习和专研能力,而且主动把自己的总结奉献给大家为人豁达、并且总谦虚说自己水平如何。。。      
    搂主建立个QQ群吧?

    顶下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hailstonehailstone
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-27 16:58:3917楼 得分:0
    写的好极了。。。顶一个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-29 09:46:0218楼 得分:0
    QQ群就不必了。还是在这里讨论下吧。
    我会断断续续的把我的最近的心得发出来的,如果合适,我会把测试代码也打包发出来的,希望我的一点心得能让很多人少走点弯路。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • AlifeYuan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-29 15:25:2219楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • heliang1108
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-01-30 00:31:3020楼 得分:0
    呵呵,楼主是好人!
    不知在什么城市高就?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fly_dream_1001
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-02-01 00:10:5321楼 得分:0
    这样的帖子才有意义。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yzh_510
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-02-01 11:19:2422楼 得分:0
    对新手学习有不小的帮助!!   建议LZ有时间多发发这方面的帖子,帮助帮助新人!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • navi_dx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-02-02 10:16:3723楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-02-04 11:03:1524楼 得分:0
    我最近也在作流媒体传输的东西,等有结果了,我会陆续放出心得的。希望能和大家一起进步。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • suncft
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-02-06 11:26:0325楼 得分:0
    楼主,能不能指导一下我的问题啊.我可着急了..............
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 99263
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-02-06 16:13:5626楼 得分:0
    中华视频技术网:http://www.chinavideo.org   有相关的视频技术文章可供参考。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • karlfly
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-02-07 15:20:2827楼 得分:0
    顶,我是新手,对我很有帮助
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • toxyboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-02-07 17:07:0928楼 得分:0
    尽力帮你。。。。。对着空气喊。
    修改 删除 举报 引用 回复
    进入用户个人空间