Microsoft Windows CE 3.0中的多媒体流应用(下)

类别:VC语言 点击:0 评论:0 推荐:
  Windows Media Protocols

下列协议被WMT所支持:multicasting,local file streaming, HTTP streaming, 和 MMS streaming.

Multicast(多点传送)使客户端可以接受到multicast流。这允许系统管理员向网络上的许多用户发送一份内容的拷贝,只要网络允许多点传送。IP Multicast streaming是通过ASF使用Microsoft Windows Media Station Metafile的。当网络不支持多点传送或者ASF文件被Windows Media服务器流化,则网络通过unicast来传送。Unicast的意思是一个流被发送给每一个请求。

WMT可以使用永久存储来为系统提供本地文件流。数据被从永久存储中读入主内存的一个缓冲区并rendered。本地文件流支持lower latency 和一个重要的物理内存存储,在播放文件前,将全部的ASF文件从永久存储读入主物理内存。

MMS是Microsoft的流媒体私有协议。一个典型的MMS session 使用一个TCP连接来发送和接受媒体控制命令,并使用TCP或者UDP连接控制数据流。调用MMS协议使用 mms:// 调用协议rollover机制。一个客户端首先尝试使用UDP来接受流。如果UDP不能工作,流自动通过TCP连接传送。最后,如果TCP不工作,客户端将尝试使用HTTP来接收流。MMSU 是客户端能够通过UDP来接受流。这对音频传输非常适合,因为它发送包而不管连接质量。因此,用户听起来延迟和暂停较少。如果时间允许,丢失的包会被重新请求,并被重发。MMST使客户端能通过TCP来接收流。TCP组成可靠的流,如果包丢失了,流将停止,丢失的包被重发。当网络拥挤时,用户会听到更多的延迟和暂停。

一个正常的HTTP服务器可以传递ASF数据流,但是因为几个原因使得它被Windows Media Server 代替。ASF数据流中的包必须被连续传递,一个per网络包,对数据流的所有好处被实现。只有ASF-compatible服务器,例如Windows Media Server,会通过一次传递一个ASF包的方式避免破裂,巧妙的压缩进单独的Internet或者其他网络协议的包中。错误修正、流回放和bit-rate优化,ASF以来于ASF数据包传送开始和结束时客户端和服务器端的计算结果。HTTP服务器没有这个能力,因为它不认可ASF包的重要性;它在尽可能快的情况下,将数据推到客户端,通过填充相当于数据总数多个的数据包。加上,Windows Media的几个特性,比如fast-forward或者rewind ASF数据流的能力,是不能被一个正常的WEB服务器支持的。

Windows Media Codecs Windows 媒体解码器

下列表格列出可以被包含在ASF文件内部的支持的解码器。Windows CE WMT只支持被Windows Media Tools创建的内容。Windows Media Encoder使用模板将动态源或者AVI, WAV, MP3内容编码转换到ASF格式,使用下面表中的解码器。模板也支持使用其他解码器的选择,但是DirectShow for Windows CE只支持WMT解码器。虽然其他解码器(比如Cinepak或者MPEG-1) 可以通过其他工具来创造ASF文件来被DirectShow for Windows CE,这里不保证它们流的性能,不推荐使用它们。

Codec name Description

 

MPEG-4 v3, v2 MS MPEG-4 video codec; up to 30 fps QCIF (176x144) - CIF (352x288) resolution video at 28.8 kbps – 300 kbps

WMAudio v2 New Windows Media audio codec based on non-uniform modulated lapped bioorthogonal transforms (NMLBT) in place of DCT for perceptual coding of both voice and high-fidelity; 8 – 48 kHz stereo at 56 – 128 kbps; near-FM quality at 28.8 kbps and near-CD quality at 64 kbps

ACELP.net Sipro ACELP voice codec; speech-quality 8 – 16 kHZ mono at 5 – 16 kbps

MPEG-1 Layer 3 Fraunhofer MP3 perceptual audio codec; near-CD quality at 128 kbps

 

