哦k在蓝牙连接的情况下,我们的设备播放大约播放5秒之后,底层audio strack的time stamp跳变到很低,变为初始值。随后这个值经过5秒才能回到之前的情况,
这期间video的值presentation time stamp一直在5左右,卡住一直不会输出,等5s之后,延迟输出,最终造成音视频不同步。
1.复现查看最新有5秒的video数据在延时输出:
19312:06-02 11:20:18.413 D/MediaCodecVideoTrackRenderer( 2852): No earlyUs < 5000024978:06-02 11:20:23.276 D/MediaCodecVideoTrackRenderer( 2852): No earlyUs < 50000
2. 这个延时输出中,有很长时间positionUs不变:
24910:06-02 11:20:23.215 D/MediaCodecVideoTrackRenderer( 2852): feed positionUs=5135268, firstFeed=true
24911:06-02 11:20:23.216 D/MediaCodecAudioTrackRenderer( 2852): drain positionUs=5135268, elapsedRealtimeUs=93223000
24914:06-02 11:20:23.216 D/MediaCodecAudioTrackRenderer( 2852): feed positionUs=5135268, firstFeed=true
24916:06-02 11:20:23.225 D/MediaCodecVideoTrackRenderer( 2852): drain positionUs=5135268, elapsedRealtimeUs=93234000
24917:06-02 11:20:23.225 D/MediaCodecVideoTrackRenderer( 2852): Ryan1 bufferInfo.presentationTimeUs=5336822, positionUs=5135268, elapsedSinceStartOfLoopUs=0earlyUs=201554
可以用个简单的方法翻转处理掉这个值,需要考虑较多情况可以晚上。
public long getPositionUs() {
long newCurrentPositionUs = audioTrack.getCurrentPositionUs(isEnded());
Log.d(TAG, "Ryan getPositionUs newCurrentPositionUs=" + newCurrentPositionUs);
if (newCurrentPositionUs != AudioTrack.CURRENT_POSITION_NOT_SET) {
if (currentPositionUs > newCurrentPositionUs) {
Log.d(TAG, "Ryan interval, currentPositionUs=" + currentPositionUs
+ ", newCurrentPositionUs=" + newCurrentPositionUs);
if (intrevalPresentationGap == 0) {
intrevalPresentationGap = currentPositionUs - newCurrentPositionUs;
}
if (intrevalPresentationGap != 0) {
newCurrentPositionUs += intrevalPresentationGap;
}
}
currentPositionUs = allowPositionDiscontinuity ? newCurrentPositionUs
: Math.max(currentPositionUs, newCurrentPositionUs);
allowPositionDiscontinuity = false;
}
Log.d(TAG, "Ryan return getPositionUs currentPositionUs=" + currentPositionUs);
return currentPositionUs;
}