mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-07 12:18:12 +08:00
Merge branch 'feature_bafc' of https://github.com/xia-chu/ZLMediaKit
This commit is contained in:
@@ -25,7 +25,8 @@ namespace mediakit {
|
||||
enum PlayType {
|
||||
type_play = 0,
|
||||
type_pause,
|
||||
type_seek
|
||||
type_seek,
|
||||
type_speed
|
||||
};
|
||||
|
||||
RtspPlayer::RtspPlayer(const EventPoller::Ptr &poller) : TcpClient(poller){
|
||||
@@ -414,8 +415,13 @@ void RtspPlayer::sendPause(int type , uint32_t seekMS){
|
||||
}
|
||||
}
|
||||
|
||||
void RtspPlayer::pause(bool pause_flag) {
|
||||
sendPause(pause_flag ? type_pause : type_seek, getProgressMilliSecond());
|
||||
void RtspPlayer::pause(bool bPause) {
|
||||
sendPause(bPause ? type_pause : type_seek, getProgressMilliSecond());
|
||||
}
|
||||
|
||||
void RtspPlayer::speed(float speed)
|
||||
{
|
||||
sendRtspRequest("PLAY", _content_base, { "Scale",StrPrinter << speed });
|
||||
}
|
||||
|
||||
void RtspPlayer::handleResPAUSE(const Parser& parser,int type) {
|
||||
|
||||
@@ -41,7 +41,8 @@ public:
|
||||
~RtspPlayer() override;
|
||||
|
||||
void play(const string &strUrl) override;
|
||||
void pause(bool pause_flag) override;
|
||||
void pause(bool bPause) override;
|
||||
void speed(float speed)override;
|
||||
void teardown() override;
|
||||
float getPacketLossRate(TrackType type) const override;
|
||||
|
||||
|
||||
@@ -42,11 +42,24 @@ public:
|
||||
|
||||
}
|
||||
|
||||
void seekTo(float fProgress) override {
|
||||
fProgress = MAX(float(0), MIN(fProgress, float(1.0)));
|
||||
uint32_t getProgressPos() const override {
|
||||
if (getDuration() > 0) {
|
||||
return getProgressMilliSecond();
|
||||
}
|
||||
return PlayerBase::getProgressPos();
|
||||
|
||||
};
|
||||
|
||||
void seekTo(float fProgress) override{
|
||||
fProgress = MAX(float(0),MIN(fProgress,float(1.0)));
|
||||
seekToMilliSecond((uint32_t)(fProgress * getDuration() * 1000));
|
||||
}
|
||||
|
||||
void seekTo(uint32_t seekPos) override {
|
||||
uint32_t pos = MAX(float(0), MIN(seekPos, getDuration()))*1000;
|
||||
seekToMilliSecond(pos);
|
||||
}
|
||||
|
||||
private:
|
||||
//派生类回调函数
|
||||
bool onCheckSDP(const string &sdp) override {
|
||||
|
||||
@@ -774,21 +774,36 @@ void RtspSession::handleReq_Play(const Parser &parser) {
|
||||
}
|
||||
|
||||
bool useGOP = true;
|
||||
_enable_send_rtp = false;
|
||||
//_enable_send_rtp = false;
|
||||
float iStartTime = 0;
|
||||
auto strRange = parser["Range"];
|
||||
if (strRange.size()) {
|
||||
//这个是seek操作
|
||||
auto strStart = FindField(strRange.data(), "npt=", "-");
|
||||
if (strStart == "now") {
|
||||
strStart = "0";
|
||||
auto strScale = parser["Scale"];
|
||||
if (strScale.size() == 0)
|
||||
{
|
||||
|
||||
if (strRange.size()) {
|
||||
//这个是seek操作
|
||||
auto strStart = FindField(strRange.data(), "npt=", "-");
|
||||
if (strStart == "now") {
|
||||
strStart = "0";
|
||||
}
|
||||
iStartTime = 1000 * (float)atof(strStart.data());
|
||||
InfoP(this) << "rtsp seekTo(ms):" << iStartTime;
|
||||
useGOP = !play_src->seekTo((uint32_t)iStartTime);
|
||||
}
|
||||
iStartTime = 1000 * (float)atof(strStart.data());
|
||||
InfoP(this) << "rtsp seekTo(ms):" << iStartTime;
|
||||
useGOP = !play_src->seekTo((uint32_t)iStartTime);
|
||||
} else if (play_src->totalReaderCount() == 0) {
|
||||
//第一个消费者
|
||||
play_src->seekTo(0);
|
||||
else if (play_src->totalReaderCount() == 0) {
|
||||
//第一个消费者
|
||||
play_src->seekTo(0);
|
||||
}
|
||||
else if (play_src->totalReaderCount() > 0)
|
||||
{
|
||||
_enable_send_rtp = true;
|
||||
play_src->seekTo(-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
play_src->speed(atof(strScale.data()));
|
||||
}
|
||||
|
||||
_StrPrinter rtp_info;
|
||||
@@ -845,7 +860,17 @@ void RtspSession::handleReq_Pause(const Parser &parser) {
|
||||
}
|
||||
|
||||
sendRtspResponse("200 OK");
|
||||
_enable_send_rtp = false;
|
||||
|
||||
|
||||
auto play_src = _play_src.lock();
|
||||
if (!play_src) {
|
||||
send_StreamNotFound();
|
||||
shutdown(SockException(Err_shutdown, "rtsp stream released"));
|
||||
return;
|
||||
}
|
||||
|
||||
play_src->pause();
|
||||
//_enable_send_rtp = false;
|
||||
}
|
||||
|
||||
void RtspSession::handleReq_Teardown(const Parser &parser) {
|
||||
|
||||
Reference in New Issue
Block a user