( 作者:孙德生 深大硕士研究生 )
FLV
流媒体格式是一种新的视频格式,全称为
Flash Video
。
Flash MX 2004
对其提供了完美的支持,它的出现有效地解决了视频文件导入
Flash
后,使导出的
SWF
文件体积庞大,不能在网络上很好的使用等缺点。
FLV
是
Macromedia
公司开发的属于自己流式视频格式。这种格式是在
sorenson
公司的压缩算法的基础上开发出来的
[20]
。
FLV
压缩与转换非常方便
,
适合做短片。一般
FLV
包在
SWF PLAYER
的壳里
,
并且
FLV
可以很好的保护原始地址
,
不容易下载到起到保护版权的目的。
Macromedia
为了尽早用
FLV
格式来垄断
Web Video
应用,取代
RM
在线视频播放的霸主地位,在
FlashMX2004
中匆匆增加了一个
Video
类,短短两三年的时间,
FLV
就成为了目前最主流的在线视频播放格式,随着被新一代的视频播客网站广泛采用,自从
youtube
火了以后,
flv
格式也开始火暴,目前国内视频分享网站
,
比如六间房
、
5Show
、
56
、优酷等都使用
flv
了这个文件技术来实现的。目前
GOOGLE YOUTUBE
采用
FLV
,
SOUV.NET
集合全亚洲最多的
FLV
,以及
百度、新浪、腾讯、猫扑、
Maxthon
、雅虎等国际国内著名互联网公司的相继投入与看好,以及国际资本大量进入视频播客领域,
FLV
格式被极大的推广,甚至新浪在自己的
BBS
也开通了
FLV
影片上传播放服务
[21]
。
5.5.1 FLV与RMVB对比
我们都知道一般的视频文件,要不就是
asf
格式、
wmv
格式使用
mediaplayer
进行播放,要不就是
rm
格式用
RealPlayer
播放。这样的问题是,格式的不同就需要选择不同的播放器,这对于本地计算机没有安装相应播放器的用户来说,这些视频根本无法收看。并且,还由于这些文件的容量过大,下载慢,查看也不很流畅。所以,解决播放器和容量的问题,运用
Flash
有个方法:将各类视频文件转换成
Flash
视频文件。容量方面,从
FlashMX2004Pro
起就支持了转换为
Flash
视频的功能,经过相关设置后,可缩小原有视频的容量,最终转换的文件扩展名是
FLV
。
下面就把
RMVB
和
FLV
这两种主流视频文件格式简单对比分析如表
5-5
。对于两种格式,谁更出色,而另一个主要方面就是哪种格式更适合便携式产品采用。
表5-5 RMVB和FLV两种视频文件比较分析
:
|
RMVB
格式
|
FLV
格式
|
分辨率
|
(
700-800
)
*
(
272-350
)之间
|
一般播课网影片分辨率为
320*240
|
帧速度
|
24
、
25FPS
|
20FPS
左右
|
文件体积
|
约
5M
/
分钟,一个影片文件体积在
400-700M
之间
|
约
1.5M
/
分钟,一个影片体积在
200M
左右
|
视频主要类型
|
电影
/
电视剧(动漫)
/
综艺节目为主
|
电影、电视剧(动漫)、游戏、新闻、体育视频录象、综艺节目视频、网友自拍影片、视频等
|
下载行为
|
在
BT
网站论坛检索,获得影视下载信息,使得
P2P
模式
BT
软件下载
|
从
WEB2.0
播客获得,可使用多
FLV
下载软件
|
我们可以看到目前
RMVB
影片的最大优势是分辨率更高,在电脑上实际播放效果更出色,视频影片多为长片,文件体积较大,需要通过
BT
或者电驴软件下载。
FLV
的最大优势是资源类型丰富与文件体积较小,由于分辨率低,在电脑上播放画面质量不如
RMVB
。但是在
PMP
上取决于
LCD
屏的分辨率,因为
PMP
产品的
LCD
屏不可能很大,所以在这方面
FLV
格式的优势还是有很大优势的。
由于网络播客网站越来越受消费者欢迎,
FLV
视频已经已经无限量,比
RMVB
更丰富、种类更多的
FLV
视频资源可直接下载到
PMP
中播放。
5.5.2FLV解码软件开发
FLV
解码软件开发的开发,在本课题中是利用的
FFmpeg
为基础的。
FFmpeg
是一个集录制、转换、音
/
视频编码解码功能为一体的完整的开源解决方案
[23]
。
FFmpeg
的开发是基于
Linux
操作系统,但是可以在大多数操作系统中编译和使用。
FFmpeg
支持
MPEG
、
DivX
、
MPEG4
、
AC3
、
DV
、
FLV
等
40
多种编码,
AVI
、
MPEG
、
OGG
、
Matroska
、
ASF
等
90
多种解码。
TCPMP, VLC, MPlayer
等开源播放器都用到了
FFmpeg
[24]
。
FFmpeg
主目录下主要有
libavcodec
、
libavformat
和
libavutil
等子目录。其中
libavcodec
用于存放各个
encode/decode
模块,
libavformat
用于存放
muxer/demuxer
模块,
libavutil
用于存放内存操作等常用模块。
以
flash movie
的
flv
文件格式为例,
muxer/demuxer
的
flvenc.c
和
flvdec.c
文件在
libavformat
目录下,
encode/decode
的
mpegvideo.c
和
h263de.c
在
libavcodec
目录下。
FLV
视频文件格式实际上并没有明确指出应该使用哪种编码来解析音频和视频数据;它们只是定义了音频流和视频流(或者,有可能是多个音频视频流)如何被绑定在一个文件里面。这就是为什么有时候,当你打开了一个
FLV
文件时,你只能听到声音,却不能看到图象--因为没有合适的视频解码器。所以,
libavformat
用来处理解析视频文件并将包含在其中的流分离出来,而
libavcodec
则处理原始音频和视频流的解码。
解码处理流程:
1、
通过函数
flvdec_init(void)
注册初始化编码器,通过
REGISTER_MUXDEMUX(FLV, flv)
完成对
FLV
格式的注册,内含音频视频编解码的初始化
;
2、
打开视频文件,通过
av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)
实现,
通过
av_find_stream_info(pFormatCtx)
、
dump_format(pFormatCtx, 0, filename, false)
分析文件数据包编码格式,再把
pFormatCtx
的流域填满;
3
、通过
avcodec_find_decoder(pCodecCtx->codec_id)
找到相应的解码器,
4
、打开解码器,通过函数
(avcodec_open(pCodecCtx, pCodec)
;
5
、视频数据解码通过
avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, rawData, bytesRemaining)
解析视频数据包,得到视频帧,
GetNextFrame(AVFormatContext *pFormatCtx, AVCodecContext *pCodecCtx, int videoStream, AVFrame *pFrame )
;视频编码格式为
FLV1
;
6
、音频数据包通过
avcodec_decode_audio
()解码,得到的数据存入
buffer
中,根据时间戳来实现音视频的同步;音频编码格式有
PCM
、
ADPCM
、
MP3
;
7
、释放解码器,关闭解码器(
codec
),
avcodec_close(pCodecCtx);
关闭视频文件
av_close_input_file(pFormatCtx);
表5-6 FLV解码软件中部分重要处理函数接口
函数接口
|
作用
|
flv_probe()
|
探测文件是否为
FLV
文件
|
flv_read_packet ( )
|
读入数据包,分析数据包
|
flv_read_close( )
|
关闭读操作
|
flv_read_header
()
|
读入头数据
|
av_register_input_format()
|
初始化输入格式
|
5.5.3 FLV开发体会
在开发中,是利用的基础的
FFMPEG
开源的开发包,在其中提取
FLV
相关代码进行开发实践,得到最后的解码软件,对于解码代码的编写都是利用开发包里面的,主要工作还是在于移植到本课题的开发平台。因为本课题用的硬件系统的局限性,以及
FFMPEG
开发包本来也是没有经过严格测试的,最后得到的解码软件在机子上播放,会有卡机现象,不是很流畅。
为了开发出质量更高,符合市场需求的
FLV
解码软件,除了通过购买编解码库,就只能通过一些开源的包再做深入的开发,得到需要的解码软件产品。