时间戳统一使用毫秒

This commit is contained in:
xiongziliang
2018-10-26 14:12:16 +08:00
parent e816c56f2e
commit 8f8eda9337
24 changed files with 188 additions and 100 deletions

View File

@@ -66,9 +66,9 @@ void RtmpPlayer::teardown() {
_pBeatTimer.reset();
_pPlayTimer.reset();
_pMediaTimer.reset();
_fSeekTo = 0;
CLEAR_ARR(_adFistStamp);
CLEAR_ARR(_adNowStamp);
_iSeekTo = 0;
CLEAR_ARR(_aiFistStamp);
CLEAR_ARR(_aiNowStamp);
reset();
shutdown();
}
@@ -310,7 +310,7 @@ void RtmpPlayer::onRtmpChunk(RtmpPacket &chunkData) {
case MSG_VIDEO: {
auto idx = chunkData.typeId%2;
if (_aNowStampTicker[idx].elapsedTime() > 500) {
_adNowStamp[idx] = chunkData.timeStamp;
_aiNowStamp[idx] = chunkData.timeStamp;
}
_onMediaData(std::make_shared<RtmpPacket>(chunkData));
}
@@ -321,30 +321,30 @@ void RtmpPlayer::onRtmpChunk(RtmpPacket &chunkData) {
}
}
float RtmpPlayer::getProgressTime() const{
double iTime[2] = {0,0};
uint32_t RtmpPlayer::getProgressMilliSecond() const{
uint32_t iTime[2] = {0,0};
for(auto i = 0 ;i < 2 ;i++){
iTime[i] = (_adNowStamp[i] - _adFistStamp[i]) / 1000.0;
iTime[i] = _aiNowStamp[i] - _aiFistStamp[i];
}
return _fSeekTo + MAX(iTime[0],iTime[1]);
return _iSeekTo + MAX(iTime[0],iTime[1]);
}
void RtmpPlayer::seekToTime(float fTime){
void RtmpPlayer::seekToMilliSecond(uint32_t seekMS){
if (_bPaused) {
pause(false);
}
AMFEncoder enc;
enc << "seek" << ++_iReqID << nullptr << fTime * 1000.0;
enc << "seek" << ++_iReqID << nullptr << seekMS * 1.0;
sendRequest(MSG_CMD, enc.data());
addOnStatusCB([this,fTime](AMFValue &val) {
addOnStatusCB([this,seekMS](AMFValue &val) {
//TraceL << "seek result";
_aNowStampTicker[0].resetTime();
_aNowStampTicker[1].resetTime();
float iTimeInc = fTime - getProgressTime();
auto iTimeInc = seekMS - getProgressMilliSecond();
for(auto i = 0 ;i < 2 ;i++){
_adFistStamp[i] = _adNowStamp[i] + iTimeInc * 1000.0;
_adNowStamp[i] = _adFistStamp[i];
_aiFistStamp[i] = _aiNowStamp[i] + iTimeInc;
_aiNowStamp[i] = _aiFistStamp[i];
}
_fSeekTo = fTime;
_iSeekTo = seekMS;
});
}

View File

@@ -55,8 +55,8 @@ public:
protected:
virtual bool onCheckMeta(AMFValue &val) =0;
virtual void onMediaData(const RtmpPacket::Ptr &chunkData) =0;
float getProgressTime() const;
void seekToTime(float fTime);
uint32_t getProgressMilliSecond() const;
void seekToMilliSecond(uint32_t ms);
private:
void _onShutdown(const SockException &ex) {
WarnL << ex.getErrCode() << " " << ex.what();
@@ -145,9 +145,9 @@ private:
std::shared_ptr<Timer> _pBeatTimer;
//播放进度控制
float _fSeekTo = 0;
double _adFistStamp[2] = { 0, 0 };
double _adNowStamp[2] = { 0, 0 };
uint32_t _iSeekTo = 0;
uint32_t _aiFistStamp[2] = { 0, 0 };
uint32_t _aiNowStamp[2] = { 0, 0 };
Ticker _aNowStampTicker[2];
};

View File

@@ -49,13 +49,13 @@ public:
};
float getProgress() const override{
if(getDuration() > 0){
return getProgressTime() / getDuration();
return getProgressMilliSecond() / (getDuration() * 1000);
}
return PlayerBase::getProgress();
};
void seekTo(float fProgress) override{
fProgress = MAX(float(0),MIN(fProgress,float(1.0)));
seekToTime(fProgress * getDuration());
seekToMilliSecond(fProgress * getDuration() * 1000);
};
private:
//派生类回调函数

View File

@@ -521,7 +521,7 @@ void RtmpSession::onRtmpChunk(RtmpPacket &chunkData) {
void RtmpSession::onCmd_seek(AMFDecoder &dec) {
dec.load<AMFValue>();/* NULL */
auto milliSeconds = dec.load<AMFValue>().as_number();
InfoL << "rtmp seekTo:" << milliSeconds/1000.0;
InfoL << "rtmp seekTo(ms):" << milliSeconds;
auto stongSrc = _pPlayerSrc.lock();
if (stongSrc) {
stongSrc->seekTo(milliSeconds);