2024年4月15日发(作者:)

29

卷第

11

2008

11

MICROCOMPUTERAPPLICATIONS

微 计 算 机 应 用

Vol

1

29No

1

11

Nov

1

2008

Windows

平台下应用

FFMPEG

实现

H

1

264

视频回放

刘马飞曾学文

 

12

3

 

倪 宏

2

(

1

中国科学院研究生院 北京 

100049

2

中国科学院声学研究所国家网络新媒体工程技术研究中心 北京 

100190

)

摘要

:H

1

264

ISO/IECMPEG

ITU-TVCEG

联合制定的最新的视频编码标准

,

其压缩性能和图像质量大大优于先前的视

频编码标准。然而

,Windows

平台上的

WindowsMediaPlayer

需要第三方插件才支持

H

1

264

格式视频的播放

,

很多插件如

ffd

2

show

等只支持

AVI

容器中的

H

1

264

播放

,

不支持

ASF

容器中的

H

1

264

视频播放。因此本文分析

Windows

平台的

DMO

等技

,

利用开源程序

FFMPEG,

实现在

Windows

平台下与

WindowsMediaPlayer

配合的支持

ASF

文件容器中

H

1

264

视频回放的插

件。

关键词

:DMO

 

FFMPEG

 

H

1

264

视频回放

BuildingH

1

264VideoPlaybackUseFfmpegontheWindowsPlatform

LIUMafei,ZENGXuewen,NIHong

122

(

1

GraduateUniversityoftheChineseAcademyofSciences,Beijing,100049,China,

2

TheNationalNetworkNewMediaEengineeringCenterofTheinstituteofacousticofChineseAcademy

ofSciences,Beijing,100190,China

)

Abstract:H

1

264isanewvideocodingstandardrevisedbyISO/IECMPEGandITU-TVCEG,whoseencodingperformanceisfar

beyondformervideoencodingstandard

Butinwindowsplatform,WindowsMediaPlayerneedsanadditionalcodecplug-inforpla

2

yingtheH

1

264video

1

Thereissomecodecplug-insupportingtheH

1

264videostreamformAVIfilecontainerplaybackunderWin

2

dowsMediaPlayerlikeffdshow,butTherearenofreecodecplug-insupportingtheH

1

264videostreamfromASFcontainerplay

2

back

1

Thispaperwillintroducehowtobuildacodecplug-inwithWindowsMediaPlayersupportingtheH

1

264videostreamfrom

ASFcontainerplayback,usingDMOtechniqueandopensourceprogramnamedffmpeg

1

Keywords:DMOFFMPEGH

1

264videoplayback

H

1

264/AVC

ISO/IECMPEG

ITU-TVCEG

联合制定的最新的视频编码标准。在同等还原图像

[1]

质量条件下

,

H

1

263+

MPEG4

相比

,H

1

264

能够节省一半的码率。

H

1

264

正以其高压缩率

,

优秀的图像

质量

,

低时延以及网络友好等特点

,

已经得到越来越广的应用。然而

Windows

平台下用户最熟悉的媒体播

放器

WindowsMediaPlayer

本身并不支持

H

1

264

编码格式的视频播放

,

而是需要另外安装

H

1

264

的解码插

件。

Windows

平台下最普通的媒体文件容器格式莫过于

ASF

AVI

。由于

WindowsMediaPlayer

的框架

特性

,

使得编解码插件对视频编码格式的支持

,

还与文件容器相关。目前能支持

AVI

容器中的

H

1

264

编码

格式视频播放的免费的插件有

ffdshow

CoreAVC

,

但能够配合

WindowsMediaPlayer

支持

ASF

容器中的

H

1

264

编码格式视频的播放的免费插件则没有。

ASF

容器格式是

Windows

平台下非常流行的一种适合流媒

 本文于

2008-08-01

收到。

 3基金项目

:

国家

863

计划。支持三重业务的地面电视无线回传关键技术与双向化方案研究

(

编号

:2007AA01Z230

)

[2]

© 1994-2011 China Academic Journal Electronic Publishing House. All rights reserved.

 

62

  

微 计 算 机 应 用

2008

 

体传输的容器格式

,

因此编写支持

ASF

容器中的

H

1

264

编码格式视频播放的媒体插件

,

对于应用来讲非常

有必要。

Windows

平台的流媒体系统中

,

由于

WindowsMediaPlayer

Windows

操作系统捆绑以及

Windows

作系统的普及程度

,

依赖

WindowsMediaPlayer

作为媒体系统的客户端呈现给用户可以使得用户友好性得到

增强

,

也可以节省开发新媒体播放器的成本

,

所以很多应用于

Windows

平台下的流媒体系统都是利用

Win

2

dowsMediaPlayer

作为媒体系统的终端。要使得以

