开场白
我有一个使用 IBM Bluemix Watson Text to Speech 创建的 .wav 文件,我使用随文件的特定 key 提供的 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 mediaplayer NOT present”的问题是发生在已获得 root 权限的设备上,或者特别是在 OnePlus 设备上(倾向于前者)。
“error(1, -2147483648)”问题在此线程 ( Android MediaPlayer throwing "Prepare failed.: status=0x1" on 2.1, works on 2.2 ) 中给出了解决方案,但是,他们给出的答案是路径不正确(路径正确,三重检查),缺少权限(在 list 和运行时中请求互联网和读\写外部存储),或者它是不兼容的媒体类型,这可能是原因。
我的实际理论:
我发现一篇文章说 IBM 提供的格式(使用其文本转语音服务的合成方法)在 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 文件播放。
另一方面,我可能完全错了,在这种情况下,如果有人能纠正我的实际问题,我会很高兴。
最佳答案
尝试使用这个库: https://github.com/brianwernick/ExoMedia 这个库包装了 exoplayer ,易于用于音频和视频播放。
关于android - 在android上播放从服务器下载的wav文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45786826/