我设法获得了一个可以流式传输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);
}
}
};
答案 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接口。
我希望你或其他人会发现这篇文章很有用。
致以最诚挚的问候,
伊戈尔