MediaPlayer prepare()挂起在自定义设备上

时间:2018-05-14 20:13:12

标签: android android-mediaplayer

我目前正在自定义平板电脑上实现流媒体互联网音频(即不是三星,谷歌等)。我开发了代码,并在三星平板电脑上进行了测试。在自定义平板电脑上安装时,MediaPlayer会挂断prepare()。我已将OnPreparedListenerOnErrorListenerOnBufferingUpdateListnerOnCompletionListener全部用于日志以实现基本故障排除。我正在一个扩展Service并使用单独线程的类中实现流式传输。我尝试了prepare()prepareAsync()

澄清一下,当我说MediaPlayer 挂起时,我的意思是我没有收到任何错误消息,崩溃,日志输出等。该应用程序继续运行,但是{{1}永远不会被召唤。

我按照以下方式配置播放器:

onPrepared(...)

我尝试播放这样的音乐流:

private void configureMediaPlayer(String streamUrl) {
    mMediaPlayer = new MediaPlayer();
    AudioAttributes attributes = new AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build();
    mMediaPlayer.setAudioAttributes(attributes);
    Log.d(TAG, "Media player configured");
    playTuneInStation(streamUrl);
}

我实现了private void playStation(String streamUrl) { Log.d(TAG, "playStation: " + streamUrl); if (mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); mMediaPlayer.reset(); Log.d(TAG, "Stopped media player."); } try { mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnErrorListener(this); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setDataSource(streamUrl); new Handler(getMainLooper()).post(() -> Log.d(TAG, "Main thread: " + Thread.currentThread().getId())); Log.d(TAG, "Preparing stream on thread: " + Thread.currentThread().getId() + "."); mMediaPlayer.prepare(); Log.d(TAG, "Waiting for media player to be prepared"); } catch (IOException e) { //TODO: Gracefully inform user of failure e.printStackTrace(); } } 来开始播放流:

onPrepared(MediaPlayer mp)

同样,这在三星桌上运行良好,但由于项目的性质,我们必须使用客户提供的自定义平板电脑。我们在一些似乎工作和播放音频的地方使用@Override public void onPrepared(MediaPlayer mp) { Log.d(TAG, "Media player prepared. Starting playback."); mp.start(); } s,但这些是设备上的本地文件(不确定是否重要)。这些设备使用4G网络,所有网络api呼叫都运行正常,所以我认为它不会与网络有任何关系。我发现奇怪的是它会永远挂起(我让它静置30分钟没有崩溃,错误,日志等)。该应用程序在此期间完全响应。

我不确定是否有其他可以使用的配置可能有所帮助。任何帮助将不胜感激。

更新

我尝试通过替换:

来加载本地音频文件
VideoView

使用:

setDataSource(streamUrl);

它播放音频没有问题。

更新2

我现在尝试将无效的网址传递给setDataSource(this, Uri.parse(filename)); 方法,并调用setDataSource(...),并显示无法加载资源的错误。此外,我传入了应该工作的URL,但从最后剥离了几个字符。它似乎认为它是一个潜在有效的流,因为它发布了错误日志,并在OnErrorListener失败之前重试加载资源10次。

以下是调用OnErrorListener(也尝试使用prepare())时收到的日志:

prepareAsync()

它会在这些日志中查看它开始解析音频,但之后没有任何事情发生。

1 个答案:

答案 0 :(得分:0)

好吧,因为没有任何崩溃或正确的日志指向任何东西,我转而使用谷歌的ExoPlayer,这似乎工作正常。

private void configureMediaPlayer(String streamUrl) {
    Log.d(TAG, "configureMediaPlayer: " + streamUrl);
    DefaultBandwidthMeter meter = new DefaultBandwidthMeter();
    mMediaPlayer = ExoPlayerFactory.newSimpleInstance(this,
            new DefaultTrackSelector(
                    new AdaptiveTrackSelection.Factory(
                            meter)));
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
            Util.getUserAgent(this, "appName"), meter);
    mMediaSourceFactory = new ExtractorMediaSource.Factory(dataSourceFactory);
    mMediaPlayer.setPlayWhenReady(true);
    MediaSource mediaSource = mMediaSourceFactory.createMediaSource(Uri.parse(streamUrl));
    Log.d(TAG, "playTuneInStation: media source set");
    mMediaPlayer.addListener(this);
    mMediaPlayer.prepare(mediaSource);
}

如果有人对使用MediaPlayer的原创想法无效的想法有任何想法,请随时发表评论或发布其他答案。感谢。