Chinaunix首页 | 论坛 | 博客
  • 博客访问: 537716
  • 博文数量: 237
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2563
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-05 22:02
个人简介

目前在一家公司担任软件总监,主要涉及智能手机,笔记本电脑的开发

文章分类

全部博文(237)

文章存档

2024年(18)

2023年(68)

2022年(13)

2021年(7)

2020年(11)

2019年(3)

2018年(10)

2017年(8)

2012年(7)

2011年(4)

2010年(32)

2009年(41)

2008年(6)

2007年(9)

分类: LINUX

2010-03-17 15:58:26

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 ,代码在
阅读(9877) | 评论(0) | 转发(0) |
0

上一篇:U boot 分析

下一篇:Fltk 的回忆总结

给主人留下些什么吧!~~