rtsp视频性能作为浏览器触发的意图与我的应用程序触发的意图



嗨,我正在创建一个应用程序,它将播放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;
    }
}

最新更新