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 FLVRMVB对比
我们都知道一般的视频文件,要不就是 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 解码软件,除了通过购买编解码库,就只能通过一些开源的包再做深入的开发,得到需要的解码软件产品。

你可能感兴趣的:(video,Flash,input,Youtube,flv,BT)