MediaPlayer只播放某些WAV文件



所以我正在编写的应用程序正在访问API并获得base64编码的WAV语音邮件。解码和创建WAV文件是可行的,但有些文件在调用setDataSource时会崩溃。我可以从手机存储中提取WAV文件,并在Mac上播放,这样我就知道文件保存得很好。

我正在解码的Base64看起来不一样,我可以根据看它来判断MediaPlayer是否会播放它。我读到WAV文件比特率与MediaPlayer的表现不同,所以我认为这可能是问题所在?即使在相同的音频持续时间下,不播放的Base64也比播放的Base六十四短得多。

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

根据支持的媒体格式,在PCM/WAVE:的详细信息下

8位和16位线性PCM(速率最高可达硬件限制(。8000、16000和44100 Hz的原始PCM记录的采样率。

根据我对脉冲编码调制的阅读,在确定这些文件是否是线性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();

相关内容

  • 没有找到相关文章

最新更新