流行音频解码的嵌入式移植——MP3格式移植模块-毕业论文_第1页
流行音频解码的嵌入式移植——MP3格式移植模块-毕业论文_第2页
流行音频解码的嵌入式移植——MP3格式移植模块-毕业论文_第3页
流行音频解码的嵌入式移植——MP3格式移植模块-毕业论文_第4页
流行音频解码的嵌入式移植——MP3格式移植模块-毕业论文_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

厦门大学本科毕业论文本科毕业论文(科研训练、毕业设计)题 目:流行音频解码的嵌入式移植 MP3格式移植模块姓 名:学 院:软件学院系:软件工程专 业:软件工程年 级: 学 号:指导教师(校内): 职称: 指导教师(校内): 职称: 指导教师(校外): 职称: 年 月第35页共35页流行音频解码的嵌入式移植MP3移植模块摘要 MP3的全称是MPEG Audio Layer3 ,它是一种高效的计算机音频编码方案,它以较大的压缩比将音频文件转换成较小的扩展名为MP3 的文件,基本保持原文件的音质。MP3 是ISO/MPEG标准的一部分, ISO/MPEG标准描述了使用高性能感知编码方案的音频压缩,此标准一直在不断更新以满足“质高量小”的追求,现已形成MPEG Layer1、Layer2、Layer 3 三个音频编码解码方案。MPEG Layer3 压缩率可达1 :10 至1 :12 ,1M的MP3 文件可播放1 分钟。直到现在,这种格式还是风靡一时,其作为主流音频格式的地位难以被撼动。 本文先介绍项目背景和总体设计目标,然后简要介绍了了交叉编译、S3C2410硬件平台、MPlayer源码框架,研究并分析mp3音频格式的解码算法原理,根据这些原理去分析开源的音频编解码库,针对嵌入LINUX系统的ARM平台提出优化方案,以S3C2410(FFT2410实验箱)平台为目标,并在此平台上进行优化移植,实现对MP3音频的解码。关键词 MPlayer 嵌入式 解码 移植 MP3Embedded Porting of the Popular Audio Format Decodingthe Module of MP3 PortingAbstract MP3 which is a highly efficient computer audio coding program stands for MPEG Audio Layer3. It converts audio files into smaller MP3 files with greater compression ratio, basically maintained the sound quality of the original document. MP3 is part of ISO/MPEG standards.ISO/MPEG standard describes the use of high-performance perceptual coding audio compression.This standard has been continuously updated to meet the small amount of high quality. MPEG Layer1,Layer 2 and Layer 3 audio codec program has been formed. MPEGLayer3 compression rates up to 1 : 10 to 1 : 12. Even now, MP3 as a mainstream status of audio format has been difficult to be shaked. This paper introduces the background and goals of the project, then briefly present the cross compiler. S3C2410 hardware platform, MPlayer source framework, Research and analysis of mp3 audio format decoding algorithm theory.Aim at S3C2410 (FFT-2410 experimental box),we will optimize transplant implementation of MP3 audio decoder.Key words MPlayer Embedded Decoding Porting MP3目 录引 言8第一章 选题背景91.1 MP3格式的市场前景91.2 移植目的及总体设计目标91.3移植开发环境10第二章 移植平台搭建122.1 Linux交叉开发模式122.2 ARM板的连接调试122.2.1设置minicom122.2.2配置以太网152.3 交叉编译环境的建立15第三章 移植的具体实现173.1 MPlayer的安装编译173.2 MP3格式的解码过程183.2.1 MP3格式183.2.2 MP3格式的解码193.3 libmad及其优化203.3.1 码流读取213.3.2 桢的同步233.3.3桢头解码233.3.4 sideinfo解码243.3.5 main_data的读取253.3.6 缩放因子解码263.3.7 huffman解码263.3.8 反量化263.3.9重排序263.3.10 IMDCT变换273.3.11子带合成滤波273.4 移植流程283.4.1 安装工具283.4.2交叉编译libmad库283.4.3 编译MPlayer283.4.4宿主机设置293.4.5 移植MPlayer30结论33致谢语34参考文献35CatalogueIntroduction8Chapter 1 Background91.1 the Foreground of MP391.2 the Goals of Porting91.3 the Develop Environment10Chapter 2 Transplant Platform122.1 the CROSS Develop Module122.2 Connection of ARM122.2.1 the Setting of minicom122.2.2 the Setting of LAN152.3 the Implementation of CROSS15Chapter3 Transplant Implementation173.1 Install MPlayer173.2 the Decoding Process of MP3 Audio183.2.1 MP3 Format183.2.2 MP3 Decoding193.3 Optimize of libmad203.3.1 Code Stream213.3.2 the Synchronization of Frames233.3.3 Frame Head Decoding233.3.4 sideinfo Decoding243.3.5 main_data253.3.6 Scalefactor Decoding263.3.7 Huffman Decoding263.3.8 Requantization263.3.9 Reordering263.3.10 IMDCT273.3.11 Synthesis filter bank273.4 the Flow of Transplant283.4.1 Install Tools283.4.2 Compile the Lib of libmad283.4.3 Compile MPlayer283.4.4 Host Setting293.4.5 Transplant MPlayerr30Summary33Acknowledgement34References35引 言近些年来,MP3市场发展势头迅猛,其百家争鸣的态势,甚至一度在数码市场大放异彩,并成为了继手机之后最为广泛使用的个人随身电子产品。各大厂商的竞争也进入白炽化阶段,众人为了争取不同需求的消费者,在技术上下足功夫,加大产品的竞争力度,开发出具有个性化、完美品质的产品。在本次开发中,我们将来研究一下流行音频解码的嵌入式移植。这就涉及到ARM技术和LINUX这两个术语。ARM:AdvancedRISCMachines,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。随着ARM技术的发展,它的应用已经遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类高科技产品市场。可以说,我们已经步入了ARM的时代,以ARM为内核的系列产品(ARM7、ARM9、ARM9E、ARM10E、SecurCore、Xscale、StrongARM),各自满足着不同应用领域的需求,渗入到嵌入式系统应用的各个角落。LINUX:构建一个复杂的嵌入式系统,仅有硬件是不够的,我们还需要进行操作系统的移植。我们通常在ARM平台上构建Windows CE、Linux、Palm OS等操作系统。鉴于Linux 正在嵌入式开发领域稳步发展Linux 使用 GPL,所有对特定开发板、PDA、掌上机、可携带设备等使用嵌入式Linux 感兴趣的开发折都可以从因特网上免费下载其内核和应用程序,并开始移植和开发。Linux具有广大的支持社群以外,稳定、模块化、拥有广大的应用免费应用软件支持。我们这次项目的开发就是以LINUX为平台。第一章 选题背景1.1 MP3格式的市场前景mp3格式诞生于1987年,创始者是设在德国的一个音频研究机构。mp3的全名是MPEG Audio Layer -3,是活动图像方案专家组-MPEG(研究一种压缩比率较大的活动图像和声音的压缩方法)在当时研究影像压缩格式同时开发的音频压缩格式。mp3压缩时运用了五个重要的技术:1. 最小听觉门限判定技术2. 遮蔽效应技术3. 位存储槽技术4. 立体声编码技术5. 无失真编码技术自从Diamond(帝盟)公司于1997年推出第一台MP3随身播放器后(事实上第一台MP3是由韩国世韩公司推出,只不过影响深远是从帝盟开始) ,这个在短短两三年内改变了整个音乐市场、便携式数码音乐产品,改变了我们的生活,在短短两年内迅速席卷全球,成为便携式音频设备的主流。Mp3比之CD、MD等随身听,其最大的市场优势在于独特的产品特性。它是一种采用集成芯片制成的数码产品,在产品的设计上有很大的灵活性和随意性,产品可大可小,可设计成任意的形状。各种型号时尚个性的MP3播放器产品,创造着消费潮流,这是其最大的卖点。随着产品的不断完善和市场的竞争加剧,MP3 Player的市场发展空间十分巨大。我们研究MP3这一音频格式的意义也就凸显出来。1.2 移植目的及总体设计目标我们这次的项目是学院和芯瑞丽共建多媒体实验室的一个实习项目流行音频解码的嵌入式移植。移植的广泛定义,是让一套软件可以在一套选定硬件平台上正常运作。这次项目的任务就是把MPlayer移植到S3C2410(FFT2410实验箱)上,使其能够在S3C2410(FFT2410实验箱)上播放MP3格式和WMA格式的音频文件。这次项目我主要负责的是MP3部分的移植。首先,分析流行音频(MP3)的解码算法,并针对S3C2410(FFT2410实验箱)平台提出优化方案,并在此平台上实现对这些音频的解码。其次,研究所要移植的音频格式(MP3)编解码算法的原理,根据这些原理去分析开源的音频编解码库(如MPlayer的音频编解码库),针对S3C2410(FFT2410实验箱)平台进行优化移植。最终在S3C2410目标平台上,使得MP3的解码速度得到显著提升,甚至能够流畅播放MP3音频文件。1.3移植开发环境 硬件:S3C2410(FFT2410实验箱)、PC 机Pentium 500 以上, 硬盘10G 以上。这套S3C2410(FFT2410实验箱)兼容了全球最流行的接口和嵌入式技术外设。基本参数如下:n S3C2410:16/32bit ARM920T 内核n 标称工作频率:203MHzn 运算能力:220MIPSn 最高工作频率:266MHzn CPU 内核工作频率:200266MHzn 外部总线频率:100133MHz FlashRomn SDRAM:核心板64Mbyten LCD 控制器:CPU 内置STN/CSTN/TFT LCD 控制器,支持1024*768 分辨率下的各种液晶n IIS 音频输入/输出接口S3C2410(FFT2410实验箱)如图1-1所示:图1-1 S3C2410(FFT2410实验箱) 软件:PC 机操作系统REDHAT LINUX 9.0MINICOMARM-LINUX 开发环境 编译工具:arm-linux-gcc 3.3.2 播放器版本:MPlayer-1.0rc1.tar.bz2第二章 移植平台搭建2.1 Linux交叉开发模式Linux交叉开发采用宿主机和目标机的模式进行。宿主机是一台运行Linux(我们采用的是RedHat 9)的PC机,目标机即S3C2410(FFT2410实验箱)。开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码,这种代码并不能在宿主机上执行,而只能在目标机上执行。然后把可执行文件下载到目标机上运行。调试时的方法很多,可以使用串口,以太网口等,具体使用哪种调试方法可以根据目标机处理器所提供的支持作出选择。这里我们采用以太网口直连模式。宿主机和目标板的处理器一般都不相同,我们这次的宿主机为Intel处理器, 而目标板S3C2410 为ARM内核。Linux交叉开发包括Linux内核的开发和Linux应用程序的开发应用程序的开发。我们此次流行音频解码的嵌入式移植属于后者。2.2 ARM板的连接调试2.2.1设置minicom在Linux操作系统下,使用minicom作为超级终端,因此首先必须正确配置超级终端。在宿主机端Linux下执行:#minicom -s弹出一个界面如图2-1所示:图2-1 minicom界面第一次使用时需要对串口进行配置,在该菜单下选择“Serial port setup”,然后回车将出现如图2-2所示的配置菜单:图2-2 minicom配置菜单参照上面的配置,相应输入左边的”A”、”B”等字符将出现配置各自参数的界面,分别配置成上述设置。设置完成后回车退出,并选择保存,如图2-3所示:图2-3 保存minicom设置然后选择Exit菜单,将启动minicom程序,此时将S3C2410的UART0通过串口线连接到PC机串口1并将S3C2410重新上电,此时minicom已经配置正确。下次使用minicom直接键入以下命令执行即可:#minicom2.2.2配置以太网配置宿主机IP,我们设定宿主机的IP地址为192.168.0.120:#ifconfig eth0 192.168.0.120用minicom终端进入S3C2410,配置ip为192.168.0.121:#ifconfig eth0 192.168.0.121最后用ping命令测试宿主机与S3C2410是否成功连接。2.3 交叉编译环境的建立交叉编译环境的建立最重要的就是要有一个交叉编译器。所谓的交叉编译就是:利用运行在某机器上的编译器编译某个源程序生成在另一台机器上运行的目标代码的过程。编译器的生成依赖于相应的函数库,而这些函数库又得依靠编译器来编译。这里我们用到的编译器是arm-linux-gcc,它是gcc 的arm 改版。gcc 是个功能强大的c语言编译工具,它的实质是把某种以数字和符号为内容的高级编程语言转换成机器语言指令的集合。编译工具的基本结构如图2-4所示:图2-4 gcc基本结构图目前交叉编译技术有两种典型的实现模式,它们分别是:Java 模式即Java 的字节码编译技术和GNU GCC 模式即通常所说的Cross GCC 技术。GCC 模式与Java 模式不同,它通过Cross GCC 直接生成目标平台的目标代码,从而能够直接在目标平台上运行。其关键在于对Cross GCC 选择,我们需要选择针对具体目标平台的Cross Gcc。相对来说,GCC 模式代码比Java 模式更为优化,效率更高。目前Linux 操作系统也主要是以GCC 模式进行移植的。我们采用的是arm-linux-gcc 3.3.2。第三章 移植的具体实现3.1 MPlayer的安装编译MPlayer主要有两种安装方式,一种是安装二进制可执行文件包(RPM),另一种是源码编译安装。二进制文件包是提供者根据特定的目标平台编译生成的二进制文件,用户只需要根据自己的平台,下载相应的二进制文件包安装即可,这种方式安装简单方便,适合初级用户。但是这种方式缺少灵活性,用户不能进一步开发。由于它是针对特定平台的生成的二进制文件,可移植性也差。源码编译安装是通过下载源代码,用编译器对源码进行编译,生成二进制可执行文件来安装。这种方式适合于开发用户,具有较高的灵活性,安装过程也相对复杂一点。我们需要对MPlayer源码进行修改,所以采用源码安装这种方式,使用的源码是最新的MPlayer v1.0rc1源码包。下面说明了在PC机上源码安装MPlayer的过程。1. 把下载下来的MPlayer源码包解压到某个目录下,可以通过右键选择“解压缩到这里”进行解压,也可以在终端下,用tar命令解压缩。2. 在终端下,进入到解压出来的源码目录,运行 ./configure 命令,进行配置。它会自动检测你的系统,然后设置一些参数,为下一步的编译操作做好准备。你也可以在configure后面加上适当的参数,根据需要进行配置。3. 配置完成后,输入make命令进行编译,这可能需要几分钟的时间,看具体的PC机配置而定。4. make编译完了以后,输入make install命令进行安装。5. 这样安装完了以后,就生成了一个在命令行下使用的媒体播放器,这时可以播放一个文件来测试看看。在终端下输入命令mplayer *.mp36. 这时就可以听到mplayer播放出来的mp3音频了。7. 在安装过程中,可能会出现错误,这时要根据所提示的错误信息,修改正确之后,就可以继续编译安装。MPlayer还可以安装Font以及Skin等,上面的方法只是简单的生成一个命令行下的二进制可执行文件。3.2 MP3格式的解码过程3.2.1 MP3格式MP3 文件是由帧(frame)构成的,帧是MP3 文件最小的组成单位。MP3 的全称应为MPEG1 Layer-3 音频文件,MPEG(Moving Picture Experts Group)在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG 音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和MP2 的压缩率分别为4:1 和6:1-8:1,而MP3 的压缩率则高达10:1-12:1,也就是说,一分钟CD 音质的音乐,未经压缩需要10MB 的存储空间,而经过MP3 压缩编码后只有1MB 左右。不过MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3 采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。MP3文件以一帧为一个编码单元,各帧编码数据是独立的。MP3 文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1),结构图如表所示:表3-1 MP3文件结构ID3V2包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量。Frame.Frame一系列的帧,个数由文件大小和帧长决定每个FRAME 的长度可能不固定,也可能固定,由位率bitrate 决定每个FRAME 又分为帧头和数据实体两部分帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立ID3V1包含了作者,作曲,专辑等信息,长度为128BYTE。一首MP3 歌曲,按照位率来分类,它可以有三种版本:96Kbps(96 千比特位每秒)、128Kbps 和192Kbps。Kbps(比特位速率),表明了音乐每秒的数据量,Kbps 值越高,音质越好,文件也越大,MP3 标准规定,不变的bitrate 的MP3 文件称作CBR,大多数MP3 文件都是CBR 的,而变化的bitrate 的MP3 文件称作VBR,每个FRAME 的长度都可能是变化的。3.2.2 MP3格式的解码当MP3文件被打开后,播放器首先试图对帧进行同步,然后分别读取通道信息及增益因子等数据,再进行霍夫曼解码,至此我们已经获得解压后的数据。但这些数据仍然不能进行播放,它们还处于频域,要想听到歌曲还要将它由频域通过特定的手段转换到时域。接下来的处理分别为立体化处理;抗锯齿处理;IMDCT变换;IDCT变换及窗口化滑动处理。MP3解码有两种方式,一种是基于浮点运算(如MPG123),另一种则是基于整数的,即libmad (MPEG audio decoder library)。浮点的解码,单精度浮点小数可以精确到小数点后45位,不过要求CPU有FPU单元。MP3解码的流程如图3-1所示:MP3位流Huffman表缩放因子Huffman编码反量化重排序立体声编码混叠消除IMDCT变换 频率反演子带合成滤波右声道左声道混叠消除IMDCT变换 频率反演子带合成滤波预处理图3-1 MP3解码流程图解码的主要过程包括:1. 预处理(Preprocessing):这个步骤主要是完成Header和Side information的解码,得到后面解码所需要的一些信息,并保存起来;2. Huffman编码;3. 反量化(Requantization)。4. 重排序(Reordering):使Huffman编码更加有效率;5. 立体声解码(Stereo decoding);6. 混叠消除(Alias reduction);7. IMDCT变换;8. 频率反演(Frequency inversion);9. 子带合成滤波(Synthesis filter bank):这部分是MP3解码的最后一个部分了,它负责从IMDCT的输出值中把PCM值还原出来。3.3 libmad及其优化libmad是专门面向嵌入式应用的mp3解码程序,它用定点运算模拟浮点运算,因此不需要处理器有浮点运算功能。libmad对mp3解码中关键部分采用了优化的算法,这些优化算法能够大幅度地减少计算量,而且大多应用于mp3解码的VLSI实现中。由于以上的特点,libmad非常适用于嵌入式应用。libmad的版权归属于Underbit Technologies, Inc.libmad包含的源文件主要有:bit.c、stream.c、decoder.c、frame.c、layer3.c、synth.c、huffman.c。3.3.1 码流读取解码程序的输入就是二进制码流,因此码流读取是很重要、很基础的功能模块。码流的读取是以比特为单位的,而cpu读写内存是以字节为单位的,故在两者之间需由相关函数架起桥梁。这个函数就是mad_bit_read( ),定义于bit.c:137 unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len)138 139 register unsigned long value;140141 if (bitptr-left = CHAR_BIT)142 bitptr-cache = *bitptr-byte;143144 if (len left) 145 value = (bitptr-cache & (1 left) - 1) 146 (bitptr-left - len);147 bitptr-left -= len;148149 return value;150 151152 /* remaining bits in current byte */153154 value = bitptr-cache & (1 left) - 1);155 len -= bitptr-left;156157 bitptr-byte+;158 bitptr-left = CHAR_BIT;159160 /* more bytes */161162 while (len = CHAR_BIT) 163 value = (value byte+;164 len -= CHAR_BIT;165 166167 if (len 0) 168 bitptr-cache = *bitptr-byte;169170 value = (value cache (CHAR_BIT - len);171 bitptr-left -= len;172 173174 return value;175以上涉及到一个数据结构struct mad_bitptr:struct mad_bitptr unsigned char const *byte; unsigned short cache; unsigned short left;结构体mad_bitptr指向码流中的要一个要读取的比特,该比特所在的字节由byte确定,该比特在字节中的位置由left确定,如果left为8,则该比特为(*byte) 的最高为(MSB)。另外,成员cache为字节数据缓冲,也就是(*byte)。函数mad_bit_read()的第144行,(1left)-1)表示一个蒙板,一个8位的数与它相与可表示低left位的值,将这个值右移(bitptr-left len)位,即为要读取的若干比特位的值。函数的第170行也是同样的原理,只是要读取的比特位较长。另外,在bit.c中,还有若干码流处理函数:mad_bit_bitsleft()、mad_bit_nextbyte()、mad_bit_length()、mad_bit_skip()。3.3.2 桢的同步每一桢的开头有同步字,即syncword,为12个比特位(0xFFF),用以标明一桢的开始,但通过在码流中查找同步字来定位桢是很费事的,因此mp3解码采用了另一种快速的定位手段。在mp3码流中,相邻两个同步字之间的距离(也就是一桢的长度)是slot的整数倍,其中slot就是一个字节。一桢的长度要么是N个字节,要么是N+1字节。其中N这样计算:上式计算出来的N如果不是整数,应该被截短(truncated)。当桢头中的Padding_bit为1时,桢长为N+1;当Padding_bit为0时,桢长为N。桢的同步通过函数mad_header_decode()完成,定义于frame.c。3.3.3桢头解码桢头解码有函数decode_header()完成,定义于frame.c。桢头解码所得到的信息(ID、Layer、Bitrate、Samping_frequency)存放于结构体mad_header中,定义如下:struct mad_header enum mad_layer layer;/* audio layer (1, 2, or 3) */ enum mad_mode mode;/* channel mode (see above) */ int mode_extension;/* additional mode info */ enum mad_emphasis emphasis;/* de-emphasis to use (see above) */ unsigned long bitrate;/* stream bitrate (bps) */ unsigned int samplerate;/* sampling frequency (Hz) */ unsigned short crc_check;/* frame CRC accumulator */ unsigned short crc_target;/* final target CRC checksum */ int flags;/* flags (see below) */ int private_bits;/* private bits (see below) */ mad_timer_t duration;/* audio playing time of frame */;所要解码的mp3文件包含多少桢,decode_header()就被执行多少次。3.3.4 sideinfo解码sideinfo解码所得到的信息(main_data_begin、scfsi、part2_3_length、big_values)存放于结构体sideinfo中,定义如下:struct sideinfo unsigned int main_data_begin; unsigned int private_bits; unsigned char scfsi2; struct granule struct channel /* from side info */ unsigned short part2_3_length; unsigned short big_values; unsigned short global_gain; unsigned short scalefac_compress; unsigned char flags; unsigned char block_type; unsigned char table_select3; unsigned char subblock_gain3; unsigned char region0_count; unsigned char region1_count; /* from main_data */ unsigned char scalefac39;/* scalefac_l and/or scalefac_s */ ch2; gr2;sideinfo的解码由函数III_sideinfo()完成,定义于layer3.c,其中,数据成员scalefac39表示缩放因子频带的缩放因子,对于长块,一共有22个缩放因子频带(0-20的缩放因子从码流中获取,21的缩放因子为0)。对于短块,在码流的sideinfo部分得不到;对于短块,一共有13个缩放因子频带(0-11的缩放因子从码流中获取,12的缩放因子为0),其中每个频带有3个窗,分别用不同的缩放因子,因此,scalefac 数组的大小为39(13*3)。缩放因子不存放于sideinfo中,而是存放于main_data中,后面在对main_data解码时,会把缩放因子填入数组scalefac39。3.3.5 main_data的读取main_data包含缩放因子和huffman编码数据。mp3编码时,并没有将main_data全部存放于当前桢里,而是main_data的开头有一部分存放于前一桢里,并且位于当前桢的同步字之前,sideinfo中main_data_begin表示这一部分的字节个数,如图3-2所示:图3-2 main_data的读取main_data的读取由函数mad_layer_III()完成,定义于layer3.c。3.3.6 缩放因子解码读取缩放因子是通过函数III_scalefactors()完成的,定义于layer3.c。3.3.7 huffman解码huffman解码是比较复杂的一部分,它涉及到sideinfo中的big_values、region0_count、region1_count、table_select、part2_3_length、count1table_select。mp3在进行huffman编码时,对576个采样点分为若干区域,对不同的区域采用不同的huffman码表。对huffman数据的解码由函数III_huffdecode()完成,定义于layer3.c。3.3.8 反量化反量化由两个函数完成:III_requantize()、III_exponents(),定义于layer3.c3.3.9重排序重排序应用于短块以及混合块的短块部分。首先将所有采样点按window0、window1、window2分类,然后按如图3-3所示重新排序:图3-3 重排序重排序由函数III_reorder()完成,定义于layer3.c。3.3.10 IMDCT变换在libmad中,IMDCT采用Szu-Wei Lees提出的快速算法。IMDCT由函数III_imdct_l()和III_imdct_s()完成,分别对应长块和短块,定义于layer3.c。在完成IMDCT之后,需要进行overlapping。overlapping将imdct输出的36个值zi分为两部分,前半部分与上一个块相应子带的后半部分相加,后半部分保存起来用于下一个块的overlapping。这部分由函数III_overlap()完成,定义于layer3.c。3.3.11子带合成滤波子带合成滤波是mp3解码中非常耗费时间的关键流程,其中涉及到从32个值变换到64个值的矩阵运算,对于该矩阵运算,libmad采用Konstantinos Konstantinides提出的方法Error! Reference source not found.该方法将矩阵运算进行一系列变化,最后归于32点dct变换,而dct变换有类似于FFT的快速算法(FCT)。libmad中用于子带滤波的是synth_full(),定义于synth.c。3.4 移植流程3.4.1 安装工具在root权限下将arm-linux-gcc安装到/usr/local/arm/3.3.2/bin目录中。修改$PATH变量包含arm-linux-gcc,我的做法是修改当前用户home目录下的.bash_profile文件。在.bash_profile文件中增加一行$PATH=/usr/local/arm/3.3.2/bin: $PATH3.4.2交叉编译libmad库1. 下载libmad包(libmad-0.15.1b.tar.gz);2. 打开一个终端,进入libmad的目录,输入配置命令:./configure -enable-fpm=arm -host=arm-linux -disable-shared(这个选项就是说明要静态编译) -disable-debugging -prefix=/usr/local/arm/3.2.2/libCC=arm-linux-gcc(要保证arm-linux-gcc的路径已经有 export过,否则给出完整路径。)3. 输入配置命令:make4. 输入配置命令:make install5. 这样就可以看到 /usr/local/arm/3.2.2/lib 目录下多了include和lib目录,这些就是libmad相关的库。3.4.3 编译MPlayer在移植的过程中,关键在于配置这一环节。在配置的时候要加上一些参数,有选择地编译MPlayer源码。比如我们采用的目标平台是S3C2410,运行在目标平台上的是Linux操作系统,在配置的时候就可以通过“-target=arm-linux”选项,指明所使用的目标平台。一般情况下,一个选项都有disable和enable两种,你可以根据需要来选择。比如“-enable-static”选项,用来指定把MPlayer编译成静态的。“-disable-gui”用来指定mplayer不使用图形化界面。有的选项,单单enable是不够的,比如“-enable-mad”选项。MAD是开源的MP3定点解码库,它适合于在嵌入式设备上解码MP3文件。如果需要把MAD解码库编译进mplayer中,不仅仅要加上“-enable-mad”选项,而且还要先交叉编译MAD源码,生成mad.h文件以及MAD解码链接库。然后使用“-with-extraincdir=PATH”指定mad.h所在的路径,使用“-with-extralibdir=PATH”指定MAD相关链接库所在的路径。加上这三个选项之后,就可以成功把MAD解码库编译到MPlayer可执行程序中。另外,MPlayer中还有很多配置选项可以选,你可以通过./configure help 命令查看所有的选项以及这些选项的含义。MPlayer的功能强大,支持的音频、视频格式非常多,我们的任务是去除所有的视频解码库,保留播放MP3格式所必须一些音频解码库,所以在配置的时候把很多选项都disable掉。详细配置参数如下所示(“”为换行连接符):在 configure MPlayer的时候,要加上以下几个选项:-enable-mad-with-extraincdir=/usr/local/arm/3.2.2/lib/include(这个指明 mad.h 这个文件所在的路径)-with-extralibdir=/usr/local/arm/3.2.2/lib/lib(这个指明libmad相关链接库所在的路径)通过以上两个步骤,就可以把libmad交叉编译到 mplayer中。3.4.4宿主机设置配置宿主机的nfs服务,使宿主机作为一台服务器能够被S3C2410挂上。NFS是Net File System的简写,即网络文件系统。NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件一样访问远端系统上的文件。下面是一些NFS共享的常用参数:ro 只读访问 rw 读写访问 sync 所有数据在请求时写入共享 async NFS在写入数据前可以相应请求 secure NFS通过1024以下的安全TCP/IP端口发送 insecure NFS通过1024以上的端口发送 wdelay 如果多个用户要写入NFS目录,则归组写入(默认) no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使 用async时, 无需此设置。hide 在NFS共享目录中不共享其子目录 no_hide 共享NFS目录的子目录 subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) no_subtree_check 和上面相对,不检查父目录权限 all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。 no_all_squash 保留共享文件的UID和GID(默认) root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)no_root_squas root用户具有根目录的完全管理访问权限 anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID修改/etc/export文件,在其中添加一行: / nfs

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论