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