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.


发布评论