使用TrackAudio播放AES加密的mp3

该博客介绍如何在Android中结合AES加密和TrackAudio播放加密的MP3文件。通过AES加密音频,然后在内存中解密,直接将解密后的音频数据传递给AudioTrack进行播放,避免了磁盘I/O操作。使用Jlayer库实现实时MP3解码,详细讲解了逻辑和实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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代码

InputStream in = new ByteArrayInputStream
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值