嗨,我正在创建一个应用程序,它将播放livestream.com的rtsp直播频道。我在我的应用程序中使用以下意图启动播放器:
iPlayer = new Intent(Intent.ACTION_VIEW);
//iPlayer.setType("video/*");
iPlayer.setData(Uri.parse(videoUrl));
startActivity(iPlayer);
当媒体播放器通过我的应用程序启动时,视频性能非常差。它每隔几秒钟就会停止缓冲,播放几秒钟,然后再次暂停缓冲。
另一方面,如果我在android浏览器中打开url(例如。http://m.livestream.com/abcalbania)它在该页面上有一个视频标签,并触发视频播放器。这一次,视频运行非常流畅。
知道为什么会发生这种事吗?如何解决这个问题
- 我不想按意图启动浏览器URL
- 这是在安卓2.3.4的Atmel cortex A9芯片组上完成的
问题是由您的播放器可能不支持的编解码器引起的。
例如,我有一个用MPEG音频编解码器以及H.264视频编解码器创建的视频。
如果我通过我的应用程序启动视频,视频运行平稳,但如果我在Ooyala Hook Player中启动视频,它的性能非常差,它每3秒播放一次视频,原因是流使用MPEG音频编解码器,而不是支持的AAC音频编解码器。
你会发现答案:
哪些编解码器用于创建反视频,以及支持哪些你的球员?
使用此代码进行平滑的STREAM
String videoUrl = "rtmp://mystream";
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse(videoUrl), "video/*");
startActivity(i);
为什么不在自己的活动中播放这个,创建活动并像一样呈现视频视图
private字符串path2="rtsp://...";
Uri视频=Uri.parse(路径2);
mVideoView.setVideoURI(video);
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();
mVideoView.postInvalidateDelayed(100);
mVideoView.start();
此外,你可以在开始播放之前缓冲5秒,然后连续缓冲会很快。你可以自己控制更多的事情。
Android的MediaPlayer处理RTSP非常好-不要打开外部应用程序-这是不必要的,而且在产品方面是错误的。
关于你的问题——浏览器可能会向视频播放器发送另一个参数,以帮助视频流畅播放,我没有检查,但这听起来是你所描述的唯一可能的选项。额外参数的示例可能是视频分辨率/编码/大小。。您可以使用MediaMetaDataRetriever轻松获取所有这些信息。
如果您不想使用本机VideoView或MediaPlayer,您可以随时将外部播放器添加到您的应用程序,如libVLC或Vitamio。
我推荐使用Vitamio,它真的很容易使用和集成。LibVLC是本机代码,这意味着您必须使用ndk构建它,并将其库添加到您的项目中。你可以在这里找到如何做到这一点。
Android视频视图支持RTSP URL,无需将意图传递给其他应用程序。尝试使用此代码,传递带有视频视图声明的xml,并在该活动中找到它。
公共类VideoPlayer扩展活动
{
private VideoView mVideoView;
String videoURL="";
static Utility utility;
static Context context;
//MediaController mediaController;
//int iCurrentpostion=0;
int counter=0;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.tab_video_player);
setupViews();
}
private void setupViews()
{
context=VideoPlayer.this;
//utility=new Utility(VideoPlayer.this);
showProgressDialog("Please wait", "Loading video..");
//videoURL=getIntent().getExtras().getString("url");
mVideoView=(VideoView)findViewById(R.id.xvdvwTab);
// mediaController=new MediaController(context);
// mVideoView.setMediaController(mediaController);
mVideoView.setOnPreparedListener(new OnPreparedListener()
{
@Override
public void onPrepared(MediaPlayer mp)
{
utility.hideProgressDialog();
mVideoView.start();
mVideoView.requestFocus();
}
});
mVideoView.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
finish();
}
});
mVideoView.setOnErrorListener(new OnErrorListener()
{
@Override
public boolean onError(MediaPlayer mp, int what, int extra)
{
utility.hideProgressDialog();
return false;
}
});
playVideoFile();
}
private void playVideoFile()
{
try
{
mVideoView.setVideoURI(Uri.parse("your url"));
}
catch (Exception e)
{
utility.hideProgressDialog();
if (mVideoView != null)
{
mVideoView.stopPlayback();
}
}
}
@Override
protected void onResume()
{
/*if(mVideoView!=null)
{
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
mVideoView.requestFocus();
if(iCurrentpostion!=0)
mVideoView.seekTo(iCurrentpostion);
mVideoView.start();
}
super.onResume();*/
}
@Override
protected void onDestroy()
{
try
{
if (mVideoView != null)
{
mVideoView.stopPlayback();
mVideoView=null;
}
super.onDestroy();
} catch (Exception e)
{}
}
public void showProgressDialog(String title,String Message)
{
hideProgressDialog();
progressDialog=new ProgressDialog(mActivity);
progressDialog.setTitle(title);
progressDialog.setMessage(Message);
if(Constant.isActivityisRunning)
progressDialog.show();
}
public void hideProgressDialog()
{
if (progressDialog != null)
{
if (progressDialog.isShowing())
{
progressDialog.dismiss();
progressDialog = null;
}
}
}
}
我认为异步播放视频可以获得更好的性能。我的代码是:
private class myAsync extends AsyncTask<Void, Integer, Void> {
int duration = 0;
//int current = 0;
@Override
protected Void doInBackground(Void... params) {
videoView.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
progressDialog.dismiss();
videoView.seekTo(check);
videoView.start();
duration = videoView.getDuration();
}
});
do {
current = videoView.getCurrentPosition();
System.out.println("duration - " + duration + " current- "
+ current);
}
if (sync.isCancelled())
break;
} while (current != duration || current == 0);
return null;
}
}