赞
踩
ExoPlayer和大部分播放器一样,默认采用Audio Master的同步方式,其视频同步原因在MediaCodecVideoRender.java的processOutputBuffer()函数中,下面结合函数详细看下音画同步的原理。
- protected boolean processOutputBuffer(
- long positionUs,
- long elapsedRealtimeUs,
- @Nullable MediaCodecAdapter codec,
- @Nullable ByteBuffer buffer,
- int bufferIndex,
- int bufferFlags,
- int sampleCount,
- long bufferPresentationTimeUs,
- boolean isDecodeOnlyBuffer,
- boolean isLastBuffer,
- Format format)
- throws ExoPlaybackException {
- //Video不支持Bypass
- Assertions.checkNotNull(codec); // Can not render video without codec
-
- if (initialPositionUs == C.TIME_UNSET) {
- initialPositionUs = positionUs;
- }
-
- if (bufferPresentationTimeUs != lastBufferPresentationTimeUs) {
- frameReleaseHelper.onNextFrame(bufferPresentationTimeUs);
- this.lastBufferPresentationTimeUs = bufferPresentationTimeUs;
- }
-
- //outputStreamOffsetUs通常为0
- long outputStreamOffsetUs = getOutputStreamOffsetUs();
- long presentationTimeUs = bufferPresentationTimeUs - outputStreamOffsetUs;
-
- //isDecodeOnlyBuffer直接跳过
- if (isDecodeOnlyBuffer && !isLastBuffer) {
- skipOutputBuffer(codec, bufferIndex, presentationTimeUs);
- return true;
- }
-
- // Note: Use of double rather
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。