我发现Android MediaPlayer准备使用不同的流进行实时流播放所花费的时间差异很大.
硬数据
我在prepareAsync()和onPrepared(MediaPlayer mp)回调之间添加了日志记录,并且每次都测试了几个流.每个流的时间非常一致(+/- 1秒),结果如下:
测试是在带有Android 2.3.4的Nexus S上进行的3G连接(~1100 Kbps).
播放非流式MP3音频文件不是问题.
以下是我如何播放流的片段:
准备MediaPlayer:
...
mediaPlayer.setDataSource(playUrl);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
...
Run Code Online (Sandbox Code Playgroud)
然后在onPrepared(MediaPlayer mp):
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)
为什么要准备一些流而不是其他流需要这么长时间?上述数据似乎表明它可能基于已缓冲的数据量而不是缓冲的音频内容的持续时间.真的可以吗?
更新:我已经使用Android 1.6,2.2和2.3.4以及1.6,2.1,2.2,2.3.1和2.3.3的仿真器测试了物理设备上的实时流媒体.我只看到2.3.3和2.3.4的长时间延迟.旧版本在5秒内开始播放.
注意:当我发布这个问题时,我不在我工作的公司工作,因此,即使可能会有一些很好的答案,我实际上也不会测试它们,因为我没有理由 (除了促进社区;这可能导致我有一天这样做).
但是,如果一些解决问题的办法是由许多其他comunity成员提拔,我可能会选择选择它作为问题正确答案经历了这么多年我最初发布这个问题之后.
与此同时,我希望有些答案可能会帮助你们中的一些人遇到这个问题.堆栈溢出!
我们的应用程序必须从在线资源中传播音乐(我不能自由地披露该来源).
为什么在S3上开始流式传输需要2分钟?
由于MEDIA_ERROR_UNKOWN,我已经能够弄清楚Media Player对象进入错误状态 - 很棒.对我帮助不大.因此,在使用OnErrorListener处理onError时,我重置了Media Player对象,然后调用startPlaying来完成剩下的工作 - 设置数据源等.
成员:
private ProgressBar playSeekBar;
private ImageView ivPlay;
private ImageView ivPause;
private ImageView ivBuffer;
private MediaPlayer mPlayer;
private ImageView ivInfo;
private AudioManager audio;
Run Code Online (Sandbox Code Playgroud)
初始化媒体播放器(和Visualizer - 这不是问题的目的)
private void initialMediaPlayerAndVisualizer() {
Log.d(TAG, "Initial Media Player and Visualizer");
playSeekBar = (ProgressBar) findViewById(R.id.progressBar1);
playSeekBar.setMax(100);
playSeekBar.setVisibility(View.GONE);
mPlayer = new MediaPlayer();
Log.d(TAG, "Create onErrorListener");
MediaPlayer.OnErrorListener errorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int …Run Code Online (Sandbox Code Playgroud) 我的Android应用程序在线播放视频VideoView.从文件播放视频时,它可以正常工作,甚至可以直播(a m3u8); 它总是来自同一个源,当我使用外部播放器/浏览器时,它同样流畅(所以我不认为这是源的问题,这是这样的文件的变体:https:/ /publish.dvlabs.com/democracynow/360/dn2016-0810.mp4
Android Monitor在崩溃之前记录这个:
10-13 12:02:56.204 32460-32748/com.workingagenda.democracydroid D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= stagefright/1.2 (Linux;Android 6.0.1)
10-13 12:02:56.205 32460-32472/com.workingagenda.democracydroid D/MediaHTTPConnection: proxy null port 0
10-13 12:02:57.904 32460-32460/com.workingagenda.democracydroid D/MediaPlayer: getMetadata
10-13 12:02:58.438 32460-377/com.workingagenda.democracydroid W/MediaPlayer: info/warning (3, 0)
Run Code Online (Sandbox Code Playgroud)
然后我崩溃时得到这些日志:
10-13 12:05:33.812 32460-32472/com.workingagenda.democracydroid W/MediaHTTPConnection: readAt 26869519 / 241 => java.net.ProtocolException: unexpected end of stream
10-13 12:08:32.480 32460-3546/com.workingagenda.democracydroid E/MediaPlayer: error (1, -1004)
10-13 12:08:32.480 32460-32460/com.workingagenda.democracydroid E/MediaPlayer: Error (1,-1004)
10-13 12:08:32.481 32460-32460/com.workingagenda.democracydroid D/VideoView: Error: 1,-1004
[ 10-13 12:08:32.512 5066: 453 E/ …Run Code Online (Sandbox Code Playgroud)