想实现网络上实时播放音视频流,不知该如何下手?任务到期了,还没有眉目,就快要二度失业了,现实可真残酷呀!高手们帮帮忙吧。最开始想用DirectDraw & DirectSound来做,但苦于对DirectDraw的一知半解,以及对二者同步技术、播放速率的控制技术不知如何去做,最终放弃。改用DirectShow来做,原理上讲,在客户端做一个source Filter即可以了,余下的事情让DS来自己完成。OK,一步一步来做吧。第一步,将我的流数据存储为AVI格式的文件,这样子的话,同步就解决了。本地播放正常。
第二步,将此文件做为数据源,源源不断地往客户机发送,在客户端接收后,也存储为一个AVI文件。OK,正常,证明网络传输部分是好的。
第三步,实现Source Filter ----->>>> 问题来了,怎么都不行。问题1:参考了网络上陆其明写的文章:
(http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=365)
他的文章是传输一个MPEG1的文件,需要改动一下。我将类型由:MEDIASUBTYPE_MPEG1System 换为:MEDIASUBTYPE_Avi,当然主类型没有换,仍为:MEDIATYPE_Stream。可是,程序在运行时,在执行到这一句:
HRESULT hr  = m_pGB->Render(m_pSourceReader->GetPin(0));时出错,出错信息如下HRESULT: 0x8004022f (2147746351)
Name: VFW_E_INVALID_FILE_FORMAT
Description: The file format is invalid.
Severity code: Failed
Facility Code: FACILITY_ITF (4)
Error Code: 0x022f (559)不知何故?问题2:实现这个Source Filter时,是不是与AVI的头有关呀?由于实时播放时,不能确定总的长度,但是播放速率(即帧率)是可以固定的。那么请问,这种方案是不是行不通呀?问题3:有没有其它的可行的好的实现方案?提示1:分数大大的有。我在深圳市,附近的朋友如能帮助解决,一起去酒吧表示感谢!!!!QQ:2073111
Email:[email protected]

