我目前正在自定义平板电脑上实现流媒体互联网音频(即不是三星,谷歌等)。我开发了代码,并在三星平板电脑上进行了测试。在自定义平板电脑上安装时,MediaPlayer
会挂断prepare()
。我已将OnPreparedListener
,OnErrorListener
,OnBufferingUpdateListner
和OnCompletionListener
全部用于日志以实现基本故障排除。我正在一个扩展Service
并使用单独线程的类中实现流式传输。我尝试了prepare()
和prepareAsync()
。
澄清一下,当我说MediaPlayer
挂起时,我的意思是我没有收到任何错误消息,崩溃,日志输出等。该应用程序继续运行,但是{{1}永远不会被召唤。
我按照以下方式配置播放器:
onPrepared(...)
我尝试播放这样的音乐流:
private void configureMediaPlayer(String streamUrl) {
mMediaPlayer = new MediaPlayer();
AudioAttributes attributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build();
mMediaPlayer.setAudioAttributes(attributes);
Log.d(TAG, "Media player configured");
playTuneInStation(streamUrl);
}
我实现了private void playStation(String streamUrl) {
Log.d(TAG, "playStation: " + streamUrl);
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.reset();
Log.d(TAG, "Stopped media player.");
}
try {
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setDataSource(streamUrl);
new Handler(getMainLooper()).post(() -> Log.d(TAG, "Main thread: " + Thread.currentThread().getId()));
Log.d(TAG, "Preparing stream on thread: " + Thread.currentThread().getId() + ".");
mMediaPlayer.prepare();
Log.d(TAG, "Waiting for media player to be prepared");
} catch (IOException e) {
//TODO: Gracefully inform user of failure
e.printStackTrace();
}
}
来开始播放流:
onPrepared(MediaPlayer mp)
同样,这在三星桌上运行良好,但由于项目的性质,我们必须使用客户提供的自定义平板电脑。我们在一些似乎工作和播放音频的地方使用@Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "Media player prepared. Starting playback.");
mp.start();
}
s,但这些是设备上的本地文件(不确定是否重要)。这些设备使用4G网络,所有网络api呼叫都运行正常,所以我认为它不会与网络有任何关系。我发现奇怪的是它会永远挂起(我让它静置30分钟没有崩溃,错误,日志等)。该应用程序在此期间完全响应。
我不确定是否有其他可以使用的配置可能有所帮助。任何帮助将不胜感激。
更新
我尝试通过替换:
来加载本地音频文件VideoView
使用:
setDataSource(streamUrl);
它播放音频没有问题。
更新2
我现在尝试将无效的网址传递给setDataSource(this, Uri.parse(filename));
方法,并调用setDataSource(...)
,并显示无法加载资源的错误。此外,我传入了应该工作的URL,但从最后剥离了几个字符。它似乎认为它是一个潜在有效的流,因为它发布了错误日志,并在OnErrorListener
失败之前重试加载资源10次。
以下是调用OnErrorListener
(也尝试使用prepare()
)时收到的日志:
prepareAsync()
它会在这些日志中查看它开始解析音频,但之后没有任何事情发生。
答案 0 :(得分:0)
好吧,因为没有任何崩溃或正确的日志指向任何东西,我转而使用谷歌的ExoPlayer
,这似乎工作正常。
private void configureMediaPlayer(String streamUrl) {
Log.d(TAG, "configureMediaPlayer: " + streamUrl);
DefaultBandwidthMeter meter = new DefaultBandwidthMeter();
mMediaPlayer = ExoPlayerFactory.newSimpleInstance(this,
new DefaultTrackSelector(
new AdaptiveTrackSelection.Factory(
meter)));
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
Util.getUserAgent(this, "appName"), meter);
mMediaSourceFactory = new ExtractorMediaSource.Factory(dataSourceFactory);
mMediaPlayer.setPlayWhenReady(true);
MediaSource mediaSource = mMediaSourceFactory.createMediaSource(Uri.parse(streamUrl));
Log.d(TAG, "playTuneInStation: media source set");
mMediaPlayer.addListener(this);
mMediaPlayer.prepare(mediaSource);
}
如果有人对使用MediaPlayer
的原创想法无效的想法有任何想法,请随时发表评论或发布其他答案。感谢。