srt can play stream

This commit is contained in:
xiongguangjie
2022-06-04 11:23:18 +08:00
parent 6237dd48dc
commit 91aa9c494c
5 changed files with 64 additions and 67 deletions

View File

@@ -10,7 +10,7 @@ SrtTransportImp::SrtTransportImp(const EventPoller::Ptr &poller)
SrtTransportImp::~SrtTransportImp() {
InfoP(this);
uint64_t duration = _alive_ticker.createdTime() / 1000;
WarnP(this) << "srt 推流器("
WarnP(this) << (_is_pusher ? "srt 推流器(" : "srt 播放器(")
<< _media_info._vhost << "/"
<< _media_info._app << "/"
<< _media_info._streamid
@@ -39,6 +39,7 @@ void SrtTransportImp::onHandShakeFinished(std::string &streamid,struct sockaddr_
emitOnPublish();
}else{
_is_pusher = false;
emitOnPlay();
}
}
void SrtTransportImp::onSRTData(DataPacket::Ptr pkt,struct sockaddr_storage *addr) {
@@ -145,72 +146,48 @@ void SrtTransportImp::emitOnPlay(){
}
}
void SrtTransportImp::doPlay(){
//鉴权结果回调
weak_ptr<SrtTransportImp> weak_self = dynamic_pointer_cast<SrtTransportImp>(shared_from_this());
auto onRes = [weak_self](const string &err) {
//异步查找直播流
std::weak_ptr<SrtTransportImp> weak_self = static_pointer_cast<SrtTransportImp>(shared_from_this());
MediaInfo info = _media_info;
info._schema = TS_SCHEMA;
MediaSource::findAsync(info, getSession(), [weak_self](const MediaSource::Ptr &src) {
auto strong_self = weak_self.lock();
if (!strong_self) {
//本对象已经销毁
TraceL<<"本对象已经销毁";
return;
}
if (!err.empty()) {
//播放鉴权失败
strong_self->onShutdown(SockException(Err_refused, err));
return;
}
//异步查找直播流
MediaInfo info = strong_self->_media_info;
info._schema = TS_SCHEMA;
MediaSource::findAsync(info, strong_self->getSession(), [weak_self](const MediaSource::Ptr &src) {
auto strong_self = weak_self.lock();
if (!strong_self) {
//本对象已经销毁
return;
}
if (!src) {
//未找到该流
if (!src) {
//未找到该流
TraceL<<"未找到该流";
strong_self->onShutdown(SockException(Err_shutdown));
} else {
TraceL<<"找到该流";
auto ts_src = dynamic_pointer_cast<TSMediaSource>(src);
assert(ts_src);
ts_src->pause(false);
strong_self->_ts_reader = ts_src->getRing()->attach(strong_self->getPoller());
strong_self->_ts_reader->setDetachCB([weak_self]() {
auto strong_self = weak_self.lock();
if (!strong_self) {
//本对象已经销毁
return;
}
strong_self->onShutdown(SockException(Err_shutdown));
} else {
auto ts_src = dynamic_pointer_cast<TSMediaSource>(src);
assert(ts_src);
ts_src->pause(false);
strong_self->_ts_reader = ts_src->getRing()->attach(strong_self->getPoller());
strong_self->_ts_reader->setDetachCB([weak_self]() {
auto strong_self = weak_self.lock();
if (!strong_self) {
//本对象已经销毁
return;
}
strong_self->onShutdown(SockException(Err_shutdown));
});
strong_self->_ts_reader->setReadCB([weak_self](const TSMediaSource::RingDataType &ts_list) {
auto strong_self = weak_self.lock();
if (!strong_self) {
//本对象已经销毁
return;
}
size_t i = 0;
auto size = ts_list->size();
ts_list->for_each([&](const TSPacket::Ptr &ts) { strong_self->onSendData(ts, ++i == size); });
});
};
});
};
Broadcast::AuthInvoker invoker = [weak_self, onRes](const string &err) {
if (auto strongSelf = weak_self.lock()) {
strongSelf->getPoller()->async([onRes, err]() { onRes(err); });
}
};
auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed, _media_info, invoker, static_cast<SockInfo &>(*this));
if (!flag) {
//该事件无人监听,默认不鉴权
onRes("");
}
});
strong_self->_ts_reader->setReadCB([weak_self](const TSMediaSource::RingDataType &ts_list) {
auto strong_self = weak_self.lock();
if (!strong_self) {
//本对象已经销毁
return;
}
size_t i = 0;
auto size = ts_list->size();
ts_list->for_each([&](const TSPacket::Ptr &ts) { strong_self->onSendTSData(ts, ++i == size); });
});
};
});
}
std::string SrtTransportImp::get_peer_ip() {
if (!_addr) {