MediaPlayer仅播放某些WAV文件

问题描述

因此,我正在编写的应用程序正在使用API​​并获取base64编码的WAV语音邮件。可以解码和创建WAV文件,但是在调用setDataSource时某些文件会崩溃。我可以从手机存储中提取WAV文件,然后在Mac上播放它们,因此我知道文件可以保存。

我正在解码的Base64看起来有所不同,我可以根据它看得出MediaPlayer是否播放它。我已经读过,WAV文件的比特率在MediaPlayer中的表现有所不同,所以我认为这可能是问题所在吗?即使播放相同的音频持续时间,无法播放的Base64也会比无法播放的Base64短得多。

    try {
        val fileInputStream = FileInputStream(voicemailFile)

        if (audioManager == null) {
            audioManager = context.getSystemService(Context.AUdio_SERVICE) as AudioManager?
        }

        audioManager?.let { audioManager ->
            audioManager.isspeakerphoneOn = isspeakerPhoneOn
            audioManager.mode = AudioManager.MODE_IN_CALL
        }

        mediaPlayer.setAudioAttributes(AudioAttributes
                .Builder()
                .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                .build())

        mediaPlayer.setDataSource(fileInputStream.fd)
        mediaPlayer.setonCompletionListener {
            finishPlayingVoicemail()
        }

        mediaPlayer.prepare()

        currentProgress?.let { currentProgress ->
            mediaPlayer.seekTo(currentProgress)
        }

        mediaPlayer.start()

        shouldResumePlaying = true

        fileInputStream.close()
    } catch (e: Exception) {
        e.printstacktrace()
    }

崩溃-

E/GenericSource: initFromDataSource,cannot create extractor!
E/GenericSource: Failed to init from data source!
E/MediaPlayerNative: error (1,-2147483648)
W/System.err: java.io.IOException: Prepare Failed.: status=0x1
W/System.err: at android.media.MediaPlayer.prepare(MediaPlayer.java:1274)

Base64播放与不播放的示例(只是较短的片段)

UklGRi96AABXQVZFZm10IBQAAAaraAEAQB8AANcPAAAAAQQAAgD5AWZhY3QEAAAAoPAAAGRhdGH7eQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwACqAA1CwyADYA2wQEgDeupwoNzQiub6tCiE1JYHJvLsYRDQSqMysiTBEM9QAGQCozLsKMDYkgcnLqxhTQxKozLuJQTQjktrbmikyNSKozLuLQDQkgrq9

^^不播放

UklGRqTvAwBXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YYDvAwD//wAAAAD/////AAD/////AAAAAP///f/+/wEAAgD///z/+v/6//3//v/+//3//v/9//3//v8BAAEA/v/6//j//P8CAAAA9//1//v//P/4//f//P/+//z/9//0//j//v8AAPv/+f/7//z/+v/5//v//P/8//v/+f/6/////P/1//b//f/9//f/9f/6//3/+//4//b/+v8CAAAA9//0//r//f/8//v//f/+//3/+v/5//v///8AAP7//f8AAP///P/7//3//v/8//v//P///wIAAAD7//

^^可以玩

解决方法

第一个示例是:

RIFF(小尾数)数据,WAVE音频,IMA ADPCM,单声道8000 Hz

秒是:

RIFF(小尾数)数据,WAVE音频,Microsoft PCM,16位,单声道16000 Hz

根据Supported media formats,在PCM/WAVE的详细信息下:

8位和16位线性PCM(速率达到硬件极限)。原始PCM记录的采样率为8000、16000和44100 Hz。

根据我对Pulse-code modulation的阅读,在确定那些文件是否为线性PCM时,第二个是线性PCM,而前一个是自适应差分PCM(ADPCM),因此可能不被支持,因此正在看到。

,

msbit的答案使我开始研究在Android上播放IMA ADPCM wav文件的方法。我决定尝试将MediaPlayer换成ExoPlayer。 ExoPlayer似乎在播放MediaPlayer无法播放的文件。

,

让我们尝试播放一个.wav文件。假设您的.wav文件的名称为test.wav,并且位于android项目的res.raw文件夹中。请尝试以下代码行,并让我知道。

Media mPlayer;
private Context mContext;
mPlayer = MediaPlayer.create(mContext,R.raw.test);
mPlayer.start();