简介
我在之前文章《Android 音视频之音频AAC编码》中介绍过,如何将音频原始pcm数据进行AAC编码。本章,我简单介绍一下,Android对音频文件进行编码转换。编码转换,俗称转码,就是将音频文件的编码进行转换。我们需要先将音频文件解码成原始数据,再对原始数据编码成想要的音频文件。
MediaExtractor
MediaExtractor类,可以用来分离视频文件中的音频,字幕和视频轨道。
/**
* 初始化解码器
*/
private void initMediaDecode() {
try {
mediaExtractor = new MediaExtractor();//此类可分离视频文件的音轨和视频轨道
mediaExtractor.setDataSource(srcPath);//媒体文件的位置
for (int i = 0; i < mediaExtractor.getTrackCount(); i++) {//遍历媒体轨道
//此处我们传入的是音频文件,所以也就只有一条轨道
MediaFormat format = mediaExtractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
//此处注意前缀 音频前缀为audio,视频为video,字幕为text
//我们可用此区别区分媒体文件内的音频轨道和视频轨道
//mime的各种类型定义在MediaFormat静态常量中
if (mime.startsWith("audio")) {//获取音频轨道
mediaExtractor.selectTrack(i);//选择此音频轨道
mediaDecode = MediaCodec.createDecoderByType(mime);//创建对应格式的Decode解码器
mediaDecode.configure(format, null, null, 0);
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
if (mediaDecode == null) {
Log.e(TAG, "create mediaDecode failed");
return;
}
mediaDecode.start();//启动MediaCodec ,等待传入数据
decodeInputBuffers = mediaDecode.getInputBuffers();//MediaCodec在此ByteBuffer[]中获取输入数据
decodeOutputBuffers = mediaDecode.getOutputBuffers();//MediaCodec将解码后的数据放到此ByteBuffer[]中 我们可以直接在这里面得到PCM数据
decodeBufferInfo = new MediaCodec.BufferInfo();//用于描述解码得到的byte[]数据的相关信息
}
案例
因为没有mp3的资源,所以我就随便去qq音乐的排行榜下载了一首歌,G.E.M邓紫棋的《光年之外》,挺好听的。通过ffmpeg查看了这首mp3的信息。
可以从打印的内容中看到这首mp3重要的信息。44.1khz,(stereo)多声道,码率128kb/s,LAME编码。不知道为什么qq音乐没有使用aac编码,不过正好,我们可以将他转码成aac编码文件。
转码成功后,我们把他pull到电脑上。
可以看到,下载的mp3文件,3769367个字节,大概3.6MB,而我们进行转码过的aac文件,只有1.3MB的大小。但是音质上,基本听不出有任何的区别。
最近双十一临近,没太多时间更新,请大家原谅。
未完待更新...
上一篇:Android 音视频之音频编码
有问题的地方请大家帮忙指出,谢谢。
持续更新中...