Ogg Vorbis软解码--ARM平台

在游戏开发中,ogg是最常用的音频文件格式,因其免费以及高音质,高压缩比而深受欢迎。但嵌入式系统中,通常只支持PCM数据播放(通常也支持MP3硬件播放)。但并不支持ogg播放。所以需要将其解压缩为PCM数据并送给DAC去播放出来。
 
 
首先介绍基本知识:
Ogg是一个自由且开放标准的容器格式,由Xiph.Org 基金会所维护。Ogg格式并不受到软件专利的限制,并设计用于有效率地流媒体和处理高品质的数字多媒体。
“Ogg”意指一种文件格式,可以纳入各式各样自由和开放源代码的编解码器,包含音效、视频、文字(像字幕)与元数据的处理。当前的音频编码器有Vorbis编解码器。
 
 

得到OGG,Vorbis代码:

http://www.vorbis.com/

http://www.xiph.org/
使用svn下载其代码: http://svn.xiph.org/trunk
 
交叉编译之:
#cd ogg
#  CFLAGS="-mfpu=vfp -mfloat-abi=softfp -O2 " CC=arm-hisiv200-linux-gcc ./configure --host=arm-linux
#make clean;make
 
 
#cd vorbis
# CFLAGS="-mfpu=vfp -mfloat-abi=softfp -O2 " OGG_LIBS=-L/home/pnfs-server/work/xiph/ogg/src/.libs OGG_CFLAGS=-I/home/pnfs-server/work/xiph/ogg/include CC=arm-hisiv200-linux-gcc ./configure --host=arm-linux
#make clean;make
 
此时,libogg.so  libvorbisfile.so  libvorbis.so都生成了。用来解码ogg的库已经够用了。
 
 
 
考虑到OGG库大量使用浮点运算,而当前嵌入式平台又是ARM平台,并支持vfp.所以添加了CFLAGS="-mfpu=vfp -mfloat-abi=softfp -O2 "。 否则,解码速度会很慢。
 
 
在vorbis-tools中,有oggdec,它就是Linux下oggdec 功能的实现源码。它将一个或多个ogg file转换为wav文件。
 
#cd vorbis-tools
CFLAGS="-mfpu=vfp -mfloat-abi=softfp -O2 " OGG_LIBS=-L/home/pnfs-server/work/xiph/ogg/src/.libs OGG_CFLAGS=-I/home/pnfs-server/work/xiph/ogg/include VORBIS_CFLAGS=-I/home/pnfs-server/work/xiph/vorbis/include VORBIS_LIBS=-L/home/pnfs-server/work/xiph/vorbis/lib/.libs CC=arm-hisiv200-linux-gcc ./configure --host=arm-linux
 
#cd share
#make
 
#cd oggdec
#make
#arm-hisiv200-linux-gcc -O2 -Wall -ffast-math -fsigned-char -g -O2 -o .libs/oggdec oggdec.o  -L/home/pnfs-server/work/xiph/vorbis/lib/.libs ../share/libutf8.a ../share/libgetopt.a /home/pnfs-server/work/xiph/vorbis/lib/.libs/libvorbisfile.so -L/home/pnfs-server/work/xiph/ogg/src/.libs /home/pnfs-server/work/xiph/vorbis/lib/.libs/libvorbis.so -lm -Wl,-rpath -Wl,/usr/local/lib -logg


此时,oggdec也编译出来了。
 


Sam想实现多路ogg混合播放,于是将oggdec中的代码提炼出来,将多个ogg文件解码为wav raw data. 并将其软混音。
 
所用到的API说明可以在http://www.xiph.org/vorbis/doc/vorbisfile/reference.html 找到。代码相当简单。
实现起来很方便。
 
 
Sam在HI3716平台上尝试多路ogg解码,效率很不错。
 
 
 CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --prefix=/usr/share/mips-mp3 CFLAGS=-I/usr/share/mips-mp3/include LIBS=-L/usr/share/mips-mp3/lib --host=mips-linux
 
 
 
 
注1:OGG特性:
OGG特性1:
支持多声道,(MP3则只支持双声道)。 最高支持5.1声道。
其实5.1声道就是使用5个喇叭和1个超低音扬声器来实现一种身临其境的音乐播放方式,它是由杜比公司开发的,所以叫做“杜比5.1声道”。在5.1声道系统里采用左(L)、中(C)、右(R)、左后(LS)、右后(RS)五个方向输出声音,使人产生犹如身临音乐厅的感觉。五个声道相互独立,其中“.1”声道,则是一个专门设计的超低音声道。正是因为前后左右都有喇叭,所以就会产生被音乐包围的真实感。
 
OGG特性2:
逻辑流,物理流。
Sam也有点不是特别说的清楚,但把自己的感觉记录下来:
1. 一个或多个逻辑流组成一个物理流。
2. 逻辑流是指不性质的数据:语音、文本、图片、音频、视频等都可以组成逻辑流。


你可能感兴趣的:(嵌入式)