【问题标题】:Playing downloaded wav file from server on android在android上播放从服务器下载的wav文件
【发布时间】:2017-08-20 21:08:23
【问题描述】:

序言

我有一个使用 IBM Bluemix Watson Text to Speech 创建的 .wav 文件,我使用为该文件提供特定密钥的 servlet 通过 Internet 发送它。
我还有一个媒体播放器,我使用

创建
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 媒体播放器不存在”的问题是在有根设备或特别是在 OnePlus 设备(倾向于前者)上发生的问题。

  • “错误(1,-2147483648)”的问题在这个线程(Android MediaPlayer throwing "Prepare failed.: status=0x1" on 2.1, works on 2.2)中给出了解决方案,但是,他们给出的答案是路径不正确(路径正确,三重检查),缺少权限(在清单和运行时请求互联网和读\写外部存储),或者它是不兼容的媒体类型,这可能是原因。


我的实际理论: 我发现一篇文章说 IBM 提供的格式(使用他们的 Text To Speech 服务的 synthize 方法)在 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 文件播放。
另一方面,我可能完全错了,在这种情况下,如果有人能纠正我的实际问题,我会很高兴。

【问题讨论】:

  • 你的问题不是很清楚。你能播放下载的文件吗(即设备有外部存储的情况)?如果不能,您可以使用音乐应用程序或设备上的任何其他应用程序播放此文件吗?如果您可以播放文件,但不能播放流,是否有可以播放该文件的应用程序,给定 URL?您可以将此 URL 流式传输到您的 PC 吗?你能把这个 URL 提供给 ffmpeg 并在它完全下载之前播放吗?
  • @AlexCohn - 下载的文件可以在电脑上播放,不能在手机上播放,媒体播放器无法识别。甚至不知道如何将 URL 提供给 ffmpeg,所以我无法回答,我可以将文件从 URL 下载到我的电脑并使用 BSPlayer 播放。
  • 看起来您的问题在 ibm dev question 中得到了准确的描述。答案是修改您收到的标头,因为它与 Android 播放器不兼容。如果您不知道如何解决这个问题,请让您的问题更简短、更具体。

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


【解决方案1】:

尝试使用这个库: https://github.com/brianwernick/ExoMedia 该库封装了 exoplayer ,便于音视频播放。

【讨论】:

    【解决方案2】:

    您为什么使用 MediaPlayer 播放 IBM 文本到语音?

    为什么不直接使用他们的简单命令?

    类似的东西:

    TextToSpeech.sharedInstance().initWithContext(this.getHost(TTS_URL));
    

    您还可以在以下位置找到更多信息: https://github.com/watson-developer-cloud/speech-android-sdk

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2017-10-19
      • 2017-10-18
      • 1970-01-01
      • 2015-12-30
      相关资源
      最近更新 更多