Home > Software engineering >  Mediaplayer showing error(1,-2147483648) while playing byteArray
Mediaplayer showing error(1,-2147483648) while playing byteArray

Time:10-13

I am getting some audio streaming data as base64 String, I convert it in byteArray and then write a file locally as mp3 file to play in mediaplayer. But the problem is mediaplayer througing error(1,-2147483648). How to solve this, I tried with many SO posts but nothing works.

**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!!)
        }

could you please tell me how to overcome this?

CodePudding user response:

I am not sure, but it seams that you have trouble with file saving

 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

Try this in your viewModel or data sourse layer, then send result to UI layer and use there

Have you checked that your file saved correct? You can go to directory and try to open file. If everything okey, you can get it by uri in your media player. Also you should check - perhaps you are creating another path for save and retrieve

Better way to use player is https://exoplayer.dev/

But native library also can work with internal uri path.

CodePudding user response:

If you just take a random part of a base64 encoded audio stream then your bytearray will (after decoding) contain a part of an audiofile.

Some audio stream bytes.

Not a complete valid mp3 file with headers and such.

If you had said: am getting a mp3 file in one base64 String then your approch would be ok.

  • Related