object AudioDecodeUtil {
private const val TAG = "AudioDecodeUtil"
private const val KEY_BIT_WIDTH = "bit-width"
/* 编解码超时时间 */
private const val TIME_OUTS = 100L
/*媒体提取器、解码器*/
private var mediaExtractor: MediaExtractor? = null
private var mediaCodec: MediaCodec? = null
/*存放 PCM 文件的路径*/
private var pcmFilePath: String = ""
/*采样率、声道数*/
private var sampleRate: Int = 0
private var channelCount: Int = 0
/*当前解码的缓存信息,里面的有效数据在 offset 和 offset+size 之间*/
private var bufferInfo = MediaCodec.BufferInfo()
/*获取存储输出数据的 ByteBuffer 数组*/
private var outputBuffers = arrayOf<ByteBuffer>()
/*音频文件的采样位数字节数 = 采样位数 / 8*/
private var byteNumber: Int = 0
/*输出音频的媒体格式信息*/
private var outputFormat: MediaFormat? = null
/*当前输入数据的 ByteBuffer 序号,当前输出数据的 ByteBuffer 序号*/
private var inputBufferIndex: Int = 0
private var outputBufferIndex: Int = 0
/*结束输入数据的标志*/
private var decodeInputEnd = false
/**
* 将音乐文件解码
*
* @param musicFileUrl 源文件路径
* @param decodeFileUrl 解码文件路径
*/
fun decodeMusicFile(musicFileUrl: String?, decodeFileUrl: String?): Boolean {
MLog.d(TAG, "decodeMusicFile: musicFileUrl = $musicFileUrl, decodeFileUrl = $decodeFileUrl")
if (musicFileUrl.isNullOrEmpty() || decodeFileUrl.isNullOrEmpty()) {
MLog.d(TAG, "decodeMusicFile: 文件路径为空!!!")
return false
}
mediaExtractor = MediaExtractor()
// 给媒体信息提取器设置源音频文件路径
try {
mediaExtractor?.setDataSource(musicFileUrl)
} catch (ex: Exception) {
ex.printStackTrace()
try {
mediaExtractor?.setDataSource(FileInputStream(musicFileUrl).fd)
} catch (e: Exception) {
MLog.d(TAG, "decodeMusicFile: 设置解码音频文件路径错误!!!")
e.printStackTrace()
return false
}
}
// 获取音频格式轨信息
val mediaFormat = mediaExtractor?.getTrackFormat(0) ?: return false
// 从音频格式轨信息中读取 采样率,声道数,时长,音频文件类型
sampleRate =
if (mediaFormat.containsKey(MediaFormat.KEY_SAMPLE_RATE)) mediaFormat.getInteger(
MediaFormat.KEY_SAMPLE_RATE
) else 44100
channelCount =
if (mediaFormat.containsKey(MediaFormat.KEY_CHANNEL_COUNT))
音频-mp3 -> pcm 解码
于 2023-03-06 21:41:47 首次发布