您的位置:首页 > 移动开发 > Android开发

Android下音频进行转码

2016-03-01 13:38 477 查看
一. 音频的简介

先从音频压缩的原理讲起,
人的听力范围是20hz--20khz, 而根据奈奎斯特定理, 要想不产生低频失真,则采样频率至少是录制的最高频率的两倍。 所以CD音质的采样频率是44100hz. 一秒采样44100次, 每次的数据量是16*2=32bit(立体声有2个声道)。 所以1秒的数据量是44100*32/8=176k. 这么大的数据量,为了方便传输和存储,是需要压缩的。 目前主流的音频格式有MP3,WMA还有AAC。3种格式各有各的特点和用处。

ACC格式:
中文称为“高级音频编码”,出现于1997年,基于 MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony(索尼)等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC 重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。
AAC分两种, 一种是mpeg-2 aac(主要是adts), 还有一种mpeg4-aac(.m4a)。 前者是针对传输的ts流, 而后者有方便存储的mp4容器。 AAC针对不同性能和带宽的应用场合, 有三种profile, LC(low complexity),
增加SBR(aac plus或HE AAC), 增加PS(aac plus plus或HE AAC+)。

目前常用的AAC编码器有FAAC和NERO AAC,前者是开源的,只支持LC Profile;后者不开源,支持到HE-AAC+。 目前千千静听和FOOBAR的AAC转码都使用NERO AAC插件。 针对手机的音质,选择预置中的 CBR/Stereo-48kbps
或 VBR/Stereo-Portable,40-50kbps即可。要勾选“导出ISO 13818-7 AAC 轨道”,这样输出的是符合mpeg-2 aac标准的AAC TS流。 否者输出的是.M4A。 注意,千千静听转码有个问题, 非44100HZ采样的WAV转出来都会变调。
优点:相对于mp3格式,AAC格式的音质更佳,文件更小。

   不足:AAC属于有损压缩的格式,相对于APE和FLAC等时下流行的无损格式,音色“饱满度”差距比较大。目前传输速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC头上“小巧”的光环不再。

MP3格式:
MP3是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer
III),简称为MP3。它被设计用来大幅度地降低音频数据量。利用 MPEG Audio Layer 3 的技术,将音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的文件,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降。它是在1991年由位于德国埃尔朗根的研究组织Fraunhofer-Gesellschaft的一组工程师发明和标准化的。用MP3形式存储的音乐就叫作MP3音乐,能播放MP3音乐的机器就叫作MP3播放器。

主要特点:

1、MP3是一个数据压缩格式;
2、它丢弃掉脉冲编码调制(PCM)音频数据中对人类听觉不重要的数据(类似于JPEG是一个有损图像压缩),从而达到了小得多的文件大小;
3、MP3音频可以按照不同的位速进行压缩,提供了在数据大小和声音质量之间进行权衡的一个范围。MP3格式使用了混合的转换机制将时域信号转换成频域信号。
4、32波段多相积分滤波器(PQF);
5、36或者12 tap 改良离散余弦滤波器(MDCT);每个子波段大小可以在0...1和2...31之间独立选择;
6、MP3不仅有广泛的用户端软件支持,也有很多的硬件支持比如便携式媒体播放器(指MP3播放器)DVD和CD播放器。

WMA格式:
WMA的全称是Windows
Media Audio,是微软力推的一种音频格式。WMA格式是以减少数据流量但保持音质的方法来达到更高的压缩率目的,其压缩率一般可以达到1:18,生成的文件大小只有相应MP3文件的一半。这对只装配32M的机型来说是相当重要的,支持了WMA和RA格式,意味着32M的空间在无形中扩大了2倍。此外,WMA还可以通过DRM(Digital Rights Management)方案加入防止拷贝,或者加入限制播放时间和播放次数,甚至是播放机器的限制,可有力地防止盗版。

主要特点:
WMA可以用于多种格式的编码文件中。应用程序可以使用Windows
Media Format SDK进行WMA格式的编码和解码。一些常见的支持WMA的应用程序包括Windows Media Player、Windows Media Encoder、RealPlayer、Winamp等等。其它一些平台,例如Linux和移动设备中的软硬件也支持此格式。

优点

WMA 7之后的WMA支持证书加密,未经许可(即未获得许可证书),即使是非法拷贝到本地,也是无法收听的。同时,微软公司开始时宣称的:同文件比MP3体积小一倍而音质不变,也得到了兑现。事实上,这个说法,仅仅适用于低比特率的情况,另外,微软公司在WMA
9大幅改进了其引擎,实际上几乎可以在同文件同音质下比MP3体积少1/3左右,因此非常适合用于网络串流媒体及行动装置。

缺点

