【问题标题】:Mediaplayer showing error(1,-2147483648) while playing byteArrayMediaplayer 在播放 byteArray 时显示错误(1,-2147483648)
【发布时间】:2022-10-13 15:54:50
【问题描述】:

我将一些音频流数据作为 base64 字符串,我将其转换为 byteArray,然后在本地写入一个文件作为 mp3 文件在媒体播放器中播放。但问题是媒体播放器出现错误(1,-2147483648)。如何解决这个问题,我尝试了很多 SO 帖子,但没有任何效果。

**what I am trying to do is fetch base64 string save locally and play**.

        val file = requireContext().getExternalFilesDir(null)?.absolutePath + "/audioRecording1.mp3"
        val mediaPlayer = MediaPlayer()
        try {
            val output = FileOutputStream(file)
            output.write(mp3SoundByteArray)
            output.close()
            val fis = FileInputStream(file)
            mediaPlayer.setDataSource(fis.fd)
            fis.close()
            mediaPlayer.setAudioAttributes(
                AudioAttributes.Builder().
                setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).
                setUsage(AudioAttributes.USAGE_MEDIA).
                build())
            mediaPlayer.prepareAsync()
            mediaPlayer.setOnPreparedListener {
                mediaPlayer.start()
            }
            mediaPlayer.setOnErrorListener { mediaPlayer, i, i2 ->

                Log.v("","${i,i2}")
                true
            }
        }catch (e:Exception){
            toast(e.message!!)
        }

你能告诉我如何克服这个吗?

【问题讨论】:

  • then write a file locally as mp3 file to play in mediaplayer. 好的,但这与 while playing byteArray 不匹配,因为它正在播放 mp3 文件。损坏的 mp3 文件?如果您的 mp3 文件不是有效的 mp3 文件,那么您不会询问媒体层,但更好的是如何解码 base64 以编写有效的 mp3 文件。
  • getting some audio streaming data as base64 String 这已经很奇怪了,因为这意味着比原始流多 30% 的字节。

标签: android kotlin android-mediaplayer


【解决方案1】:

我不确定,但似乎您在保存文件时遇到了问题

 fun saveFile(responseBody: ResponseBody?, pathWhereYouWantToSaveFile: String) {
        val body = responseBody ?: return
        var input: InputStream? = null
        try {
            val uri = Uri.parse(pathWhereYouWantToSaveFile)
            input = body.byteStream()
            val parcelFileDescriptor =
                context.getContentResolver().openFileDescriptor(uri, FileConst.WRITE_MODE)
            val fileOutputStream = FileOutputStream(parcelFileDescriptor?.fileDescriptor)
            fileOutputStream.use { output ->
                val bufferSize = BUFFER_SIZE.toInt()
                val buffer = ByteArray(bufferSize)
                var read: Int
                while (input.read(buffer).also { read = it } != END_OF_FILE) {
                    output.write(buffer, START_OFFSET, read)
                }
                output.flush()
            }
        } catch (exception: Exception) {
            logErrorIfDebug(exception)
        } finally {
            input?.close()
        }
    }

const val READ_MODE = "r"
const val WRITE_MODE = "w"
const val START_OFFSET = 0
const val END_OF_FILE = -1
const val BUFFER_SIZE = 4 * BYTES_IN_KILOBYTE

试试这个视图模型或者数据源层,然后将结果发送到 UI 层并在那里使用

你检查你的文件保存正确吗?您可以转到目录并尝试打开文件。如果一切正常,您可以通过媒体播放器中的 uri 获取它。 您还应该检查 - 也许您正在创建另一个保存和检索路径

更好的播放器使用方式是https://exoplayer.dev/

但是本机库也可以使用内部 uri 路径。

【讨论】:

  • 我可以玩 exoPlayer 来玩 byteArray 吗?
【解决方案2】:

如果您只是随机抽取 base64 编码音频流的一部分,那么您的 bytearray 将(在解码后)包含音频文件的一部分。

一些音频流字节。

不是带有标题等的完整有效 mp3 文件。

如果您说:am getting a mp3 file in one base64 String,那么您的方法就可以了。

【讨论】:

  • 问题是,我为了 TTS 目的向服务器发送了一些文本,服务器用该文本的 base64 音频响应我。我需要将该 base64 保存在设备的本地存储中以供以后播放。
  • 这对我的评论和回答没有任何反应。如果你不说到点子上,我对你的信息无能为力。
  • TTS? with a base64 audio of that text. 嗯.....是流吗?还是它是一个有效的 mp3 文件?你对我的回答没有反应。您收到的 base64 编码到底是什么?
  • 它是一条溪流……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2015-09-18
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多