我目前正在尝试设计一个简单的应用程序,流媒体互联网广播电台.我有电台的URL,我正在设置媒体播放器
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(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) {
e.printStackTrace();
}
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)
模拟时程序没有崩溃,但没有播放,我收到以下错误:
start called in state 0
Run Code Online (Sandbox Code Playgroud)
就在它下面
Error (-38,0)
Run Code Online (Sandbox Code Playgroud)
有谁知道这意味着什么?
我已经阅读了一些有关这些状态错误的内容,但找不到任何适用于我的项目的内容.
SDK级别8(Froyo)引入了MediaPlayer连接到流媒体源的本机功能,如Shoutcast.以前的SDK版本能够执行变通办法,例如在设备上运行本地代理(请参阅NPR).
我采用与NPR相同的方法并使用StreamProxy.但是,NPR首先检查当前运行的SDK是否小于8.如果是,则使用代理.否则,它直接连接.
我的StreamProxy从Shoutcast服务器请求元数据,因此它不会简单地将数据从Shoutcast路由到我的客户端.相反,它会解析出元数据并相应地使用它,并且仅路由音乐数据.
当尝试在SDK级别8或更高级别使用StreamProxy时,MediaPlayer无法准备.我的StreamProxy接收连接并接受它,但在成功地将状态行和标题写入客户端之后,下一次写入产生java.net.SocketException: Connection reset by peer.这导致客户的媒体播放器抛出一个Error(1,-1007).
我试图弄清楚为什么MediaPlayer无法连接到我的本地代理.它应该与没有元数据的原始源连接相同,这确实有效.我通过我的代理(包括内容类型)转发来自外部源的所有标头.
我会继续研究它,但我觉得我已经走到了尽头.如果需要更多细节,请告诉我.
因为很长一段时间我都在试着听.pls文件(shoutcasts).我不得不说我失败了.由于StreamFurious可以做到这一点,它必须是可能的.首先,我尝试通过套接字(TCP和UDP)连接到shoutcast - >失败.我甚至无法从服务器接收一个字节.
我快要哭了.我甚至不知道建立连接的最佳方式是什么,然后继续下载/接收数据流.
我真的希望有人可以指出我正确的方向并给我一个简短的代码段(如果有的话).
Rgds Layne
在我的一个项目中,我正在使用无尽的流来实现现场广播.我可以毫无问题地使用nativ Android MediaPlayer,也可以在运行旧版Android的设备上使用,因为该流的类型为audio/mpeg.我在运行1.6的HTC Magic上进行了测试,它运行完美无缺.即使在WLAN和3G之间切换它也只是缓冲起来,我只注意到一个小打嗝,然后它继续播放,好像什么也没发生.它也很少丢失连接,因为我在工作日期间一直在收听广播,也在上下班途中收听,以确保用户体验与我想要的完全一样.我已经为其他设备重复了相同的程序,例如运行Android 2.1的HTC Legend,运行2.2的HTC Wildfire和运行2.2的三星Galaxy Tab,结果相同.所有设备都能完美地处理流.
然而,这就是我遇到困难的地方,在运行2.2的HTC Desire上我遇到了严重的问题让游戏进行播放.当使用MediaPlayer的标准实现,即setDataSource(字符串路径)时,它会播放10 - 30秒,即使我在WLAN和3G上都有完全接收,它也会失去连接.我尝试了不同的方法来解决这个问题,一个是使用NPR新闻项目的StreamProxy,经过一些修改后实际上工作得很好.然而,HTC Desire仍然不时地断开连接,并且在某些情况下尝试重新连接4-5次,直到它实际上成功地保持稳定的连接.
我在使用代理时遇到的错误如下所示
08-08 09:35:17.810: ERROR/AwesomePlayer(67): Not sending buffering status because duration is unknown.
08-08 09:35:19.849: ERROR/HTTPStream(67): recv failed, errno = 11 (Try again)
08-08 09:35:19.849: INFO/HTTPDataSource(67): Retry ... 2 times left
08-08 09:35:19.849: WARN/HTTPStream(67): Calling connect()...
08-08 09:35:19.849: WARN/HTTPStream(67): Returned from connect()...
08-08 09:35:20.739: ERROR/(1576): Broken pipe
08-08 09:35:20.739: ERROR/(1576): java.net.SocketException: Broken pipe
08-08 09:35:20.739: ERROR/(1576): at org.apache.harmony.luni.platform.OSNetworkSystem.writeSocketImpl(Native Method)
08-08 09:35:20.739: ERROR/(1576): at org.apache.harmony.luni.platform.OSNetworkSystem.write(OSNetworkSystem.java:723) …Run Code Online (Sandbox Code Playgroud) 请参阅我用于流式传输shoutcast流的代码,它适用于一个URL但不适用于另一个URL.
这个工作:
Uri myUri = Uri.parse("http://fr3.ah.fm:9000/");
Run Code Online (Sandbox Code Playgroud)
但不是这个:
Uri myUri = Uri.parse("http://someOtherURL");
Run Code Online (Sandbox Code Playgroud)
SimpleMusicStream.java
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class SimpleMusicStream extends Activity implements
MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener {
private String TAG = getClass().getSimpleName();
private MediaPlayer mp = null;
private Button play;
private Button pause;
private Button stop;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
play = (Button) findViewById(R.id.play);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
play.setOnClickListener(new View.OnClickListener() …Run Code Online (Sandbox Code Playgroud) 我最近遇到了使用Android 传输AAC +无线电流的一些问题MediaPlayer.关于文档,应该支持在Android 4.1中流式传输AAC +.(测试设备是带有Android 4.2.2的Nexus 2)
我发现了一些相关的问题(请点击这里,这里或这里),但它们主要与较旧的Android版本有关或在4.1版本发布之前的日期.我找到了AACPlayerAndroid图书馆,但你必须购买许可证..
如果我尝试流式传输AACPlus流,则MediaPlayer会抛出MediaPlayerError (1,-2147483648),这被定义为"不支持的媒体格式".但是,如果我在模拟器中启动相同的AAC + Stream,它工作正常!
到目前为止我尝试了什么:
在模拟器中尝试相同的代码工作?!?(为什么..也许在本地机器上支持编解码器?)
使用4.1或4.2测试另外两个设备也会失败
设置AAC +流与手动标头和使用setDataSource(String path),这不起作用(更改http标头也失败)
设置一个新的SimpleMediaPlayer项目 - >也失败了
试图检查网络流量,如果Android设备被重定向到错误的网址.实际上我Charles使用a 连接设备Proxy,但只能监控Android浏览器.我仍然认为重定向是正确的!
这是我的Streaming.class的setDataSource的实现
public AmplifyMediaPlayer(PlayerStationObject playerStationObject, Context context) {
super();
this.setAudioStreamType(AudioManager.STREAM_MUSIC);
this.mCurrentStationObject = playerStationObject;
try {
//AAC+ TestStream #1: NOT WORKING
//Uri uri = Uri.parse("http://up-gc2.webnow.com.br/alpha.aac");
//AAC+ TestStream #2: NOT WORKING
//Audio codec: 64 kbit/s 44.1 kHz AAC+, 128 …Run Code Online (Sandbox Code Playgroud) 以下代码在Android 2.1update1上运行正常 -
package com.troubadorian.android.teststreaming;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Gallery.LayoutParams;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ViewSwitcher;
public class TestStreaming extends Activity
{
private Button streamButton;
private ImageButton playButton;
private TextView textStreamed;
private boolean isPlaying;
private StreamingMediaPlayer audioStreamer;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
initControls();
}
protected void …Run Code Online (Sandbox Code Playgroud) 可以在Android中播放互联网广播流吗?而且由于大多数互联网收音机都使用彩信来传输他们的内容,这可能是使用Android吗?
我正在尝试播放一个网址,但它没有播放,而我使用的代码在下面......日志显示Mediaplayer错误(1,-1002),开始状态为0,错误(-38,0)为什么......?我哪里出错了......你可以帮帮我怎么玩........
import java.io.IOException;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
public class BacaFatihahActivity extends Activity {
final String songs_urIs= "http://stream.radiosai.net:8002/";
// private TextView txt_song_title;
private MediaPlayer mediaplayer;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageButton btn_play = (ImageButton) findViewById(R.id.button_play);
ImageButton btn_pause = (ImageButton) findViewById(R.id.button_pause);
ImageButton btn_next = (ImageButton) findViewById(R.id.button_next);
ImageButton btn_previous = (ImageButton) findViewById(R.id.button_Previous);
//txt_song_title = (TextView) findViewById(R.id.txt_song_title);
mediaplayer = new MediaPlayer();
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
btn_play.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try { …Run Code Online (Sandbox Code Playgroud)