WindowsMediaPlayer

作为客户端的

ASF

流媒体系统能

够采用

H

1

264

编码视频格式

,

就必须要有支持

ASF

容器中

H

1

264

视频播放的插件。通过探索

,

作者寻找到

一种利用

FFMPEG,

对其进行

DMO

封装实现配合

WindowsMediaPlayer

支持

H

1

264

视频播放的插件的

方法。

[3]

1

 

H

1

264

简介

H

1

264

是国际标准化组织

(

ISO

)

和国际电信联盟

(

ITU

)

共同提出的继

MPEG4

之后的新一代数字视频压

缩格式

,

它即保留了以往压缩技术的优点和精华又具有其他压缩技术无法比拟的许多优点。

(

1

)

低码流

(

LowBitRate

)

:

MPEG2

MPEG4ASP

等压缩技术相比

,

在同等图像质量下

,

采用

H

1

264

技术压缩后的数据量只有

MPEG2

1/8,MPEG4

1/3;

显然

,H

1

264

压缩技术的采用可以大大节省用户的

下载时间和数据流量收费。

(

2

)

高质量的图像

:H

1

264

能提供连续、流畅的高质量图像

(

DVD

质量

)

;

(

3

)

容错能力强

:H

1

264

提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具

;

(

4

)

网络适应性强

:H

1

264

提供了网络适应层

(

NetworkAdaptationLayer

)

,

使得

H

1

264

的文件能容易地

在不同网络上传输

(

例如互联网

,CDMA,GPRS,WCDMA,CDMA2000

)

;

[4][5]

H

1

264

标准还在不断发展

,SVC

(

scalablevideocoding

)

MVC

(

multi-viewcoding

)

添加作为

H

1

264

的修正的标准化工作正在进行中

,

因此

H

1

264

的功能将更加丰富

,

适用更多应用场景。我们有理由相信

,

H

1

264

标准将会受到业界的广泛应用

,

因此实现支持

H

1

264

播放的插件对

Windows

平台流媒体应用非常有

意义。

2

 

DMO

介绍及应用

Windows

媒体应用中

,

主要包括

DirectShow

DMO

DirectShow

是微软公司提供的一套在

Windows

平台上进行流媒体处理的开发包

,

DirectX

开发包一起发布

,

为多媒体流的捕捉和回放提供了强有力的

支持。

DirectX

媒体对象

(

DirectXMediaObjects,

简称

DMOs

)

,

是微软提供的另一种流数据处理

COM

组件

,

DirectShowfilter

相比

,DMO

有以下优点

:

(

1

)

DMO

filter

实现的功能要少很多

,

这使得

DMO

“体积”很小

;

(

2

)

DMO

使用起来比

filter

更有灵活性。

DMO

的使用不需要

filtergraph,

应用程序可以直接与

DMO

[3]

互。而

DMO

也可以通过一个

DMOwrapperfilter

工作于

DirectShow

环境。

(

3

)

DMO

总是同步处理数据

,

不像

filter

有独立的数据传送线程

,

需要考虑多线程编程问题

;

(

4

)

与传统的编解码管理器

ACM

VCM

相比

,

DMO

开发的编解码器是基于

COM

,

更易于扩展。并

DMO

支持多个输入和多个输出

;

(

5

)

DMO

不需要像

filter

一样分配数据传送的内存

,

而有

DMO

的使用者负责

;

(

6

)

DMO

是一个独立功能模块

,

不需要像

filter

一样连接成一条链路

;

(

7

)

DMO

不需要像

filter

一样将数据“推”下去

,

数据的输入输出都是由

DMO

的使用者完成的

;

所有这些优点

,

使得

DMO

成为微软对于

Encoder

Decoder

开发的重点推荐模式。

DirectX9

1

0SDK

© 1994-2011 China Academic Journal Electronic Publishing House. All rights reserved.

11

  

刘马飞等

:Windows

平台下应用

FFMPEG

实现

H

1

264

视频回放

63

,

微软更是把

DMO

DirectShow

中分离出来

,

而对于一些

transformfilter,

微软也推荐用

DMO

的方式来替

换。因此

,

本文选择用

DMO

来封装

H

1

264

视频解码插件。

3

 

FFMPEG

FFMPEG

是一套完整的录制

,

转换和流化音频和视频的开放源代码的解决方案

,

其包括以下几部分

组成

:

(

1

)

libavcodec,

一个包含了所有

FFmpeg

音视频编解码器的库1为了保证最优性能和高可复用性

,

大多

数编解码器从头开发的。

(

2

)

libavformat,

一个包含了所有的普通音视格式的解析器和产生器的库

,

该库里边包含解码

H

1

264

codec

(

3

)

ffplay,

SDL

FFmpeg

