5

我想构建一个基于实时流(广播)的应用程序。这里有一些我可以开始的链接:1)mp3,2)aac(“ http://79.143.70.114:8000/detifm-64k.aac ”)。

不幸的是,MediaPlayer 无法在装有 Android 2.x 的设备上播放这些链接。我对这种情况有点困惑,因为这篇文档指出 HTTP/HTTPS 直播流草案协议仅部分受 Android 2.x 系统支持 - 例如,我的设备(三星 I9001)无法播放链接从上面,但能够播放这个也是 mp3 直播,如此所述。在三星 GTS 5830 等其他设备上,即使是最新的链接也无法播放。

我的目标是尽可能地扩大用户群——我能做些什么来实现它?

首先,我对编码/解码技术不是很熟悉,但我想,编码相同的 mp3 有不同的方法,因为在“ http://188.138.112.71:9018/ ”时无法播放mp3( City Beat Radio)可以。所以我需要知道哪种类型的编码更适合 Android,并找出大多数设备都支持哪一种。表明“单声道/立体声 8-320Kbps 恒定 (CBR) 或可变比特率 (VBR)” - 这就是我需要知道的吗?在三星 GTS 5830 上播放直播流媒体怎么样?

其次,解码依赖于硬件。我见过一个名为Vitamio的库,它解决了播放第一个链接的问题,但我不喜欢用户必须下载额外的第三方软件的想法。此外,还有一个MoboPlayer也可以播放第一个链接。这是因为他们使用软件解码——我想知道是否有任何软件解码库可以合并到我的项目中。我想编写自己的解码器会很乏味,但欢迎您提出建议。

第三,我听说有一种通过 RTSP 协议进行直播的方式,Android 更好地支持这种方式,但我对这种做法并不熟悉,也没有找到任何可以查看的 mp3 直播示例。你觉得值得一试吗?你能举一个现场 rstp mp3 流的例子吗?

这是我用来测试的简单代码。第一个链接(mp3)导致java.io.IOException: Prepare failed.: status=0xFFFFFFF6第二个([aac][2]) -java.io.IOException: Prepare failed.: status=0x1

mMediaPlayer = new MediaPlayer();
    try {
        mMediaPlayer
            .setDataSource(
                this,
                Uri.parse("http://radio02-cn03.akadostream.ru:8114/detifm192.mp3"));
        mMediaPlayer.setOnPreparedListener(mOnPreparedListener);
        mMediaPlayer.setOnErrorListener(mOnErrorListener);
        //mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mMediaPlayer.prepare();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (NotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

private OnPreparedListener mOnPreparedListener = new OnPreparedListener() {

    @Override
    public void onPrepared(MediaPlayer mplayer) {
        mplayer.start();
    }
};

UPD

三星 I9001 上第一个链接(mp3)的 LOGCAT:

08-28 13:38:45.522: E/MediaPlayer(31713): 收到消息 msg=3, ext1=0, ext2=0 08-28 13:38:45.542: E/MediaPlayer(31713): 收到消息 msg=200 , ext1=1, ext2=26 08-28 13:38:45.542: W/MediaPlayer(31713): 信息/警告 (1, 26) 08-28 13:38:45.552: E/MediaPlayer(31713): 收到消息msg=100, ext1=-10, ext2=-10 08-28 13:38:45.552: E/MediaPlayer(31713): 错误 (-10, -10) 08-28 13:38:45.562: W/System。错误(31713):java.io.IOException:准备失败。:状态 = 0xFFFFFFF6 08-28 13:38:45.562:W/System.err(31713):在 android.media.MediaPlayer.prepare(本机方法)08- 28 13:38:45.562: W/System.err(31713): 在 com.example.sampleradioapp.MainActivity.onCreate(MainActivity.java:53) 08-28 13:38:45.562: W/System.err(31713) :在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 08-28 13:38:45.562:W/System。错误(31713):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)08-28 13:38:45.562:W/System.err(31713):在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java :1667) 08-28 13:38:45.562: W/System.err(31713): 在 android.app.ActivityThread.access$1500(ActivityThread.java:117) 08-28 13:38:45.562: W/System。错误(31713):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)08-28 13:38:45.562:W/System.err(31713):在 android.os.Handler.dispatchMessage(处理程序.java:99) 08-28 13:38:45.562: W/System.err(31713): 在 android.os.Looper.loop(Looper.java:130) 08-28 13:38:45.562: W/System .err(31713): 在 android.app.ActivityThread.main(ActivityThread.java:3687) 08-28 13:38:45.562: W/System.err(31713): 在 java.lang.reflect.Method。invokeNative(本机方法)08-28 13:38:45.562:W/System.err(31713):在 java.lang.reflect.Method.invoke(Method.java:507)08-28 13:38:45.592:W /System.err(31713): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 08-28 13:38:45.592: W/System.err(31713): 在 com. android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 08-28 13:38:45.592: W/System.err(31713): at dalvik.system.NativeStart.main(Native Method) 08-28 13 :38:45.622: I/MediaPlayer(31713): 信息 (1,26)38:45.592: W/System.err(31713): 在 dalvik.system.NativeStart.main(Native Method) 08-28 13:38:45.622: I/MediaPlayer(31713): Info (1,26)38:45.592: W/System.err(31713): 在 dalvik.system.NativeStart.main(Native Method) 08-28 13:38:45.622: I/MediaPlayer(31713): Info (1,26)

