views:

406

answers:

6

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

A: 

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.

CommonsWare
A: 

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.

J. Fritz Barnes
A: 

@CommonsWare: yea i messaged you a few times but i havent had a response so i used this site you refered me to

@J. Fritz Barnes: does the getDuration call need to be stored in a string, i tried it but it doesnt display anything. does the information you get from the getCurrentPosition and getDuration call show by itself in the UI or does it require xml code, i'm not sure what the xml calls are for the information to be displayed also how do you check the SDP response?

Joseph Cheung
A: 

Joseph Cheung, Can you please share the code for displaying video using rtsp link? I tried few different things so if you share it with us it would be great. Thanks.

Visvaram
A: 

Is it possible to calculate the frame rate (loss) of a rtsp video playing in VideoView or MediaPlayer?

George
A: 

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

Igor