【问题标题】:Android Media Player streaming - works in emulator, fails on hardwareAndroid 媒体播放器流媒体 - 在模拟器中工作,在硬件上失败
【发布时间】:2013-03-06 19:58:52
【问题描述】:

我遇到了一个与 Android、流媒体和媒体播放器有关的奇怪问题。

实际的应用程序相当复杂,但我提出了最简单的测试用例:“Hello, World”活动启动带有硬编码 URL 的媒体播放器。这在 Android 模拟器中运行良好,API 级别 7(这是真实应用程序的最低级别)和 API 级别 17。但是,同一个应用程序在 API 级别 15 的硬件设备上失败 - 媒体播放器在 prepare() 调用期间失败:

  • 如果使用阻塞prepare(),它会因IOException而失败
  • 如果使用非阻塞 prepareAsync(),它会失败并触发 onErrorListener(不会引发异常)。

失败总是(阻塞和非阻塞准备)显示“错误(1,-2147483648)”。媒体播放器文档没有此类错误代码 -2147483648 (0xffffffff)。

该应用具有访问互联网的适当权限(android.permission.INTERNET)并且设备的互联网连接正常(同一应用可以从互联网下载文件)。

这不是编解码器问题 - 因为模拟器可以播放相同的流,并且任何其他流在硬件设备上都以相同的方式失败。

尝试了许多其他没有帮助的方法:

  • 使用 pepareAsync() 和 onPreparedListener 调用 start()
  • 在媒体播放器上调用 reset()
  • 通过 Uri.parse() 设置数据源
  • 从音频管理器获取音频焦点

硬件工作正常,因为同一设备可以使用 Android 内置的默认音频播放器应用播放其存储中的音频文件。

我不太相信鬼魂,但我已经没有其他选择了。有人见过这样的吗?该应用在模拟器中运行,但在硬件上不运行?

任何人都可以在硬件设备上试用此代码吗(我只有一台 Android 设备)?

public class MainActivity extends Activity {

private MediaPlayer mediaPlayer;
private String listen_url = "http://stream15.top-ix.org:80/radiojukebox-low";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mediaPlayer = new MediaPlayer();
    //mediaPlayer.reset();

    try {
        mediaPlayer.setDataSource(listen_url);
        //mediaPlayer.setDataSource(this, Uri.parse(listen_url));
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
                    // We fail here!
        e.printStackTrace();
    }

    mediaPlayer.start();
}
}

【问题讨论】:

    标签: android media-player emulation hardware


    【解决方案1】:

    这通常是因为您使用的设备不支持流类型。您尝试过简单的 MP3 流吗?

    【讨论】:

    • “设备不支持流类型”怎么可能?如果模拟器中的 API 7 播放,硬件上的 API 15 怎么会“不支持”?
    • 您的 PC 可能比您的手机支持的编解码器更多。它与 API 级别无关,这是制造商决定放入其中的。谷歌错误信息,这是我找到的最常见的解释。
    • API 15 测试台为 Android 4.0.3 内核版本 3.0.8。我在另一台设备上尝试了相同的应用程序,HTC Deside C 手机 4.0.3 但内核版本 3.0.16 - 它在那里工作。所以我可能会在我的原始设备上处理一些糟糕的 Adndoid 构建(它使用供应商提供的 Android 构建)?有地方(站点存储库)可以检查吗?
    • 我怀疑这是一个“糟糕的构建”,但我想这是可能的。更有可能该格式不是保证在所有设备上都可以使用的格式之一,并且仅受某些设备支持。检查this link
    • 输入 #0,mp3,来自“radiojukebox-low”:持续时间:00:00:14.87,开始:0.000000,比特率:64 kb/s 流 #0:0:音频:mp3, 44100 Hz、立体声、s16、64 kb/s
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多