Подтвердить что ты не робот

Производительность видео в формате 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.
4b9b3361

Ответ 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;
    }

}