库开发的一个简单的媒体播放器。

(

4

)

ffserver,

基于

HTTP

用于实时广播的多媒体服务器。

(

5

)

ffmpeg,

视频文件转换命令行工具

,

也支持经过实时电视卡抓取和编码成视频文件。

FFMPEG

是基于

linux

平台上开发的

,

想要移植到

VC

平台上需要进行很大的改动

,

比较困难。幸好在

Windows

平台下可以利用

MinGW

编译

FFMPEG

代码

,

生成

avformat

1

dll,avcodec

1

dll,avutil

1

dll

三个动态连

接库

,

可供应用程序使用。

FFMPEG

的高性能设计

,

以及其包含的经过了优化的

H

1

264

解码算法

,

使得

FFM

2

PEG

解码

H

1

264

视频的速度相当快

;

H

1

264

开源解码器评测中

,FFMPEG

的解码速度最快。因此利用

FFMPEG

实现播放插件

,

解码速度快

,

占用内存小。

4

 代码实现

代码实现的主要任务是将

FFMPEG

封装在

DMO

对象中

,

DMO

对象与

WindowsMediaPlayer

协商媒

体类型、对象连接以及传递媒体数据

,

FFMPEG

负责将输入到

DMO

中的未解码的

H

1

264

视频帧解码成可

以显示的

RGB

格式的视频帧

,

然后交由

DMO

输出端传送予

WindowsMediaPlayer

进行显示。

在微软的

DirectXSDK

,

为开发

DMO

提供了一个

IMediaObjectImpl

模板类

,

使得开发

DMO

比较容易。

实现程序定制的

DMO,

只需派生此模板类

,

实现

17

个以

Internal

开头的函数。

4

1

1

 

FFMPEG

库的使用

使用

FFMPEG

,

首先应该将

avcodec

1

dll,avformat

1

dll,

avutil

1

dll

加入到工程中

,

并且在文件头中需要包含

avcodec

1

h

头文件

;

另外使用

FFMPEG

库的函数之前

,

需要对

FFMPEG

库进行初始化

,

因此本实现中是在

DMO

对象的构造

函数中实现

FFMPEG

库的初始化。通常的操作是通过

avcodec_init

()

以及

avcodec_register_all

()

初始化并注

FFMPEG

所有的编码解码器

;

然后通过

CODEC_ID_H264

指示码寻找到本

DMO

使用的

H

1

264

解码

,

:

codec=avcodec_find_decoder

(

CODEC_ID_H264

)

1

然后做编解码器上下文初始化及申请空间保存解码图像

,

:c=avcodec_alloc_context

()

;

picture=avcodec_alloc_frame

()

;

最后是根据得到的

H

1

264codec

以及解码上下文结构去打开

H

1

264

解码器

,

使其能够工作

,

:

avcodec_open

(

c,codec

)

;

具体代码可以参照

ffmpeg

源代码中的

output_example

1

c

中的示例代码。

4

1

2

 

InternalCheckInputType

函数

该函数的主要目的是检查

DMO

对象是否适合于此输入的媒体类型的解码

,

如果检查通过那么该

DMO

才可以用于此种类型视频的解码。本设计的

DMO

中实现的是

H

1

264

视频解码插件

,

因此

DMO

接收的输入

© 1994-2011 China Academic Journal Electronic Publishing House. All rights reserved.

 

64

  

微 计 算 机 应 用

2008

 

媒体主类型是视频

,

而媒体

subtype

则是

H

1

264

格式

;

所以只有当媒体类型符合此限制时

,

函数返回

TRUE,

检查通过。

4

1

3

 

InternalCheckOutputType

函数

该函数的目的是检查

DMO

对象是否能够产生此种媒体类型的视频输出

,

如果检查通过那么该

DMO

可以用于产生此类视频输出。解码器的目的就是将压缩的格式解码

,

成为无压缩可以直接显示的格式

;

这里

,

我们选择最普通的

RGB24

格式。

4

1

4

 

InternalProcessInput

函数

该函数的作用是输入一个未解码的图像帧

,

需要做的工作就是把帧对象保存

,

以待应用程序在

DMO

出端请求图像输出时

,

对此输入图像帧执行解码操作

,

属出解码图像。因为图像帧在图像中是通过

C++

COM

对象

IMediaBuffer

来保存的

,

因此我们只需要

IMediaBuffer

的接口函数

GetBufferAndLength

得到输入的

图像存放的内存块指针和大小

,

然后增加

COM

对象的引用计数

,

最后设置相关的时间戳即可。

4

1

5

 

InternalProcessOutput

函数

该函数的作用是将上次输入

DMO

的未解码的帧调用

FFMPEG

中的解码函数进行解码

,

输入

YUV

格式

的视频

,

然而我们最终要求输出的视频格式是

