是否可以在Android应用程序UI中显示来自rtsp流的视频信息

时间:2010-03-23 08:54:58

标签: android timestamp video-streaming

我设法获得了一个可以流式传输rtsp链接的视频播放器,但是我不知道如何在UI中显示视频当前时间位置,我使用了getDuration和getCurrentPosition调用,将此信息存储在字符串中试图在UI中显示它但它似乎无法正常工作

**in main.xml:**
    TextView android:id="@+id/player"
           android:layout_width="wrap_content" 
           android:layout_height="wrap_content"
           android:layout_margin="1px"
           android:text="@string/cpos"
          />

**in strings.xml:** 

string name="cpos">"" /string>


**in Player.java**

private void playVideo(String url) {
  try {
   media.setEnabled(false);

   if (player == null) {
    player = new MediaPlayer();
    player.setScreenOnWhilePlaying(true);
   } else {
    player.stop();  
    player.reset();
   }

   player.setDataSource(url);
   player.getCurrentPosition();
   player.setDisplay(holder);
   player.setAudioStreamType(AudioManager.STREAM_MUSIC);
   player.setOnPreparedListener(this);
   player.prepareAsync();
   player.setOnBufferingUpdateListener(this);
   player.setOnCompletionListener(this);

  } catch (Throwable t) {
   Log.e(TAG, "Exception in media prep", t);
   goBlooey(t);
   try {
    try {
     player.prepare();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    Log.v(TAG, "Duration: ===> " + player.getDuration());
   } catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();

   }
  }
 }


private Runnable onEverySecond = new Runnable() {
  public void run() {
   if (lastActionTime > 0
    && SystemClock.elapsedRealtime() - lastActionTime > 3000) {
    clearPanels(false);
   }

   if (player != null) {
    timeline.setProgress(player.getCurrentPosition());
    //stores getCurrentPosition as a string
    cpos = String.valueOf(player.getCurrentPosition());
    System.out.print(cpos);

   }

   if (player != null) {
    timeline.setProgress(player.getDuration());
    //stores getDuration as a string
    cdur = String.valueOf(player.getDuration());
    System.out.print(cdur);
   }

   if (!isPaused) {
    surface.postDelayed(onEverySecond, 1000);
   }
  }
 };

3 个答案:

答案 0 :(得分:0)

您的代码段看起来非常像我的vidtry示例。 getCurrentPosition()getDuration()适用于HTTP流式处理,例如用于更新进度条。

我没有尝试使用RTSP视频流,主要是因为我不知道。

答案 1 :(得分:0)

检查来自服务器的SDP响应,以确保它在响应中发送持续时间(实时流没有可识别的时间,并且可能导致客户端不提供此信息。)

E.g。实时Feed如下:

a=range:npt=0-

而VoD片段应如下所示:

a=range:npt=0-399.1680

如果getCurrentPosition()不起作用,但您知道持续时间(getDuration()有效,或者您有另一种获取此信息的方法;您可以通过观看缓冲事件并跟踪此信息来计算它你的自我。你的方法比这个方法更理想。

答案 2 :(得分:0)

如果我找到了你,你想要在TextView中显示经过的时间,例如HH:MM:SS

如果是这样,我会给你一些关于如何做到这一点的演练。

private TextView mElapsedTimeText;
private VideoView mVideoView;
private Thread mThread;


@Override
public void onCreate(Bundle savedInstanceState) {
    /* here goes your code */

    // let's assume that your IDs are elapsedId and videoId
    mElapsedTimeText = (TextView) findViewById(R.id.elapsedId);
    mVideoView = (VideoView) findViewById(R.id.videoId);


    mThread = new Thread() {
        @Override
        public void run() {
            mElapsedTime.setText(getNiceString());
            mVideoView.postDelayed(mThread, 1000);
        }
    }

    /* here goes your code */
}

public String getNiceString() {
    String result = "";
    int position = mVideoView.getCurrentPosition();

    /* here goes your code */

    //result is hh:mm:ss formatted string
    return result;
}

@Override
public void onPrepared(MediaPlayer mp) {
    /* here goes your code */

    // you have to trigger the process somewhere
    mVideoView.postDelayed(mThread, 1000);

    /* here goes your code */
}       

还有一件事我忘了提及。为了完成这项工作,您的活动类必须实现OnPreparedListener接口。

我希望你或其他人会发现这篇文章很有用。

致以最诚挚的问候,

伊戈尔