FLV视频流编解码知识
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解码软件,除了通过购买编解码库,就只能通过一些开源的包再做深入的开发,得到需要的解码软件产品。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jyc1228/archive/2008/12/21/3576617.aspx