我目前正在尝试设计一个简单的应用程序,流媒体互联网广播电台.我有电台的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)
有谁知道这意味着什么?
我已经阅读了一些有关这些状态错误的内容,但找不到任何适用于我的项目的内容.
我在播放存储在原始资源中的mp3文件时遇到了问题:当文件首次开始播放时,它可能会生成四分之一秒的声音,然后重新启动.(我知道这基本上是这里描述的问题的重复,但是那里提供的解决方案对我来说没有用.)我已经尝试了几个方面并且在这个问题上取得了一些进展,但它并没有完全修复.
这是我设置播放文件的方式:
mPlayer.reset();
try {
AssetFileDescriptor afd = getResources().openRawResourceFd(mAudioId);
if (afd == null) {
Toast.makeText(mOwner, "Could not load sound.",
Toast.LENGTH_LONG).show();
return;
}
mPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
afd.close();
mPlayer.prepare();
} catch (Exception e) {
Log.d(LOG_TAG, "Could not load sound.", e);
Toast.makeText(mOwner, "Could not load sound.", Toast.LENGTH_LONG)
.show();
}
Run Code Online (Sandbox Code Playgroud)
如果我退出活动(调用mPlayer.release())并返回它(创建一个新的MediaPlayer),口吃通常(但不总是)消失 - 只要我加载相同的声音文件.我尝试了几件没有任何区别的事情:
MediaPlayer.create(getContext(), mAudioId),并跳到调用setDataSource(...)和prepare().然后我注意到LogCat总是在播放开始时显示这一行:
DEBUG/AudioSink(37): bufferCount (4) is too small and increased to 12
Run Code Online (Sandbox Code Playgroud)
它让我想知道口吃是否是由于明显的重新缓解.这导致我尝试别的东西:
prepare(),拨打电话mPlayer.start()并立即拨打电话 …据我了解,如果编码为MPEG-4或3GPP,Android将只播放AAC格式的音频.
当它在应用程序的本地时,我能够播放编码为M4A的AAC音频,但是当从服务器获取它时它会失败.
以下工作,因为m4a文件本地保存在res/raw目录中.
MediaPlayer mp = MediaPlayer.create(this, R.raw.*file*);
mp.start();
Run Code Online (Sandbox Code Playgroud)
以下不起作用.(但MP3的确如此).
Uri uri = Uri.parse("http://*example.com*/blah.m4a");
MediaPlayer mp = MediaPlayer.create(this, uri);
mp.start();
Run Code Online (Sandbox Code Playgroud)
当m4a音频文件不是本地时,任何人都可以解释它失败的原因吗?
这是(一些)错误......
ERROR/PlayerDriver(542): Command PLAYER_INIT completed with an error or info UNKNOWN PVMFStatus
ERROR/MediaPlayer(769): error (200, -32)
WARN/PlayerDriver(542): PVMFInfoErrorHandlingComplete
DEBUG/MediaPlayer(769): create failed:
DEBUG/MediaPlayer(769): java.io.IOException: Prepare failed.: status=0xC8
DEBUG/MediaPlayer(769): at android.media.MediaPlayer.prepare(Native Method)
DEBUG/MediaPlayer(769): at android.media.MediaPlayer.create(MediaPlayer.java:530)
DEBUG/MediaPlayer(769): at android.media.MediaPlayer.create(MediaPlayer.java:507)
...
Run Code Online (Sandbox Code Playgroud)
我的目标是SDK 1.6.
编辑:
Android 2.2 MediaPlayer可以正常使用一个SHOUTcast URL,但不能与另一个一起使用
我需要播放来自外部URL(shoutcast流)的音频文件.目前,音频文件会逐步下载并在我们在手机本地临时存储中获得足够的音频时立即播放.我正在使用StreamingMediaPlayer类.
检查这段代码:
private MediaPlayer createMediaPlayer(File mediaFile)
throws IOException {
MediaPlayer mPlayer = new MediaPlayer();
//example of mediaFile =/data/data/package/cache/playingMedia0.dat
FileInputStream fis = new FileInputStream(mediaFile);
mPlayer.setDataSource(fis.getFD());
mPlayer.prepare();
return mPlayer;
}
Run Code Online (Sandbox Code Playgroud)
当前状态:
1-从Android 1.6到2.1工作正常,但在Android 2.2等更高版本中没有.
2-"mPlayer.setDataSource(fis.getFD())"是抛出错误的行.
3-错误是"无法创建媒体播放器"
尝试其他方案:
我尝试了下面的替代解决方案但到目前为止没有任
Android 2.2 MediaPlayer可以正常使用一个SHOUTcast URL,但不能与另一个一起使用
我在找什么?
我的目标是拥有可以在Android 2.1及更高版本上运行的代码.
这个问题也在这里讨论:
在2.2中流式传输shoutcast流中断的 2个android代码
3-本期网站上的很多问题也讨论了这个问题,但我发现答案没有.
4- markmail.org
LogCat跟踪:
Unable to to create media player
Error copying buffered conent.
java.lang.NullPointerException
com.ms.iradio.StreamingMediaPlayer.startMediaPlayer(StreamingMediaPlayer.java:251)
com.ms.iradio.StreamingMediaPlayer.access$2(StreamingMediaPlayer.java:221)
com.ms.iradio.StreamingMediaPlayer$2.run(StreamingMediaPlayer.java:204)
android.os.Handler.handleCallback(Handler.java:587)
android.os.Handler.dispatchMessage(Handler.java:92)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:3683)
java.lang.reflect.Method.invokeNative(Native Method) …Run Code Online (Sandbox Code Playgroud) 我能够ffmpeg使用摇滚播放器构建脚本构建库.
现在我有这个.so文件,我该如何播放视频?我希望LinearLayout在我的小视频中显示这个视频Activity.
可能吗?
更新:我知道使用VideoView或MediaPlayer+ 播放视频很容易SurfaceView.我只想更多地了解ffmpeg库以及如何在Android中显示帧Activity.
我正在尝试用Android的MediaPlayer创建一个音频流.如果它不能与Android 2.1或下面的版本一起工作,那就没关系了.我需要能够播放SHOUTcast流中的音频.这是我的代码:
player = new MediaPlayer();
try {
player.setDataSource("http://87.230.103.107:8000");
player.prepareAsync();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
player.start();
Run Code Online (Sandbox Code Playgroud)
出于某种原因,此代码将不会播放任何内容.我认为它可能与应用程序权限有关.有谁知道发生了什么?
谢谢!
[更新]我收到以下错误:
04-25 23:35:15.432: ERROR/MediaPlayer(283): start called in state 4
04-25 23:35:15.432: ERROR/MediaPlayer(283): error (-38, 0)
04-25 23:35:15.602: ERROR/MediaPlayer(283): Error (-38,0)
04-25 23:35:17.542: INFO/AwesomePlayer(33): calling prefetcher->prepare()
04-25 23:35:18.547: INFO/Prefetcher(33): [0x17650] cache below low water …Run Code Online (Sandbox Code Playgroud) 我有一个Service,它实现了MediaPlayer.OnPreparedListener.
到目前为止,我在一个函数中调用了player.setOnPreparedListener(this)并且运行良好.现在我想从Runnable调用setOnPreparedListener(使用Handler),但是我得到错误
MediaPlayer类型中的方法setOnPreparedListener(MediaPlayer.OnPreparedListener)不适用于参数(new Runnable(){})
因此,与其这样,我需要用的东西,将指向当前的类.问题是,什么?