android - 在android上播放从服务器下载的wav文件

标签 android audio ibm-cloud text-to-speech wav

开场白

我有一个使用 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/

相关文章:

c++ - 播放纯音(一个频率)并识别频率C++

android - Android:同步两个mediaPlayers(一个又一个播放)-消除差距

javascript - 每页上的音量按钮控制

ibm-cloud - Cloud Foundry 应用程序状态或运行状况通知?

cloudant - 如何将 Java 应用程序(java 代码)连接到 cloudant?

python - 蓝色混合 : How to upgrade pip?

渐变结束处的Android透明阴影白线

android - MathJax 不适用于 android

java - 在父级或祖先上下文中找不到方法

java - Gradle 报错 Android Resource linking Failed