后端以流的形式传音频 接收的时候是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 }