WMT for Windows CE的componentization允许你创建完全自定义的流媒体客户端,裁减你指定的流环境。WMT for CE 可以被分割,使你可以决定那些组件被包括进你的应用程序中。下列组件可以被适当选取。

MMS streaming

HTTP streaming

File streaming

Broadcast and Multi Bit Rate Streaming

Windows Media Station support

ASX support

Codecs

DirectShow

DirectShow提供播放本地或者网络服务器上的多媒体流的底层支持。可以明确的是,DirectShow可以播放被压缩在各种文件和流格式中的视频和音频内容,包括Windows Media, MPEG, Audio-Video Interleaved (AVI), 和 WAV.

应用程序通过和filter graph manager通讯,控制filter graph 的行为。你可以间接地控制Microsoft Windows Media Player控件或者直接调用COM接口的方法。

DirectShow services 的核心是用来调用 filters pluggable components 的模块集,可以根据媒体类型准备连接配置来调用filter graph。Filters对数据流进行read, parse, decode, format, 或者 render等操作。

Filters通过一个结构来调用filter graph,被Filter Graph Manager (FGM)约束。一个DirectShow filter graph(见图二)由一组被控制的filters序列组成,从source到最后的renderers,所有的连接通过filter pins输入或者输出。当媒体类型被他们支持时,Filter pins负责进行协商。FGM控制多媒体数据在graph filters之间流动。因为DirectShow是一个灵活的、可重构的filter graph体系结构,DirectShow可以使用相同的软件组件来支持许多媒体类型的回放和流动。开发者也可以通过写自己的filters的方式来扩展DirectShow的多媒体支持

Figure 2. DirectShow Filter Graph (multimedia2.gif)

Filter Graph Manager

一个应用程序使用Filter Graph Manager (FGM)接口来创建、连接和控制filter graphs。过滤器使用FGM接口发布事件通知,在需要的时候强制filter pins重新连接。特别的是,IGraphBuilder接口允许应用程序调用filter graph manager来尝试创建一个complete filter graph,或者在只给出部分信息的情况下创建partial filter graph,例如只给出文件名或者两个分开的pins的接口。filter mapper查看注册表中可以用到的filter,正确配置filter graph。IGraphBuilder接口创建一个filter graph,从filter graph中添加或者删除filters,列举filter graph中所有的filter,并在加入一个filter时强制连接。filter graph在适当的时候被建立,应用程序需要创建一个IGraphBuilder接口的实例,并调用RenderFile方法。

另外,FGM暴露媒体控制和媒体配置接口给应用程序。媒体控制接口,IMediaControl,允许应用程序发送run, pause, 和 stop 命令控制流。当Run方法被调用,回放开始。媒体配置接口,IMediaSeeking,让应用程序指定播放的流的部分。

在内部,FGM将使用每个filter的BaseFilter接口来查找和列举filter的输入和输出pins。

Filters

Filters是完成大多数媒体处理任务的、注册的DirectShow类。Filter 任务包括:

Source acquisition (e.g., acquire a media stream)

Parsing (e.g., perform packet reading, splitting, and formatting on the stream)

Transformation (e.g., decode WMA and MPEG-4 audio and video streams)

Rendering (e.g., generate audio PCM or video RGB/YUV output at the right time and pass data on to DirectSound and DirectDraw)

Filters使用几个类型的接口,例如pins, enumerators, transports, 和 clock接口来完成任务。Filters实现和暴露许多接口。FGM使用这些接口创建、连接和控制graph。一个filter总会实现IBaseFilter接口,它包含下列方法:

Run, stop, and pause filter state

Retrieve filter and vendor information

Get and set the reference clock

Retrieve filter state information

Enumerate filter pins

Locate pins when rebuilding a filter graph

每个filters暴露一个IBaseFilter接口,使Filter Graph Manager可以执行run, pause, 和 stop 等命令。 Filter Graph Manager 是在正确的次序中调用这些方法的原因。你的应用程序不应该直接操作。

