音频直播流:最大化用户群(解码问题)

时间:2012-08-25 13:15:04

标签: android

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

不幸的是,MediaPlayer在Android 2.x设备上无法播放这些链接。我对此情况感到困惑,因为this piece of documentation声明HTTP / HTTPS直播草稿协议仅部分支持Android 2.x系统 - 例如,我的设备(Samsung I9001)无法从上面播放链接,但能够播放这个也是一个mp3直播流,如here所述。在三星GTS 5830等其他设备上,即使是最新的链接也无法播放。

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

首先,我对编码/解码技术并不熟悉,但我想,有不同的方法来编码同一个mp3,因为mp3无法播放" http://188.138.112.71:9018/"(City Beat Radio)可以。所以我需要知道哪种类型的编码更适合Android,并找出大多数设备支持哪种编码。 This状态"单声道/立体声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

LOGCAT为Samsung I9001上的第一个链接(mp3):

  

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):info / warning(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.err(31713):java.io.IOException:准备   失败:状态= 0xFFFFFFF6 08-28 13:38:45.562:W / System.err(31713):     在android.media.MediaPlayer.prepare(Native Method)08-28   13:38:45.562:W / System.err(31713):at   com.example.sampleradioapp.MainActivity.onCreate(MainActivity.java:53)   08-28 13:38:45.562:W / System.err(31713):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)   08-28 13:38:45.562:W / System.err(31713):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)   08-28 13:38:45.562:W / System.err(31713):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)   08-28 13:38:45.562:W / System.err(31713):at   android.app.ActivityThread.access $ 1500(ActivityThread.java:117)08-28   13:38:45.562:W / System.err(31713):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:935)   08-28 13:38:45.562:W / System.err(31713):at   android.os.Handler.dispatchMessage(Handler.java:99)08-28   13:38:45.562:W / System.err(31713):at   android.os.Looper.loop(Looper.java:130)08-28 13:38:45.562:   W / System.err(31713):at   android.app.ActivityThread.main(ActivityThread.java:3687)08-28   13:38:45.562:W / System.err(31713):at   java.lang.reflect.Method.invokeNative(Native Method)08-28   13:38:45.562:W / System.err(31713):at   java.lang.reflect.Method.invoke(Method.java:507)08-28 13:38:45.592:   W / System.err(31713):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867)   08-28 13:38:45.592:W / System.err(31713):at   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)

LOGCAT获取Samsung GTS 5830上的第一个链接(mp3):

  

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:准备失败:状态= 0x1 08-28 13:40:46.681:   W / System.err(31748):在android.media.MediaPlayer.prepare(Native   方法)08-28 13:40:46.681:W / System.err(31748):at   com.example.sampleradioapp.MainActivity.onCreate(MainActivity.java:53)   08-28 13:40:46.691:W / System.err(31748):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)   08-28 13:40:46.691:W / System.err(31748):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)   08-28 13:40:46.691:W / System.err(31748):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)   08-28 13:40:46.691:W / System.err(31748):at   android.app.ActivityThread.access $ 1500(ActivityThread.java:117)08-28   13:40:46.691:W / System.err(31748):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:935)   08-28 13:40:46.691:W / System.err(31748):at   android.os.Handler.dispatchMessage(Handler.java:99)08-28   13:40:46.701:W / System.err(31748):at   android.os.Looper.loop(Looper.java:130)08-28 13:40:46.701:   W / System.err(31748):at   android.app.ActivityThread.main(ActivityThread.java:3687)08-28   13:40:46.701:W / System.err(31748):at   java.lang.reflect.Method.invokeNative(Native Method)08-28   13:40:46.701:W / System.err(31748):at   java.lang.reflect.Method.invoke(Method.java:507)08-28 13:40:46.701:   W / System.err(31748):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867)   08-28 13:40:46.701:W / System.err(31748):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)08-28   13:40:46.701:W / System.err(31748):at   dalvik.system.NativeStart.main(原生方法)

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

  

08-28 13:19:03.929:I / MediaPlayer(24352):路径为空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:准备失败:状态= 0x1 08-28 13:19:29.119:   W / System.err(24352):在android.media.MediaPlayer.prepare(Native   方法)08-28 13:19:29.119:W / System.err(24352):at   com.example.sampleradioapp.MainActivity.onCreate(MainActivity.java:53)   08-28 13:19:29.119:W / System.err(24352):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)   08-28 13:19:29.119:W / System.err(24352):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)   08-28 13:19:29.119:W / System.err(24352):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)   08-28 13:19:29.119:W / System.err(24352):at   android.app.ActivityThread.access $ 1500(ActivityThread.java:117)08-28   13:19:29.119:W / System.err(24352):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:935)   08-28 13:19:29.119:W / System.err(24352):at   android.os.Handler.dispatchMessage(Handler.java:99)08-28   13:19:29.119:W / System.err(24352):at   android.os.Looper.loop(Looper.java:130)08-28 13:19:29.119:   W / System.err(24352):at   android.app.ActivityThread.main(ActivityThread.java:3687)08-28   13:19:29.119:W / System.err(24352):at   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):at   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):at   dalvik.system.NativeStart.main(原生方法)

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

hi this may helps you

streaminlike

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();
        }