三星 GTS 5830 上第一个链接(mp3)的 LOGCAT:

08-28 13:15:54.119: I/MediaPlayer(24178): uri 是: http://radio02-cn03.akadostream.ru:8114/detifm192.mp3 08-28 13:15:54.119: I/MediaPlayer(24178 ): 路径为空 08-28 13:15:54.119: D/MediaPlayer(24178): 无法在客户端打开文件,尝试服务器端 08-28 13:16:05.139: E/MediaPlayer(24178): 错误(1, -2147483648) 08-28 13:16:05.249: E/MediaPlayer(24178): 错误 (1,-2147483648)

三星 I9001 上第二个链路 (aac) 的 LOGCAT:

08-28 13:40:46.681: E/MediaPlayer(31748): 收到消息 msg=100, ext1=1, ext2=-2147483648 08-28 13:40:46.681: E/MediaPlayer(31748): 错误 (1, -2147483648) 08-28 13:40:46.681: W/System.err(31748): java.io.IOException: 准备失败。: status=0x1 08-28 13:40:46.681: W/System.err(31748 ): 在 android.media.MediaPlayer.prepare(Native Method) 08-28 13:40:46.681: W/System.err(31748): 在 com.example.sampleradioapp.MainActivity.onCreate(MainActivity.java:53) 08 -28 13:40:46.691: W/System.err(31748): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 08-28 13:40:46.691: W/System.err(31748):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 08-28 13:40:46.691: W/System.err(31748): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 08- 28 时 13 分 40 分 46 秒。691: W/System.err(31748): 在 android.app.ActivityThread.access$1500(ActivityThread.java:117) 08-28 13:40:46.691: W/System.err(31748): 在 android.app。 ActivityThread$H.handleMessage(ActivityThread.java:935) 08-28 13:40:46.691: W/System.err(31748): 在 android.os.Handler.dispatchMessage(Handler.java:99) 08-28 13: 40:46.701: W/System.err(31748): 在 android.os.Looper.loop(Looper.java:130) 08-28 13:40:46.701: W/System.err(31748): 在 android.app .ActivityThread.main(ActivityThread.java:3687) 08-28 13:40:46.701: W/System.err(31748): 在 java.lang.reflect.Method.invokeNative(Native Method) 08-28 13:40: 46.701: W/System.err(31748): 在 java.lang.reflect.Method.invoke(Method.java:507) 08-28 13:40:46.701: W/System.err(31748): 在 com.android .internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 08-28 13:40:46.701: W/System.err(31748): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 08-28 13:40:46.701: W/System.err(31748):在 dalvik.system.NativeStart.main(本机方法)

三星 GTS 5830 上第二个链路 (aac) 的 LOGCAT:

08-28 13:19:03.929: I/MediaPlayer(24352): path is null 08-28 13:19:03.929: D/MediaPlayer(24352): 无法在客户端打开文件,尝试服务器端 08-28 13:19:29.119: E/MediaPlayer(24352): 错误 (1, -2147483648) 08-28 13:19:29.119: W/System.err(24352): java.io.IOException: Prepare failed.: status= 0x1 08-28 13:19:29.119: W/System.err(24352): 在 android.media.MediaPlayer.prepare(Native Method) 08-28 13:19:29.119: W/System.err(24352): 在com.example.sampleradioapp.MainActivity.onCreate(MainActivity.java:53) 08-28 13:19:29.119: W/System.err(24352): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 08 -28 13:19:29.119: W/System.err(24352): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 08-28 13:19:29.119: W/System.err(24352):在 android.app.ActivityThread。handleLaunchActivity(ActivityThread.java:1667) 08-28 13:19:29.119: W/System.err(24352): 在 android.app.ActivityThread.access$1500(ActivityThread.java:117) 08-28 13:19:29.119 : W/System.err(24352): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 08-28 13:19:29.119: W/System.err(24352): 在 android.os。 Handler.dispatchMessage(Handler.java:99) 08-28 13:19:29.119: W/System.err(24352): 在 android.os.Looper.loop(Looper.java:130) 08-28 13:19: 29.119: W/System.err(24352): 在 android.app.ActivityThread.main(ActivityThread.java:3687) 08-28 13:19:29.119: W/System.err(24352): 在 java.lang.reflect .Method.invokeNative(Native Method) 08-28 13:19:29.119: W/System.err(24352): at java.lang.reflect.Method.invoke(Method.java:507) 08-28 13:19: 29.129:W/System.err(24352):在 com.android.internal.os。ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 08-28 13:19:29.129: W/System.err(24352): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 08 -28 13:19:29.129:W/System.err(24352):在 dalvik.system.NativeStart.main(本机方法)

感谢您的建议。

4

1 回答 1

1
hi this may helps you

流式样

And Set MediaPlayer as
private void initializeMediaPlayer() {
        player = new MediaPlayer();
        try {
            player.setDataSource("http://usa8-vn.mixstream.net:8138");
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
于 2012-08-31T11:41:16.250 回答