RGB

格式的

,

因此还必须将

YUV

格式的视频转换成

RGB

式的视频。幸好的是

FFMPEG

中有高度优化的函数

YUV2RGB

供我们使用。使用本

DMO

的应用程序会向

本函数请求输出解码图像

,

因此在这里我们调用

FFMPEG

中的解码函数对输入图像进行解码

,

把解码重建

后的图像输出

,

交由应用程序进行播放。具体的代码如下

:

len=avcodec_decode_video

(

c,picture,&got_picture,outbuf_ptr,size

)

;//

调用

FFMPEG

媒体库的解码

函数进行解码

YUV2RGB

(

picture->data[0],picture->data[1],picture->data[2],pOutData,pic_width,pic_

height

)

;//

调用

FFMPEG

媒体库的格式转换函数将

YUV

格式视频转换成

RGB

格式

4

1

6

 

DMO

注册函数

WindowsMediaPlayer

播放视音频时

,

会根据视音频的格式到系统注册表中寻找到相应的解码器

,

如果

找不到合适的解码器

,WindowsMediaPlayer

则播放不正常甚至无法播放。所以

DMO

程序需要在系统中进

行注册

,

DMO

本身是一个

COM

程序

,COM

程序的注册在

DllRegisterServer

中进行。因此在

DllRegis

2

terServer

函数中通过接口函数

DMORegister

在操作系统注册表中注册本

DMO

的信息。设置

DMO

的信息为

只有一个输入端

,

输入的是

H

1

264

格式的视频

;

设置

DMO

的信息为只有一个输出端

,

输出的是

RGB

格式的

视频。如此设置以后

,

WindowsMediaPlayer

播放

ASF

中的

H

1

264

视频时可以顺利地寻找到本插件

,

成功

播放

ASF

容器中

H

1

264

格式的视频。

//

定义输入媒体格式

DMO_PARTIAL_MEDIATYPEmt_input;

mt_input

1

type=MEDIATYPE_Video;

mt_input

1

subtype=MEDIASUBTYPE_H264;

//

定义输出媒体格式

DMO_PARTIAL_MEDIATYPEmt_output;mt_output

1

type=MEDIATYPE_Video;

mt_output

1

subtype=MEDIASUBTYPE_RGB24;

DMORegister

(

L

DMOSample

,//DMO

对象名

CLSID_Sample,//DMO

对象的序列

IDDMOCATEGORY_VIDEO_DECODER,//

视频解码器目录

0,

1,//

输入媒体类型个数

&mt_input,//

输入媒体类型格式

© 1994-2011 China Academic Journal Electronic Publishing House. All rights reserved.

11

  

刘马飞等

:Windows

平台下应用

FFMPEG

实现

H

1

264

视频回放

65

1,//

输出媒体类型个数

&mt_output

)

;//

输出媒体类型格式

到此

,

利用

FFMPEG

封装在

DMO

对象中构造一个能支持

WindowsMediaPlayer

播放

ASF

容器中的

H

1

264

视频播放插件所需要做的工作已经完成。

5

 结束语

鉴于目前缺乏配合

WindowsMediaPlayer

播放

ASF

媒体容器格式的

H

1

264

视频播放的免费插件

,

本文

介绍了一种简单实现此插件的方法

,

依赖于

DMO

高效性以及

FFMPEG

编解码库中性能优化的

H

1

264

解码

算法

,

使得插件解码速度快

,

内存损耗小。利用此插件

,Windows

平台上的

H

1

264

流媒体系统可以利用

Win

2

dowsMediaPlayer

作为媒体系统的客户端

,

节省开发新播放器的成本

,

大大增强了系统的用户友好性。

参考文献

1

 

DraftITU-Trecommendationandfinaldraftinternationalstandardofjointvideospecification

(

ITU-TRec

1

H

1

264/ISO/IEC

14496-10AVC

)

inJointVideoTeam

(

JVT

)

ofISO/IECMPEGandITU-TVCEG,JVTG050,2003

1

2

 

MicrosoftCorporation

1

AdrancedSytemsFormat

(

ASF

)

Specifrcation,Revision01

1

20

1

03,December2004[5]

1

3

 陆其明1

Drrectshow

开发指南1北京

:

清华大学出版社

,2003

1

4

 

T

1

Wiegand,G

1

J

1

Skuivan,J

1

Reichel,H

1

SchwarzanclM

1

wien,eds

1

JorntDraft7,JointVideoTeam

1

Doc

1

JVT-T201,Klagenfurt,

Austria,July2006

1

5

 

JorntDrafe6

1

0onMultviewVideoCoding

1

JDT-z209,Antalya,Turkey,Tan2007

1

© 1994-2011 China Academic Journal Electronic Publishing House. All rights reserved.