问题描述
因此,我正在编写的应用程序正在使用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();