在RTMP协议中需要良好的控制好时间戳,这个非常关键,虽然可以获取当前系统时间来进行控制,但是在进行实时传输的时候效果非常的不好。
这里提供一个平稳获取时间戳的类,代码如下:
// Frame smooth timestamp generator
class TimeStampEstimator {
final int durationHistoryLength = 2048;
private long durationHistory[];
int durationHistoryIndex = 0;
long durationHistorySum = 0;
long lastFrameTiming = 0;
long sequenceDuration = 0;
public void update() {
long currentFrameTiming = SystemClock.elapsedRealtime();
long newDuration = currentFrameTiming - lastFrameTiming;
lastFrameTiming = currentFrameTiming;
durationHistorySum -= durationHistory[durationHistoryIndex];
durationHistorySum += newDuration;
durationHistory[durationHistoryIndex] = newDuration;
durationHistoryIndex++;
if (durationHistoryIndex >= durationHistoryLength)
durationHistoryIndex = 0;
sequenceDuration += (int) ((1.0 * durationHistorySum / durationHistoryLength));
}
public void setFirstFrameTiming() {
lastFrameTiming = SystemClock.elapsedRealtime()
- durationHistorySum / durationHistoryLength;
sequenceDuration = 0;
}
public long getSequenceTimeStamp() {
return sequenceDuration;
}
public void reset(long frameDuration) {
if (durationHistory == null)
durationHistory = new long[durationHistoryLength];
durationHistorySum = 0;
for (int i = 0; i < durationHistoryLength; i++) {
durationHistory[i] = frameDuration; // us
durationHistorySum += frameDuration;
}
lastFrameTiming = 0;
sequenceDuration = 0;
durationHistoryIndex = 0;
}
public TimeStampEstimator(long frameDuration) {
reset(frameDuration);
}
}
原文链接: http://blog.csdn.net/peijiangping1989/article/details/7007259