我有一个使用IBM Bluemix Watson Text to Speech创建的.wav文件,我使用一个带有该文件特定密钥的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)
现在我的应用程序首先检查是否有可用的外部存储器,如果有,则将从Internet下载的文件保存到外部存储器中的文件(我检查过,文件确实存在,但我可以'因某种原因在我的手机中播放。)
实现方式如下:
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媒体播放器不存在"是在根设备上发生的问题,或者特别是在OnePlus设备上发生的问题(倾向于前者)。
问题"错误(1,-2147483648)"在这个线程中给出了一个解决方案(Android MediaPlayer throwing "Prepare failed.: status=0x1" on 2.1, works on 2.2),但是,他们给出的答案是路径不正确(路径正确,三重检查),缺少权限(在清单和运行时请求互联网和read \ write external)存储),或者它是不兼容的媒体类型,这可能是原因。
我的实际理论:
我发现一篇帖子说IBM提供的格式(用于Text To Speech服务的合成方法)在android中无法播放(如下所示:https://developer.ibm.com/answers/questions/180732/seems-watson-text-to-speech-service-returns-a-wav.html)。我看过很多关于这个不适用于人们的帖子(媒体播放器本身),而且没有一个(甚至不是Why MediaPlayer throws NOT present error when creating instance of it?有一个奇怪的模糊答案)实际上回答了手头的问题。
我该怎么办?
我完全不知道。我唯一的想法是编辑wav文件的标题(或wav文件的数据),以增强FFMPEG的可信度,使其可以作为wav文件播放。
另一方面,我可能完全错了,在这种情况下,如果有人能够纠正我的实际问题,我会很高兴。
答案 0 :(得分:0)
尝试使用此库: https://github.com/brianwernick/ExoMedia 这个库包装了exoplayer,易于用于音频和视频播放。
答案 1 :(得分:0)
为什么要使用MediaPlayer播放IBM文本到语音?
为什么不使用他们简单的命令?
类似的东西:
TextToSpeech.sharedInstance().initWithContext(this.getHost(TTS_URL));
您还可以在以下位置找到更多信息: https://github.com/watson-developer-cloud/speech-android-sdk