>Prolouge
我有一个使用 IBM Bluemix Watson Text to Speech 创建的.wav文件,我使用 Servlet 通过 Internet 发送该文件,该 servlet 提供了该文件的特定密钥。
我还有一个我使用的媒体播放器
MediaPlayer player = new MediaPlayer();
问题所在
我使用它来播放从服务器下载的曲目。起初我将其下载到我的内部存储中,但后来意识到它导致了一个问题,因为播放器由于访问限制而无法访问文件(媒体播放器无法读取该文件,因为它需要文件才能全局可读(。
不管玩家不管我做什么都不工作,总是写:
08-20 22:57:51.092 20507-20973/com.bikebeacon E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present
08-20 22:57:51.321 20507-20523/com.bikebeacon E/MediaPlayer: error (1, -2147483648)
或
08-20 22:57:51.321 20507-20523/com.bikebeacon E/MediaPlayer: error (38,0)
08-20 22:57:51.321 20507-20523/com.bikebeacon E/MediaPlayer: error (-38,0)
现在我的应用程序首先检查是否有可用的外部存储,如果有,它会将从互联网下载的文件保存到外部存储中的文件中(我检查过,该文件确实存在,但是由于某种原因我无法在手机中播放它(。
它是这样实现的:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes attr = new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).build();
mediaPlayer.setAudioAttributes(attr);
} else
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(new FileInputStream(trackFile).getFD());
mediaPlayer.prepare();
mediaPlayer.start();
response.close();
请注意,mediaPlayer = new MediaPlayer();
如果没有外部存储,应用会尝试从服务器流式传输应用,实现方式如下:
MediaPlayer mediaPlayer = new MediaPlayer();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes attr = new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).build();
mediaPlayer.setAudioAttributes(attr);
} else
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(NetworkDispatcher.URL_TYPES.FILE.toString());
mediaPlayer.prepare();
mediaPlayer.start();
在查看并挖掘整个日志之后,我看到FFMPEG尝试了很多尝试,试图找出该文件的****是什么,最后它吐了出来:
D/FFmpegExtractor: ffmpeg detected media content as 'audio/x-wav' with confidence 0.08
......
E/GenericSource: Failed to init from data source!
我不知道该怎么做或如何解决它,我对正在发生的事情的理论范围从损坏的WAV文件到特定的电话问题。
到目前为止,我所知道的:
"QCMediaPlayer媒体播放器不存在"的问题发生在root设备上,或者特别是在OnePlus设备上(倾向于前者(。
"error(1, -2147483648("的问题在此线程中得到了解决方案(Android MediaPlayer 在 2.1 上抛出"准备失败.: status=0x1",在 2.2 上有效(,但是,他们给出的答案要么是路径不正确(路径正确,三重检查(,缺少权限(在清单和运行时请求互联网和读写外部存储(, 或者它是不兼容的媒体类型,这可能是原因。
我
的实际理论:我发现了一篇文章,说IBM提供的格式(使用其文本转语音服务的合成方法(在Android中无法播放(如图所示:https://developer.ibm.com/answers/questions/180732/seems-watson-text-to-speech-service-returns-a-wav.html(。我看过很多关于这不适合人们(媒体播放器本身(的帖子,但没有一个(甚至没有:为什么 MediaPlayer 在创建它的实例时抛出不存在错误?有一个奇怪的模糊答案(实际上回答了手头的问题。
我能做什么?我完全不知道。我唯一的想法是编辑 wav 文件的标题(或 wav 文件的数据(,以增强 FFMPEG 的信心,以便它可以将其作为 wav 文件播放。
另一方面,我可能完全错了,在这种情况下,如果有人能纠正我的实际问题,我会很高兴。
尝试使用此库: https://github.com/brianwernick/ExoMedia 该库包装了Exoplayer,易于使用的音频和视频播放。
为什么要使用 MediaPlayer 播放 IBM 文本到语音转换?
为什么不直接使用他们的简单命令?
像这样:
TextToSpeech.sharedInstance().initWithContext(this.getHost(TTS_URL));
您还可以在以下位置找到更多信息: https://github.com/watson-developer-cloud/speech-android-sdk