我想构建一个基于直播(广播)的应用程序。这里有一些我可以开始的链接: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(原生方法)
感谢您的建议。
答案 0 :(得分: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();
}