事实上,不同于IBaseFilter接口,只有 renderer filter 暴露IMediaSeeking接口。因此,Filter Graph Manager 只是通过配置信息来调用renderer filter。然后,renderer通过配置控制信息,通过回溯IMediaSeeking接口暴露的pins,只是简单地通过。媒体流的配置实际上是被输出pin控制,使之找到正确的位置,通常一个parser filter像 AVI splitter。

Windows CE DXPAK 1.2支持下列DX 6.1 DirectShow filters:

Source Filters—File Source (Asynchronous and URL)

Parsers and splitters—MPEG-1 Stream Splitter, AVI Splitter, QuickTime Parser, WAVE Parser, MIDI Parser, ASF Parser, ASX Parser, ASF Splitter

Decoders—MSAudio Decoder, MPEG-1 Audio Decoder, MPEG-1 Video Decoder, MPEG-4 Video Decoder, AVI Decompressor, ACM Audio Decompressor

Renderers—Audio Renderer (using WaveOut), DirectSound Audio Renderer, MIDI Audio Renderer, Video Renderer (using either DirectDraw or GDI)

Miscellaneous filters—Overlay Mixer

为了支持Windows Media Formats的流,特殊的ASF/ASX streamer source和WMA codec transform filters 被提供。另外,Fraunhofer MP3 audio 和 Sipro ACELP.net speech codecs 使用Audio Compression Manager (ACM) wrapper Audio Decompressor transform filter。

DirectShow广播技术和DV filters没有被包含在DXPAK中,但是可以在Windows CE WebTV Microsoft TV (MSTV) Kit 中被使用。

 

Example

例子

DirectShow可以使用它来播放或者传输多媒体文件。这里是一段简单的代码片段,演示如何写一个多媒体文件播放程序(注意为了简化代码,我们没有校验QueryInterface的返回值)。

HRESULT PlayMovie(LPTSTR lpszMovie)

{

// we will use several DirectShow interfaces

IMediaControl *pMC = NULL;

IGraphBuilder *pGB = NULL;

IMediaEventEx *pME = NULL;

 

long evCode; // something to hold a returned event code

 

// instantiate a filter graph as in-proc server

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,

                        IID_IGraphBuilder, (void **) &pGB);

 

// we’ll use this interface to build the graph

hr = pGB->QueryInterface(IID_MediaControl, (void **) &pMC);

 

// we’ll want to wait for completion of the rendering, so we need a media

                     event interface

hr = pMC->QueryInterface(IID_IMediaEventEx, (void **) &pME);

 

// now we’re ready to build the filter graph based on the source file data

                     types

hr = pGB->RenderFile(lpszMovie, NULL);

 

// play the source file

hr = pMC->Run();

 

// block application until video rendering operations finish

hr = pME->WaitForCompletion(INFINITE, &evCode);

 

// release interfaces

}

几个注释是有用的。CoCreateInstance 实现了一个filter graph对象,但是不包括filters,就象它不知道什么媒体类型会被播放。一旦知道媒体类型,它返回IGraphBuilder接口将创建filter graph。通过查询IMediaControl接口可以得到媒体播放、停止、暂停的状态。自从 Windows CE 通常支持进程内COM服务器,CLSCTX_INPROC_SERVER 是通过CoCreateInstance创建的仅有的有效服务器,其他调用都将返回E_NOTIMPL。

IGraphBuilder被用来创建一个filter graph,从中添加或者删除filters,列举filter graph 中的所有filters,当加入filter时强制连接。我们可以使用它们的RenderFile方法来建立graph。最终的graph结构以来于源文件所包含的视频或音频格式。最后,我们可以使用IMediaController::Run回放文件。如果我们想让应用程序等待播放完成,我们可以添加IMediaEvent::WaitforCompletion。

For More Information 附加信息

你可以在下面的网址找到更多关于Windows CE DXPAK的信息。

http://www.microsoft.com/presspass/press/2000/Feb00/DxpackPR.asp.

本文地址:http://com.8s8s.com/it/it2113.htm