admin管理员组

文章数量:1575502

使用TrackAudio播放AES加密的MP3

问题背景

本demo主要对声音进行加密,解密,在网上有一篇文章介绍了如何使用AES算法在java中对音频进行加密Android 加密/解密音频文件(AES)。
其具体的做法就是将加密文件和解密文件全部保存到存储器上,频繁的读写硬盘可不是一个好的建议,所以寻找能够保存的是加密的音频,然后直接对加密音频进行解密,之后直接在内存中进行播放。
于是又找到了一篇关于实时播放wav,但是我需要的是mp3,最好还是解决实时播放wav文章的最初原作者同样给出了实时解码mp3的解决方法-Android Audio: Play an MP3 file on an AudioTrack下面的代码就是混合了他们所有人的产物,部分内容也是直接翻译过来。

逻辑

为什么加密和TrackAudio能够混在一起用,讲下这里的逻辑:因为播放mp3使用TrackAudio,它使用的是音频流,即输入的是byte[],而AES解密后输出也是byte[],所以AES解密后直接输出byte的,再传递给TrackAudio进行音频播放也就顺理成章了。
而具体的流程就是:使用AES机密mp3文件,并将解密后的文件newByte_track(byte[]类型),直接交给ByteArrayInputStream变成InputStream in;

InputStream in = new ByteArrayInputStream(newByte_track); 
Bitstream bitstream = new Bitstream(in);

变为Bitstream bitstream ,而Jlayer正好可以将bitstream 作为输入,然后输出SampleBuffer

SampleBuffer sampleBuffer = (SampleBuffer) mDecoder.decodeFrame(header, bitstream);

最后把SampleBuffer 转换为byte[],我们的TrackAudio是可以直接播放byte[]。

不谈加密,直接播放MP3

以下来自翻译
在Android中能够播放mp3的接口只有MediaPlayer,沉重,慢,并且仅提供高级接口,如果你需要修改或者混合音频流的话,你就得自己动手,AudioTrack就能帮到你,我建议先阅读(the article about playing a WAV) 这篇文章,它包含了一些关于PCM基本常识。
因为WAV文件基本可以算无损,而MP3就不同了,它已经经过复杂的算法解码过,所以我们需要借助第三方代码,允许我们将MP3数据转换为raw PCM数据,之后就可以按部就班的让AudioTrack播放了。
经过漫长的搜索,终于找到了一款mp3解码器Jlayer。它可以轻松的解码MP3(当然从Jlayer的界面也能看出,它是为Java SE 平台专设的,时间也是许久之前,不过Android也基于java,所以索性就试试),Jlayer的授权协议类LGPL 协议,对商用app也非常友好。
在使用Jlayer之前,首先把它导入进来到你的项目中来。
下边是调用Jlayer代码

本文标签: TrackAudioAES