在高位元率的渲染能力低下,同音源的一个320kbps的MP3与比较192kbps的WMA相比,音质和渲染力很容易分别出是前者较优。与MP3相同,WMA也是有损数据压缩的档案格式,对于有更高要求的用户来说WMA并不是一个适合的格式。(9.0版本支持无损压缩)此外WMA也与MP3一样同为有专利版权的档案格式。支持的装置需要购买使用版权。

wma格式和avi格式,mp4格式是一样的,它是有声音有图片的。但mp3不支持avi。mp4格式的只支持wma。

二.MP3格式与PCM格式的编码/解码/合成

MP3格式与PCM格式编码/解码/合成,由于转码效率来说C代码的速度比Java代码的效率高,所以采用JNI技术,实现具体的代码是由C代码完成的。
1. MP3格式与PCM格式编码/解码/合成的步骤如下:
Java代码调用步骤:
(1).需要在Libs下面导入Libmad.so库文件



注意: 如需修改so库名称,需要在jni源码中的Android.MK配置文件中进行修改.
(2).加载本地so库文件到内存中

static {

System.loadLibrary("mad");
}

注意: 如需修改加载本地so库的类的全路径,需要重新打包so库文件,需要修改对应C代码调用Java的类的全路径。

(3).声明本地方法

1.关闭解码/编码方法

public native static void close();

2.PM3格式解码成为PCM格式

两个方法都是进行解码为PCM格式

参数:

mp3File 需要进行转换MP3格式文件的全路径

mp3PCM 需要生成PCM格式的全路径
public native static int decodeMp3ToPCM(String mp3File, String mp3PCM);

public native static int decodeMp3ToPCM2(String mp3File, String mp3PCM);

3.PCM格式合成

mix2PCMToPCM2方法描述: 将两个PCM格式的音频文件进行合成为一个音频格式的文件。

参数:sourcePcm 源PCM格式文件的全路径

mp3PCM 需要进行合成PCM格式文件的全路径

mixPCM 合成后PCM格式文件的全路径

public native static int mix2PCMToPCM2(String sourcePCM, String mp3PCM,String mixPCM);
4.PCM格式编码为PM3格式

convert方法描述: 该方法功能是将PCM格式转换为PM3格式

参数:

input 源pcm格式文件的全路径

output 生成MP3格式文件的全路径

bufferSize 缓存区大小

public native static int convert(String input, String output, int bufferSize);

(4).调用本地方法

1.PM3格式解码为PCM格式

参数:

LeadMusicMp3 为MP3文件的全路径

LeadMusicPcm 转换为PCM文件的全路径

返回值:lead 为解码进度

lead=0 时解码完成。

int lead = AudioMp3AndMp3Mix.decodeMp3ToPCM2(LeadMusicMp3, LeadMusicPcm);

2.PCM合成

mix2PCMToPCM2方法为两个PCM合并为一个PCM格式文件

参数:

BackPcmPath 参与合成的PCM文件的全路径

LeadMusicPcmPath 参与合成的PCM文件的全路径

LeadMusicPcmMixPath 合成后生成PCM文件的全路径

返回值: r为合成进度

r=0是合成完成

int r = AudioMp3AndMp3Mix.mix2PCMToPCM2(BackPcmPath, LeadMusicPcmPath, LeadMusicPcmMixPath);

3.获取缓存区大小

/**
* 录制频率,单位hz,能实例化AudioRecord对象的时候,会出错。我开始写成11025就不行。这取决于硬件设备
* 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
*/
private int sampleRateInHz = 44100;

/**
* 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
*/
private int channelConfig = AudioFormat.CHANNEL_IN_STEREO;

/**
* 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
*/
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

int bufferSize = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
4.PCM格式编码PM3格式

convert方法是把PCM格式编码为PM3格式文件

参数:

LeadMusicPcmMixPath:参与编码的PCM文件的全路径

LeadMusicMp3MixPath:编码后生成的PM3文件的全路径

bufferSize:获取最小的缓存大小

int rs = AudioEncodeAndDeCode.convert(LeadMusicPcmMixPath, LeadMusicMp3MixPath, bufferSize);

三.MP3与MP4进行合成

MP3与MP4合成的步骤如下:

(1).在Libs文件夹下导入isoviewer-1.0-RC-35.jar包



(2).MP3与MP4进行合成代码

参数说明:

Videomp4 : 参与合成的视频文件全路径

MusicMP3: 参与合成的音频文件全路径

public void MixDealVideo() {
new Thread() {
public void run() {
try {
Movie countVideo = MovieCreator.build(Videomp4);
MP3TrackImpl MP3Track = new MP3TrackImpl(
new FileDataSourceImpl(MusicMP3));
countVideo.addTrack(MP3Track);
{
Container out = new DefaultMp4Builder()
.build(countVideo);
FileOutputStream fos = new FileOutputStream(new File(
ResourceMp4));
out.writeContainer(fos.getChannel());
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: