开发者

is it possible to display video information from an rtsp stream in an android app UI

开发者 https://www.devze.com 2022-12-24 20:43 出处:网络
I have managed to get a working video player that can stream rtsp links, however im not sure how to display the videos current time position in the UI, i have used the getDuration and getCurrentPositi

I have managed to get a working video player that can stream rtsp links, however im not sure how to display the videos current time position in the UI, i have used the getDuration and getCurrentPosition calls, stored this information in a string and tried to display it in the UI but it doesnt seem to work

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


Your code snippet looks significantly like my vidtry sample. getCurrentPosition() and getDuration() works for HTTP streaming, such as for use in updating the progress bar.

I have not tried vidtry with an RTSP video stream, mostly because I don't know of any.


Check the SDP response from the server to ensure that it is sending the duration in the response (live streams don't have a recognizable time and that may cause the client to not provide this information.)

E.g. a live feed will look like:

a=range:npt=0-

Whereas a VoD clip should look like:

a=range:npt=0-399.1680

If getCurrentPosition() doesn't work, but you know the Duration (either getDuration() works or you have an alternate way of getting this information; you could calculate it by watching the buffering events and tracking this your self. Your approach is the more desirable approach than this one.


If I got you right, you want to show in a TextView elapsed time e.g. hh:mm:ss?

If so, I'll give you a little walkthrough on how to do that.

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 */
}       

And one more thing I forgot to mention. In order to make this work your activity class has to implement the OnPreparedListener interface.

I hope you or someone else will find this post useful.

Best regards,

Igor

0

精彩评论

暂无评论...
验证码 换一张
取 消