Производительность видео в формате rtsp, поскольку браузер запускал намерение против моего приложения, вызвало намерение
Привет, Я создаю приложение, которое будет воспроизводить livevideo.com rtsp live.
Я запускаю игрока, используя намерение в своем приложении, следующим образом:
iPlayer = new Intent(Intent.ACTION_VIEW);
//iPlayer.setType("video/*");
iPlayer.setData(Uri.parse(videoUrl));
startActivity(iPlayer);
Когда медиапроигрыватель запускается через мое приложение, производительность видео очень низка. Он останавливается для буферизации каждые несколько секунд, играет в течение нескольких секунд и снова приостанавливает буферизацию.
С другой стороны, если я открою url в браузере Android (например, http://m.livestream.com/abcalbania), на нем есть тег видео и запускает видеоплеер. В это время видео работает очень плавно.
Любая идея, почему это может случиться? И как это можно исправить?
- Я не хочу запускать URL-адрес браузера в качестве намерения.
- Это делается на чипсете Atmel cortex A9 с Android 2.3.4.
Ответы
Ответ 1
Проблема вызвана кодеками, которые, вероятно, не поддерживаются вашим игроком.
например, у меня есть видео, созданное с помощью кодека MPEG Audio вместе с видеокодеком H.264.
если я запускаю видео через приложение, видео работает гладко, но если я запустил видео в Ooyala Hook Player, он очень плохо производительность воспроизводит видео каждые 3 секунды, причина в том, что поток использует аудиокодек MPEG вместо AAC Audio кодека, который поддерживается.
Вы найдете ответ с помощью:
какие кодеки используются для создания видео, и что поддерживается ваш плеер?
Ответ 2
Используйте этот код для плавного STREAM
String videoUrl = "rtmp://mystream";
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse(videoUrl), "video/*");
startActivity(i);
Ответ 3
Почему бы вам не сыграть это в своей собственной деятельности, создать активность и визуализировать вид видео, например
private String path2 = "rtsp://...";
Uri video = Uri.parse(путь2);
mVideoView.setVideoURI(video);
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();
mVideoView.postInvalidateDelayed(100);
mVideoView.start();
Также вы можете буферизировать до начала воспроизведения, возможно, 5 секунд, а последующая буферизация будет быстрой. вы можете контролировать больше вещей своими силами.
Ответ 4
Android MediaPlayer очень хорошо справляется с RTSP - не открывайте внешнее приложение - это не обязательно и неправильно в отношении продукта.
О вашем вопросе - браузер может отправить другие параметры видеопроигрывателю, которые помогут воспроизвести видеоролик, я не проверял его, но это звучит как единственный возможный вариант для того, что вы описываете. Примером дополнительного параметра может быть разрешение/кодирование/размер видео.. вы можете легко их легко использовать, используя MediaMetaDataRetriever.
Если вы не хотите использовать собственный VideoView или MediaPlayer, вы всегда можете добавить внешнего проигрывателя к своему
app, например libVLC или Vitamio.
Я рекомендую использовать Vitamio, очень прост в использовании и интеграции. LibVLC находится в собственном коде, это означает, что вам нужно будет построить его с помощью ndk и добавить свои библиотеки в свой проект.
Вы можете найти здесь, как это сделать.
Ответ 5
Поддержка просмотра видео с Android RTSP не требует передачи намерений другому приложению. Пройдите с помощью этого кода, передайте 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;
}
}
}
}
Ответ 6
Я думаю, что воспроизводить видео с помощью Asynchronously для лучшей производительности. Мой код:
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;
}
}