时间戳统一使用毫秒

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

@@ -69,6 +69,7 @@ public:
bool _inited = false;
uint32_t _ssrc = 0;
uint16_t _seq = 0;
//时间戳,单位毫秒
uint32_t _time_stamp = 0;
};
class SdpAttr {

View File

@@ -84,7 +84,7 @@ public:
}
return track->_seq;
}
virtual uint32_t getTimestamp(TrackType trackType) {
virtual uint32_t getTimeStamp(TrackType trackType) {
auto track = _sdpAttr.getTrack(trackType);
if(!track){
return 0;
@@ -92,6 +92,13 @@ public:
return track->_time_stamp;
}
void updateTimeStamp(uint32_t uiStamp) {
auto tracks = _sdpAttr.getAvailableTrack();
for (auto &track : tracks) {
track->_time_stamp = uiStamp;
}
}
virtual void onGetSDP(const string& sdp) {
//派生类设置该媒体源媒体描述信息
_strSdp = sdp;

View File

@@ -91,9 +91,9 @@ void RtspPlayer::teardown(){
_pBeatTimer.reset();
_pPlayTimer.reset();
_pRtpTimer.reset();
_fSeekTo = 0;
CLEAR_ARR(_adFistStamp);
CLEAR_ARR(_adNowStamp);
_iSeekTo = 0;
CLEAR_ARR(_aiFistStamp);
CLEAR_ARR(_aiNowStamp);
}
void RtspPlayer::play(const char* strUrl){
@@ -430,17 +430,17 @@ bool RtspPlayer::sendDescribe() {
}
bool RtspPlayer::sendPause(bool bPause,float fTime){
bool RtspPlayer::sendPause(bool bPause,uint32_t seekMS){
if(!bPause){
//修改时间轴
_aNowStampTicker[0].resetTime();
_aNowStampTicker[1].resetTime();
float iTimeInc = fTime - getProgressTime();
auto iTimeInc = seekMS - getProgressMilliSecond();
for(unsigned int i = 0 ;i < _aTrackInfo.size() ;i++){
_adFistStamp[i] = _adNowStamp[i] + iTimeInc * _aTrackInfo[i]->_samplerate;
_adNowStamp[i] = _adFistStamp[i];
_aiFistStamp[i] = _aiNowStamp[i] + iTimeInc;
_aiNowStamp[i] = _aiFistStamp[i];
}
_fSeekTo = fTime;
_iSeekTo = seekMS;
}
//开启或暂停rtsp
@@ -448,12 +448,12 @@ bool RtspPlayer::sendPause(bool bPause,float fTime){
StrCaseMap header;
char buf[8];
sprintf(buf,"%.2f",fTime);
sprintf(buf,"%.2f",seekMS / 1000.0);
header["Range"] = StrPrinter << "npt=" << buf << "-";
return sendRtspRequest(bPause ? "PAUSE" : "PLAY",_strContentBase,header);
}
void RtspPlayer::pause(bool bPause) {
sendPause(bPause,getProgressTime());
sendPause(bPause, getProgressMilliSecond());
}
void RtspPlayer::handleResPAUSE(const Parser& parser, bool bPause) {
@@ -471,8 +471,8 @@ void RtspPlayer::handleResPAUSE(const Parser& parser, bool bPause) {
if (strStart == "now") {
strStart = "0";
}
_fSeekTo = atof(strStart.data());
DebugL << "Range:" << _fSeekTo << " " << strStart ;
_iSeekTo = 1000 * atof(strStart.data());
DebugL << "seekTo(ms):" << _iSeekTo ;
}
auto strRtpInfo = parser["RTP-Info"];
if (strRtpInfo.size()) {
@@ -482,10 +482,10 @@ void RtspPlayer::handleResPAUSE(const Parser& parser, bool bPause) {
strTrack.append(";");
auto strControlSuffix = strTrack.substr(1 + strTrack.rfind('/'),strTrack.find(';') - strTrack.rfind('/') - 1);
auto strRtpTime = FindField(strTrack.data(), "rtptime=", ";");
auto iIdx = getTrackIndexByControlSuffix(strControlSuffix);
_adFistStamp[iIdx] = atoll(strRtpTime.data());
_adNowStamp[iIdx] = _adFistStamp[iIdx];
DebugL << "rtptime:" << strControlSuffix <<" " << strRtpTime;
auto idx = getTrackIndexByControlSuffix(strControlSuffix);
_aiFistStamp[idx] = atoll(strRtpTime.data()) * 1000 / _aTrackInfo[idx]->_samplerate;
_aiNowStamp[idx] = _aiFistStamp[idx];
DebugL << "rtptime(ms):" << strControlSuffix <<" " << strRtpTime;
}
}
onPlayResult_l(SockException(Err_success, "rtsp play success"));
@@ -595,7 +595,8 @@ bool RtspPlayer::handleOneRtp(int iTrackidx, unsigned char *pucData, unsigned in
rtppt.sequence = ntohs(rtppt.sequence);
//时间戳
memcpy(&rtppt.timeStamp, pucData+4, 4);//内存对齐
rtppt.timeStamp = ntohl(rtppt.timeStamp);
//时间戳转换成毫秒
rtppt.timeStamp = ntohl(rtppt.timeStamp) * 1000 / track->_samplerate;
//ssrc
memcpy(&rtppt.ssrc,pucData+8,4);//内存对齐
rtppt.ssrc = ntohl(rtppt.ssrc);
@@ -679,12 +680,12 @@ void RtspPlayer::onRecvRTP_l(const RtpPacket::Ptr &rtppt, int trackidx){
_aui16NowSeq[trackidx] = rtppt->sequence;
if (_aNowStampTicker[trackidx].elapsedTime() > 500) {
_adNowStamp[trackidx] = rtppt->timeStamp;
_aiNowStamp[trackidx] = rtppt->timeStamp;
}
onRecvRTP_l(rtppt,_aTrackInfo[trackidx]);
}
float RtspPlayer::getRtpLossRate(TrackType type) const{
float RtspPlayer::getPacketLossRate(TrackType type) const{
int iTrackIdx = getTrackIndexByTrackType(type);
if(iTrackIdx == -1){
uint64_t totalRecv = 0;
@@ -706,15 +707,15 @@ float RtspPlayer::getRtpLossRate(TrackType type) const{
return 1.0 - (double)_aui64RtpRecv[iTrackIdx] / (_aui16NowSeq[iTrackIdx] - _aui16FirstSeq[iTrackIdx] + 1);
}
float RtspPlayer::getProgressTime() const{
double iTime[2] = {0,0};
uint32_t RtspPlayer::getProgressMilliSecond() const{
uint32_t iTime[2] = {0,0};
for(unsigned int i = 0 ;i < _aTrackInfo.size() ;i++){
iTime[i] = (_adNowStamp[i] - _adFistStamp[i]) / _aTrackInfo[i]->_samplerate;
iTime[i] = _aiNowStamp[i] - _aiFistStamp[i];
}
return _fSeekTo + MAX(iTime[0],iTime[1]);
return _iSeekTo + MAX(iTime[0],iTime[1]);
}
void RtspPlayer::seekToTime(float fTime) {
sendPause(false,fTime);
void RtspPlayer::seekToMilliSecond(uint32_t ms) {
sendPause(false,ms);
}
bool RtspPlayer::sendRtspRequest(const string &cmd, const string &url,const StrCaseMap &header_const) {

View File

@@ -55,13 +55,13 @@ public:
void play(const char* strUrl) override;
void pause(bool bPause) override;
void teardown() override;
float getRtpLossRate(TrackType type) const override;
float getPacketLossRate(TrackType type) const override;
protected:
//派生类回调函数
virtual bool onCheckSDP(const string &strSdp, const SdpAttr &sdpAttr) = 0;
virtual void onRecvRTP(const RtpPacket::Ptr &pRtppt, const SdpTrack::Ptr &track) = 0;
float getProgressTime() const;
void seekToTime(float fTime);
uint32_t getProgressMilliSecond() const;
void seekToMilliSecond(uint32_t ms);
private:
void onShutdown_l(const SockException &ex);
void onRecvRTP_l(const RtpPacket::Ptr &pRtppt, int iTrackidx);
@@ -91,7 +91,7 @@ private:
//发送SETUP命令
bool sendSetup(unsigned int uiTrackIndex);
bool sendPause(bool bPause,float fTime);
bool sendPause(bool bPause,uint32_t ms);
bool sendOptions();
bool sendDescribe();
bool sendRtspRequest(const string &cmd, const string &url ,const StrCaseMap &header = StrCaseMap());
@@ -131,10 +131,12 @@ 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

@@ -51,14 +51,14 @@ 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

@@ -735,7 +735,7 @@ bool RtspSession::handleReq_Play() {
for(auto &track : _aTrackInfo){
track->_ssrc = pMediaSrc->getSsrc(track->_type);
track->_seq = pMediaSrc->getSeqence(track->_type);
track->_time_stamp = pMediaSrc->getTimestamp(track->_type);
track->_time_stamp = pMediaSrc->getTimeStamp(track->_type);
}
}
_bFirstPlay = false;
@@ -754,7 +754,11 @@ bool RtspSession::handleReq_Play() {
shutdown();
return;
}
iLen += sprintf(_pcBuf + iLen, "url=%s/%s;seq=%d;rtptime=%u,", _strUrl.data(), track->_control_surffix.data(), track->_seq,track->_time_stamp);
iLen += sprintf(_pcBuf + iLen, "url=%s/%s;seq=%d;rtptime=%u,",
_strUrl.data(),
track->_control_surffix.data(),
track->_seq,
track->_time_stamp * track->_samplerate / 1000);
}
iLen -= 1;
@@ -906,7 +910,7 @@ inline bool RtspSession::findStream() {
for(auto &track : _aTrackInfo){
track->_ssrc = pMediaSrc->getSsrc(track->_type);
track->_seq = pMediaSrc->getSeqence(track->_type);
track->_time_stamp = pMediaSrc->getTimestamp(track->_type);
track->_time_stamp = pMediaSrc->getTimeStamp(track->_type);
}
return true;
}

View File

@@ -72,13 +72,6 @@ public:
return getRing()->readerCount() + (_pRtmpSrc ? _pRtmpSrc->getRing()->readerCount() : 0);
}
void updateTimeStamp(uint32_t uiStamp) {
auto tracks = _sdpAttr.getAvailableTrack();
for (auto &track : tracks) {
track->_time_stamp = uiStamp * (track->_samplerate / 1000.0);
}
}
protected:
void onGetH264(const H264Frame &frame);
void onGetAAC(const AACFrame &frame);