Производительность видео по протоколу RTSP в качестве намерения, вызванного браузером, против намерения, вызванного моим приложением - PullRequest
21 голосов
/ 04 февраля 2012

Привет, я создаю приложение, которое будет играть в прямом эфире канала livestream.com.Я запускаю проигрыватель с помощью намерения в моем приложении следующим образом:

            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

Ответы [ 6 ]

1 голос
/ 15 января 2014

Проблема вызвана кодеками, которые, вероятно, не поддерживаются вашим проигрывателем.

например, у меня есть видео, созданное с помощью кодека MPEG Audio вместе с видеокодеком H.264.

если я запускаю видео через свое приложение, видео работает плавно, но если я запускаю видео в Ooyala Hook Player , у него очень низкая производительность, оно воспроизводит видео каждые 3 секунды, причина в том, чтоВ потоковом режиме используется аудиокодек MPEG вместо поддерживаемого аудиокодека AAC.

Ответ вы найдете:

какие кодеки используются для создания видео, а какие поддерживаютсятвой игрок?

0 голосов
/ 23 августа 2014

Я думаю, что воспроизведение видео по асинхронно для лучшей производительности.Мой код:

   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;
    }

}
0 голосов
/ 04 июня 2014

Поддержка просмотра видео в 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;
        }
    }
}

}

0 голосов
/ 27 мая 2014

Android MediaPlayer отлично справляется с RTSP - не открывайте внешнее приложение - это не нужно и неправильно с точки зрения продукта.

По поводу вашего вопроса - браузер может посылать в видеоплеер другие параметры, которые помогают воспроизвести видео плавно, я не проверял, но это звучит как единственно возможный вариант для того, что вы описываете. Примером дополнительного параметра может быть разрешение видео / кодировка / размер. Вы можете легко получить их все, используя MediaMetaDataRetriever .

Если вы не хотите использовать встроенный VideoView или MediaPlayer, вы всегда можете добавить внешний проигрыватель к вашему приложение, например libVLC или Vitamio .

Я рекомендую использовать Vitamio, он действительно прост в использовании и интеграции. LibVLC находится в нативном коде, это означает, что вам придется собирать его с помощью ndk и добавлять его библиотеки в ваш проект. Вы можете найти здесь как это сделать.

0 голосов
/ 10 января 2014

Почему бы вам не воспроизвести это в своем собственном действии, создать действие и визуализировать просмотр видео как

private String path2 = "rtsp: // ...";
Uri video = Uri.parse(path2);

mVideoView.setVideoURI(video);
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();
mVideoView.postInvalidateDelayed(100);
mVideoView.start();

Также вы можете буферизовать перед началом воспроизведения, может быть, 5 секунд, а затем последовательная буферизация будет быстрой.Вы можете контролировать больше вещей самостоятельно.

0 голосов
/ 18 июля 2012

Используйте этот код для плавного потока

String videoUrl = "rtmp://mystream";
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse(videoUrl), "video/*");
startActivity(i);
...