Android 播放音频数据以十六进制(Hex)

后端以流的形式传音频  接收的时候是Hex格式
需要将十六进制的音频数据转换为字节数组并进行播放

// 将十六进制字符串转换为字节数组
fun hexStringToByteArray(hexString: String): ByteArray {
    val len = hexString.length
    val data = ByteArray(len / 2)
    var i = 0
    while (i < len) {
        data[i / 2] = ((Character.digit(hexString[i], 16) shl 4) +
                Character.digit(hexString[i + 1], 16)).toByte()
        i += 2
    }
    return data
}

直接播放会流数据会报这个错误

java.io.FileNotFoundException: [B@16010e2: open failed: ENOENT (No such file or directory)

MediaPlayer 期望的音频源是一个文件路径或文件的 URI,而你传递给 setDataSource 方法的是一个字节数组。

为了解决这个问题,可以尝试将音频数据保存到文件中,然后使用文件路径或文件的 URI 作为音频源传递给 setDataSource 方法

var mediaPlayer: MediaPlayer? = null
val audioData = hexStringToByteArray(message.hex())
val audioFile = saveAudioToFile(audioData)
try {
    // 创建新的 MediaPlayer 实例
    mediaPlayer = MediaPlayer().apply {
        setAudioAttributes(AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build())
        setDataSource(audioFile.absolutePath)
        setOnCompletionListener { stopAudio() }
        prepareAsync()
        setOnPreparedListener { start() }
    }
} catch (e: IOException) {
    e.printStackTrace()
}

// 将音频数据保存到文件中

 fun saveAudioToFile(audioData: ByteArray): File {
    val audioFile = File(context.cacheDir, "audio_file.mp3")
    try {
        FileOutputStream(audioFile).use { outputStream ->
            outputStream.write(audioData)
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return audioFile
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值