RTSP视频性能:浏览器触发意图 vs 应用程序触发意图

21

你好,我正在创建一个应用程序,将播放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),它会在该页面上具有一个 video 标签并触发视频播放器。这次,视频运行非常流畅。

任何想法为什么会出现这种情况?以及如何修复?

  • 我不想将浏览器 URL 作为意图启动。
  • 这是在 Atmel Cortex A9 芯片组上使用 Android 2.3.4 完成的。

我假设当你从你的应用程序中触发Intent时,它会在设备的视频播放器中打开。 - Chris.Jenkins
6个回答

1
问题是由于编解码器可能不被您的播放器支持引起的。
例如,我有一个使用MPEG音频编解码器和H.264视频编解码器创建的视频。
如果我通过我的应用程序启动视频,则视频可以平稳运行,但是如果我在Ooyala Hook Player中启动视频,则性能非常差,每3秒播放一次视频,原因是流使用了MPEG音频编解码器而不是受支持的AAC音频编解码器。
您将在以下内容中找到答案:
“视频使用了哪些编解码器进行创建,您的播放器支持哪些编解码器?”

0

使用此代码以获得流畅的流媒体

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

0
为什么不在自己的活动中播放这个视频,创建活动并渲染视频视图,类似于:

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

Android的MediaPlayer非常擅长处理RTSP - 不需要打开外部应用程序 - 这是不必要的,也是产品上的错误。

关于你的问题 - 浏览器可能会向视频播放器发送其他参数,以帮助视频播放平稳,我没有检查过,但听起来像是你所描述的唯一可能的选择。例如,额外的参数可能是视频分辨率/编码/大小..您可以使用MediaMetaDataRetriever轻松获取所有这些。

如果您不想使用本机VideoView或MediaPlayer,则始终可以向应用程序添加外部播放器,例如libVLCVitamio

我建议使用Vitamio,它非常易于使用和集成。LibVLC是使用本机代码编写的,这意味着您将不得不使用ndk构建它,并将其库添加到项目中。您可以在此处找到如何执行此操作。


-1

Android的视频视图很好地支持RTSP网址,无需传递意图给其他应用程序。尝试使用此代码,在xml中传递视频视图的声明,并在此活动中找到它。

public class VideoPlayer extends Activity
{

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

}


叹气。这段代码和我能找到的其他所有东西一样,都会出现“错误(100,0)”。https://dev59.com/SILba4cB1Zd3GeqPc1Ou - Alain Collins

-1

为了提高性能,我认为应该使用异步播放视频。我的代码如下:

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接