现在的位置: 首页 > 综合 > 正文

RTMP中如何平稳的获取时间戳

2013年10月09日 ⁄ 综合 ⁄ 共 1329字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.