解决方案 »

  1.   

    心有余而力不足,看到过一片相关文章,你看看能否帮你的忙。----同在深圳的兄弟。
    DirectX是关于多媒体编程的环境(SDK).DirectShow是关于Windows媒体捕捉与播放的编程环境(SDK).DirectShow微软DirectShow应用编程接口(API)是微软窗口平台上的流式媒体体系结构。
    使用DirectShow,你的应用可以高质量的视频、音频回放和捕捉。这本
    DirectShow资料分以下章节进行叙述:        DirectShow 介绍
     开始使用
     关于DirectShow
     使用DirectShow
     编码器的开发
     DirectShow指南
     DirectShow参考
     DirectShow样例
     DirectX媒体对象
     媒体参数
     附录
     术语表
    注意:图标表示微软站点外的一个URL连接。绝大多数这些外部连接都不在
          微软的控制之下。关于其他站点,请阅读微软的官方声明。DirectShow简介微软DirectShow是微软Windows平台上的流式媒体体系结构。DirectShow提供媒体流的高质
    量的捕捉与回放。它支持多种格式,包括高级流格式(ASF),活动图片专家组格式(MPEG),
    音频-视频交叉格式(AVI),第三层MPEG格式(MP3)和WAV文件格式。他也支持使用Windows
    驱动模型(WDM)设备或老的Windows视频设备的捕捉。DirectShow与其他DirectX技术集成于
    一体,自动感觉和使用视频和音频硬件加速,同时也支持没有硬件加速的系统。DirectShow简化了媒体回放,格式转换和捕捉任务。同时,他还为要求客户方案的应用提供
    对潜在的流控制体系的访问。你还可以建立自己的DirectShow控件以支持新的格式和客户效
    果。你可以用DirectShow写的典型应用包括DVD播放,视频编辑应用,AVI到ASF转换,MP3播放和
    数字视频捕获应用。DirectShow是基于控件对象模型(COM)的。要写DirectShow应用,你就必须理解COM客户编
    程。就绝大多数应用而言,你不必实现你自己的COM对象。DirectShow提供了你需要的控件。
    (如果你想要通过写自己的控件来扩展DirectShow的功能,你必须把他们作为COM对象来实
    现。)这一节包含下面的题目。 路标(Roadmap)
     DirectShow中的新东西
     DirectShow支持的格式 
     DirectShow的FAQ路标这一节描述微软DirectShow资料是如何组织的。
     
    如果你以前有DirectShow的使用经验,读DirectShow中的新东西一节。他描述了微软DirectX 8中
    包含的新特征。如果你是DirectShow的新手,从这一节开始。然后阅读这篇文章,使用DirectShow来写各种应用
    (如回放,捕获或DVD)关于DirectShow体系的更多细节信息请参阅关于DirectShow一节。如果你感兴趣与写视频编辑应用,你可以从DirectShow编辑服务的介绍性素材入手,并且然后阅
    读这份资料后的其他部分。在过去,要实现客户数据的转换,你必须写一个DirectShow的滤波器。现在,你可以通过写
    DirectX的媒体对象以简单的方法完成相同的任务。请阅读DirectX媒体对象以获得更多信息。(
    你仍然可以写DirectShow滤波器。参见写DirectShow滤波器一节。)
    下面各节介绍DirectShow的信息从此处开始介绍DirectShow应用开发。描述基本概念并介绍一系列简单应用以使你开始DirectShow编程。如果
    你是DirectShow的新手,仔细阅读这一节。关于DirectShow提供关于DirectShow体系结构的高级背景信息,以及应用开发主题如构件图表。使用DirectShow含有写DirectShow应用所必须的信息。围绕这个主题的各节都围绕特定的应用领域而组织,如视频
    捕获,DVD回放,数字视频和视频编辑。解码器开发含有写软件解码器开发者有用的信息。DirectShow指南含有关于DirectShow应用编程的逐步指导。这一节描述了一定数量的基本任务,这些是在写
    DirectShow应用时必须了解的,如设备的枚举。DirectShow参考包含完整的DirectShow应用编程接口(API)的参考。他也包含了DirectShow提供的滤波器资料。DirectShow样例描述这个SDK中包含的应用和滤波器样例。DirectX媒体对象DirectX媒体对象(DMOs)是一种写数据流控件的新方法。就象DirectShow滤波器一样,DMOs取
    得输入数据和使用它来产生输出数据。然而,DMOs比DirectShow滤波器更容易建立,测试和使用。媒体参数媒体参数是一个新的APIs集合,他支持运行时对对象特征的改变。他们提供迅速变化的和要求高
    性能和可重复性特征的精确控制。附录含各种技术信息,包括排错信息,用C写DirectShow应用的信息,国家/地区码,和废旧特性列表。素语表定义DirectShow中使用的素语和概念。--------------------------------------------------------------------------------------
      

  2.   

    DirectShow中的新东西这篇文章描述了微软DirectX 8.0中关于DirectShow的新特征。 对Windows媒体格式的支持
     DirectShow编辑服务
     新的DVD支持
     新的MPEG-2传输和节目流支持
     微软TV技术(广播驱动体系结构BDA)
     DirectX视频加速
     新的滤波器
     新的滤波器图表特征
     关于构建环境的改变
     新的图表编辑特征
     DirectX媒体对象
     媒体参数对Windows媒体格式的支持
     
    有两个新的滤波器允许DirectShow应用程序读写微软Windows的媒体格式文件。ASF阅读滤波器读
    出并分析Windows媒体格式文件。ASF写入滤波器书写Windows媒体格式文件;它也做一些必要的
    复用与压缩。DirectShow和Windows媒体软件开发工具提供关于建立和回放Windows媒体格式流的
    应用程序的补充说明。关于更多信息请参见Windows媒体应用一节。
    DirectShow 编辑服务(DES)DirectShow 编辑服务是一组支持视频编辑和顺序视频回放的API函数。你可以使用DES来建立各种
    应用程序。例如,仅用几个方法调用,就可以顺次集成音频和视频的剪裁、增加效果,和回放其
    操作结果。或者,建立一个完整的视频编辑系统。DES是构建于DirectShow体系内核之上的。他提
    供了为非线性视频编辑特别设计的接口集。DES取代了不再被支持的裁剪列表。新的DVD支持两个新的接口IDVDControl2 和 IDVDInfo2极大地扩展了DVD导航器的功能。其新的MSWebDVD ActiveX
    控件使这些功能对基于脚本的应用也是可用的。新的DVD特征包含下面的功能: 支持多声道的卡拉OK功能
     关于S/PDIF输出的AC-3支持
     通过IBasicAudio接口进行音量控制
     支持帧步进和帧精确寻找
     简化对DVD文字信息串的访问
     改进对父进程管理控制的支持就更多信息,请看DirectShow的DVD应用开发一节。新的MPEG-2传输和节目流支持一个新的滤波器,MPEG-2多路选择器,在推送模式下(从活动源接受数据)提供对MPEG-2传输流
    和节目流的支持。更多信息请看MPEG-2多路选择器和写数字TV应用一节。微软TV技术(广播驱动体系结构BDA)微软TV技术包括对新的广播驱动体系(BDA)和微软调谐模型的支持。广播驱动体系定义一种框架,这种框架
    支持用于接收数字和模拟电视的各种拓扑构成。他包含了用于网络构造和控制的软构件,多路选择,表分析
    和IP数据递送以适用于主要的数字TV标准包括DVB和ATSC。调协模型是一个对象集,他允许应用以一种简单和
    一致的方法跨各种网络类型容易地进行调谐。更多信息请看写数字TV应用一节。DirectX视频加速对译码器的开发者:DirectX视频加速是一个应用编程接口(API),对于数字视频译码处理的硬件加速
    相应的也是一个设备驱动器接口(DDI),他还具有对DVD子图目的的α混响支持。它提供了聚焦于支持
    MPEG-2主要视频(形式上有ITU-T H.262 , ISO/IEC 13818-2)的接口定义。它也企图支持其他关键的
    视频解码(即:ITU-T 推荐的 H.263 and H.261, and MPEG-1 and MPEG-4)。更多信息请看DirectX视
    频加速一节。新的滤波器DirectShow包含几个新的滤波器: ASF书写器:   写Windows 媒体格式文件。
     ASF阅读器:   读和分析Windows媒体格式文件。
     MJPEG解压器:   解码视频流从动态JPEG到非压缩视频。
     MJPEG压缩器:   使用动态JPEG压缩方法压缩一个非压缩的视频流。
     MPEG-2多路选择器:多路选择MPEG-2传输和来自活动源节目流。
     空回扫器:   放弃没有显示或扫描采样数据的采样。应用可以使用这
         个滤波器来放弃来自流的数据。
     强行采样器:   恢复媒体采样就象它们实际通过滤波器图表一样。应用
         可以使用这个滤波器来获得中间帧或其他媒体数据。新的滤波器图表特征滤波器图表管理支持几个新的特征:
     动态图表构建。现在你可以在图表正在运行期间产生对滤波器图表的改变。以前
     要增加或删除滤波器,应用必须停止图表的运行,此时要中断数据流。更多信息
     请看动态图表构建。 活动源同步。DirectShow现在支持活动源同步。例如,活动音频流可以与一个活动
     视频流同步。更多信息请看DirectShow中的时间和时钟一节。 帧步进。滤波器图表管理曝露了新的IVideoFrameStep接口,他允许应用一次一帧地
     遍历一个视频文件。关于构建环境的改变 一个新的头文件DShow.h替换了以前的Streams.h头文件。 基于类的滤波器现在出现在SDK根目录的\Samples\BaseClasses目录下要使用他们,
     你就必须构建这个基于类的库并且将他们连接到你的工程中。更多信息请看使用基
     于类的DirectShow一节。新的图表编辑特征图表编辑包含一些新的特征,他们作为检测和排错工具,增强了图表编辑的用途。 “图表侦测”:现在图表编辑可以加载由外部过程建立的滤波器图表。用这个特征
     实际的查看你的应用构建的是什么滤波器图表,在你的应用中仅仅有最少量的附加
     代码。更多关于这个特征的信息请看加载外部过程的图表一节。 滤波器信息:当你从图表菜单中选择插入滤波器时,滤波器列表中现在包含了每一
     个滤波器的注册信息,包括优点,连接数,和每一个连接的注册类型。要查看这些
     信息,单击观察树中滤波器后的加号(+)即可。关于图表编辑的更多信息请看用图表编辑仿真图表构建一节。DirectX媒体对象DirectX媒体对象(DMOs)是一种新的写数据流部件的方法。如DirectShow滤波器一样,DMOs取得
    输入数据和用它产生输出数据。然而,DMOs应用编程接口比相应的DirectShow的APIs要简单得多。
    因此,DMOs比DirectShow滤波器更容易建立,测试和使用。DMOs是完全与DirectShow兼容的。当你需要DirectShow提供的服务时,你可以象使用滤波器一样使
    用DMOs。如图表同步,智能连接,自动数据流处理,和线程管理。然而,DMOs不需要滤波器图表,
    所以,应用可以使用DMOs而不使用DirectShow。更多信息请看DirectX媒体对象一节。媒体参数媒体参数是一个新的APIs集。他支持运行时改变对象特征。他们提供对特征的精确控制,如特征的
    迅速改变和对高性能和可重复性的要求。他们允许特征沿实际曲线实时变化,如正玄波形或反平方
    曲线等。使用媒体参数,数据转换对象可以支持控制运行时行为的标准接口。对于音频效果DMOs和滤波器他
    们特别有用。例如,在显示效果中,潮湿(处理过的)信号对干燥(未处理)信号的比率可以沿一
    条平滑曲线变化。这种类型的行为在音频工程中是极其危险的,要避免在录音中人工引用。更多信息请看媒体参数一节。------------------------------------------------------------------------------------------
      

  3.   

    DirectShow支持的格式DirectShow是开放体系结构的,也就是说他可以支持任何格式,只要这个格式有其滤波器进行分析和
    解码即可.微软所提供的滤波器,或者是随DirectShow发布的或者是作为Windows操作系统部件发布的
    都提供了对下面文件和压缩格式的默认支持.注意:星号(*)表示DirectShow应用必须使用Windows媒体格式(SDK)来支持这种格式.更多信息请看文章
    Windows媒体和DirectShow:基于Windows的媒体应用的选择.文件格式:
     Windows媒体音频(WMA)* 
     Windows媒体视频(WMV)* 
     高级流格式(ASF)* 
     运动图片专家组(MPEG) 
     音视频交互格式(AVI) 
     QuickTime (版本2或更低) 
     WAV 
     AIFF 
     AU 
     SND 
     MIDI 压缩格式: 微软Windows媒体视频编解码版本7.0*
     ISO MPEG-4视频版本1.0*
     微软MPEG-4版本 3* 
     Sipro Labs ACELP* 
     Windows 媒体音频* 
     MPEG 音频层-3 (MP3) (仅解压缩) 
     数字视频(DV) 
     MPEG-1 
     MJPEG 
     Indeo 
     Voxware* 
     Cinepak 微软并不提供MPEG-2解码器,有几个来自第三方的DirectShow兼容硬件和软MPEG-2解码器是可用的.就发布DirectShow应用而言,关于特殊的第三方编解码器的可用性,请联系编解码器生产商.
    ----------------------------------------------------------------------
    DirectShow的FAQ(快速问题解答)这篇文章回答经常询问的关于WindowsDirectShow的问题.他包含下面个节: 一般问题
     编程问题 一般问题什么样的操作系统支持DirectShow?支持DirectShow的操作系统有:微软的Windows 9X,微软的Windows 2000,和微软的Windows Me.需要多少控件(COM)知识进行DirectShow编程?对应用开发而言,你需要理解COM对象的基本工作原理:怎样实例化,怎样访问他们露出的接口,和怎样
    适当地管理这些接口的引用记数.滤波器开发者可能要求更多一点的COM知识.更多的信息,请看这个
    帮助文件中,在DirectX 8.0介绍一章下的用C/C++进行DirectX编程这个主题.DirectShow支持什么格式?请看DirectShow所支持的格式一节.有DirectShow硬件兼容性列表吗?没有.DirectShow使用微软DirectDraw和微软DirectSound硬件能力,如果他们是可用的.当没有特别的
    可用硬件时,DirectShow使用GDI来画视频和波表输出媒体APIs进行音频播放.写DirectShow应用可以使用什么语言?DirectShow初始为C++开发而设计.(也可以使用C)用微软的VB,你可以DirectShow API的一个大子集
    但是,对VB的支持是不完整的.DirectShow支持基于脚本的DVD应用,脚本可以使用微软的JScript或VB
    进行编辑.使用Borland Delphi写DirectShow应用也是可行的;然而,在这部SDK资料中不能找到这个
    主题.更多的信息请看下面一些主题: 用C控制滤波器图表 
     在VB中使用DirectShow 
     写基于脚本的DVD应用
     
    进行DirectShow开发需要什么样的编译器?任何能够生成部件对象模型的编译器都应该能行,只要编译器环境正确地构造即可.如果你使用了
    微软VC++以外的编译器,你就需要重构基本类库,因为编译器之间有差异.DirectShow怎样关联到微软Windows媒体?参见Windows媒体应用一节.DirectShow怎样关联到微软DirectX的其他控件?内部上讲,当硬件支持的时候,DirectShow使用DirectSound 和 DirectDraw.(视频扫描使用
    DirectDraw 7的表面.他并不使用新的微软Direct3D的APIs.)你并不需要使用其他的DirectX APIs
    来写DirectShow应用,尽管他可能结合了DirectX APIs.作为例子,请查看Texture3D样例应用.DirectShow的前一个版本是 6.0.他开始封装了DirectX 媒体 SDK.当DirectX 媒体SDK受到抨击时,
    DirectShow被拿到DirectX SDK中.因此,DirectShow的版本号从6.0 跳到 8.0.DirectShow怎样关联到微软的ActiveMovie?ActiveMovie是DirectShow初期的名字.ActiveMovie术语以后不在被使用.DirectShow仅限制于多媒体应用吗?DirectShow包含的默认控件是为多媒体而设计的.然而,DirectShow体系对其他数据流方案也是有
    用的.GraphEdit实用源是可用的吗?GraphEdit可不可以再发布?不,这个源是不可用的,并且Graphedt.exe不能再发布.DMOs代替DirectShow滤波器行吗?微软DirectX媒体对象(DMOs)可用于DirectShow应用中.对编码,译码和效果,我们鼓励写DMO,而不是
    DirectShow滤波器.对于其他目的,DirectShow滤波器可能更为合适.更多信息请参见DirectX媒体对
    象.在那里可以获得更多信息?
     
     Web网:MSDN DirectX开发者中心 电邮列表:http://discuss.microsoft.com/archives/DIRECTXAV.html.        一部分其文字显示如下: 
        这个列表的主要功能是提供一个论坛,在此论坛上,使用微软音频和流式媒体技术
        (DirectSound, DirectMusic, DirectShow)的开发者和内容提供者可以交换信息
        和想法.这个列表可以满足各层次DirectX专家的需要,无论他是初学者或是高级
        开发人员.    我们期望微软DirectX各个开发小组的成员回顾和讨论列表中的主题,DirectXAV并
        不打算成为微软支持的论坛并且也没有微软职员直接响应咨询的保证.通常你最好
        的帮助来源应该是DirectXAV社团的其他成员,他们在过去曾经遇到过类似的问题.    对于这个列表,所包含的适当的主题是:使用DirectMusic生成器的合成技术;音频,
        音乐和流式视频编程技术;声音设计技术;关于相关APIs的一般问题和信息;代码片
        段;建议;提示和暗示;设备驱动器品质;未来特征需求;使用APIs的实在经验等.    要订阅DirectX DEV,发送包含订阅directxdev信息体的的电邮到:
                         [email protected]
        要订阅DirectX A/V,发送包含订阅directxav信息体的电邮到:
           [email protected] UseNet: microsoft.public.multimedia.directx.dshow.programming  
      

  4.   

    你的传avi文件流的DirectShow方案中,我认为可能与包的大小有关。
    我不太明白你为什么要传输Avi呢? mpeg不是更好吗?
      

  5.   

    是不是你的系统里没有合适的avi解码器?
      

  6.   

    mpeg1固定每次读取32768个字节
    而avi是变化,可能是几个字节,或者几百k
    你研究一下那个read函数
    我做过这个程序,客户端可以播放
      

  7.   

    标准的AVISplitter要读取文件后面的索引信息,因此,它只能对一个完整的Avi文件进行播放。如果要在线播放,好像要自己写一个AVISplitter