音频-mp3 -> pcm 解码

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值