ffmpeg 可以用来编码,解码,处理流媒体。它的libavcodec 包含了 audio/video 编解码库.ffmpeg利用SDL来输出音频和视频 。
代码: ffmpeg的代码特别难找,之前是放在sourceforge.net,后来移到mplayer网站下,但是我用svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg 拉不下来代码。只好在ubuntu 9.04下用
sudo apt-get source ffmpeg 来得到ffmpeg的代码。
分析:
libavcodec 目录是处理音频和视频流的编解码。
libavformat 目录是用来解析视频文件,因为一个文件包括了多个流(音频流和视频流),libavformat把文件中的流分离出来,以frame形式给libavcodec来处理。
ffmpeg对每一个audio都定义了一个codec ID ,每一个decoder , 都有一个结构 AVCodec , 它包含了codec name , 类型(video还是audio),codec ID,初始化函数,编码函数,解码函数....,以及成员变量 struct AVCodec *next;这样可以构建一个link list. 从libavformat分离出来的流包含了codec ID ,函数avcodec_find_decoder 根据 codec ID 找到相应的decoder 。然后调用decoder的decode函数。
比如在wmadec.c中:
AVCodec wmav1_decoder =
{
"wmav1",
CODEC_TYPE_AUDIO,
CODEC_ID_WMAV1,
sizeof(WMACodecContext),
wma_decode_init,
NULL,
ff_wma_end,
wma_decode_superframe,
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
};
AVCodec wmav2_decoder =
{
"wmav2",
CODEC_TYPE_AUDIO,
CODEC_ID_WMAV2,
sizeof(WMACodecContext),
wma_decode_init,
NULL,
ff_wma_end,
wma_decode_superframe,
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
};
对于wma V1,V2两种audio,定义了他们的编码函数为 wma_decode_superframe.
通过avcodec_register_all函数将调用
REGISTER_ENCDEC (WMAV1, wmav1);
REGISTER_ENCDEC (WMAV2, wmav2);
这样将wmav1_decoder, wmav2_decoder 加入到first_avcodec的链表中 。
WMA(Windows Media Audio),微软的私有标准,WMA在压缩比和音质方面都超过了MP3,更是远胜于RA(Real Audio),即使在较低的采样频率下也能产生较好的音质. WMA格式主要包括WMAV1,WMAv2,WMA 9, WMA 9 Professional ,WMA Lossles,WMA voice .
WMAV1 ---- codec name : 0x160
WMAv2 ------- codec name : 0x161
WMA 9 Professional --- codec name : 0x162
WMA Lossless ---- codec name : 0x163
WMAV1 ---- WMA 7 , WMAV2 ---- WMA8 WMAV3 ---- WMA 9 (个人猜测) ??
WMA voice (8K采样率)
对于wma解码,ffmpeg的wma解码是基于浮点的,在没有浮点协处理器的ARM9,效率低下,因此须定点化,主要是修改libavcodec/wmadec.c 等相关文件
目前从网上收集到两种方法
1) 从 (注意WMA_V 为大写字母,否则下载不到)
然后替换wmadec.c ,做一些小修改,(比如把free --> av_free )
但是,这种代码的质量到底如何?毕竟是不知名的代码。
2)
VLC的定点化的wma解码 ,也是基于rockbox修改的,支持 WMA V1/V2 ,编译的时候加上 --enable-wma-fixed
现状: 对于wma ,目前只支持wmaV1 ,wmav2 , 而wmav3等不支持,mplayer对wmav3等的支持都是加上DLL文件,在linux下面都不支持wmav3
另外QQ影音也采用了ffmepg ,代码在
阅读(9831) | 评论(0) | 转发(0) |