mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-26 12:37:09 +08:00
rtc播放时,比对采样率等信息
This commit is contained in:
parent
fe02f2cf1c
commit
6070654860
@ -1331,6 +1331,10 @@ void RtcConfigure::matchMedia(shared_ptr<RtcSession> &ret, TrackType type, const
|
|||||||
if (!configure.enable) {
|
if (!configure.enable) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
bool failed = false;
|
||||||
|
|
||||||
|
RETRY:
|
||||||
|
|
||||||
for (auto &codec : configure.preferred_codec) {
|
for (auto &codec : configure.preferred_codec) {
|
||||||
for (auto &offer_media : medias) {
|
for (auto &offer_media : medias) {
|
||||||
if (offer_media.type != type) {
|
if (offer_media.type != type) {
|
||||||
@ -1342,6 +1346,8 @@ void RtcConfigure::matchMedia(shared_ptr<RtcSession> &ret, TrackType type, const
|
|||||||
}
|
}
|
||||||
const RtcCodecPlan *offer_plan_ptr = nullptr;
|
const RtcCodecPlan *offer_plan_ptr = nullptr;
|
||||||
for (auto &plan : offer_media.plan) {
|
for (auto &plan : offer_media.plan) {
|
||||||
|
if (!failed) {
|
||||||
|
//如果匹配失败了,那么随便选择一个plan
|
||||||
if (getCodecId(plan.codec) != codec) {
|
if (getCodecId(plan.codec) != codec) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1349,6 +1355,7 @@ void RtcConfigure::matchMedia(shared_ptr<RtcSession> &ret, TrackType type, const
|
|||||||
if (!onMatchCodecPlan(plan, codec)) {
|
if (!onMatchCodecPlan(plan, codec)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//找到中意的codec
|
//找到中意的codec
|
||||||
offer_plan_ptr = &plan;
|
offer_plan_ptr = &plan;
|
||||||
break;
|
break;
|
||||||
@ -1476,4 +1483,32 @@ void RtcConfigure::matchMedia(shared_ptr<RtcSession> &ret, TrackType type, const
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!failed) {
|
||||||
|
//只重试一次
|
||||||
|
failed = true;
|
||||||
|
goto RETRY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RtcConfigure::setPlayRtspInfo(const string &sdp){
|
||||||
|
RtcSession session;
|
||||||
|
session.loadFrom(sdp, false);
|
||||||
|
for (auto &m : session.media) {
|
||||||
|
switch (m.type) {
|
||||||
|
case TrackVideo : _rtsp_video_plan = std::make_shared<RtcCodecPlan>(m.plan[0]); break;
|
||||||
|
case TrackAudio : _rtsp_audio_plan = std::make_shared<RtcCodecPlan>(m.plan[0]); break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RtcConfigure::onMatchCodecPlan(const RtcCodecPlan &plan, CodecId codec){
|
||||||
|
if (_rtsp_audio_plan && codec == getCodecId(_rtsp_audio_plan->codec)) {
|
||||||
|
if (plan.sample_rate != _rtsp_audio_plan->sample_rate || plan.channel != _rtsp_audio_plan->channel) {
|
||||||
|
//音频采样率和通道数必须相同
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -574,6 +574,7 @@ public:
|
|||||||
//rtc传输编码方案
|
//rtc传输编码方案
|
||||||
class RtcCodecPlan{
|
class RtcCodecPlan{
|
||||||
public:
|
public:
|
||||||
|
using Ptr = shared_ptr<RtcCodecPlan>;
|
||||||
uint8_t pt;
|
uint8_t pt;
|
||||||
string codec;
|
string codec;
|
||||||
uint32_t sample_rate;
|
uint32_t sample_rate;
|
||||||
@ -702,9 +703,15 @@ public:
|
|||||||
|
|
||||||
shared_ptr<RtcSession> createAnswer(const RtcSession &offer);
|
shared_ptr<RtcSession> createAnswer(const RtcSession &offer);
|
||||||
|
|
||||||
|
void setPlayRtspInfo(const string &sdp);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void matchMedia(shared_ptr<RtcSession> &ret, TrackType type, const vector<RtcMedia> &medias, const RtcTrackConfigure &configure);
|
void matchMedia(shared_ptr<RtcSession> &ret, TrackType type, const vector<RtcMedia> &medias, const RtcTrackConfigure &configure);
|
||||||
bool onMatchCodecPlan(const RtcCodecPlan &plan, CodecId codec) { return true; }
|
bool onMatchCodecPlan(const RtcCodecPlan &plan, CodecId codec);
|
||||||
|
|
||||||
|
private:
|
||||||
|
RtcCodecPlan::Ptr _rtsp_video_plan;
|
||||||
|
RtcCodecPlan::Ptr _rtsp_audio_plan;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -324,16 +324,19 @@ void WebRtcTransportImp::onRtcConfigure(RtcConfigure &configure) const {
|
|||||||
//这是播放
|
//这是播放
|
||||||
configure.video.direction = RtpDirection::sendonly;
|
configure.video.direction = RtpDirection::sendonly;
|
||||||
configure.audio.direction = RtpDirection::sendonly;
|
configure.audio.direction = RtpDirection::sendonly;
|
||||||
|
configure.setPlayRtspInfo(_src->getSdp());
|
||||||
_rtsp_send_sdp.loadFrom(_src->getSdp(), false);
|
_rtsp_send_sdp.loadFrom(_src->getSdp(), false);
|
||||||
//根据rtsp流的相关信息,设置rtc最佳编码
|
//根据rtsp流的相关信息,设置rtc最佳编码
|
||||||
for (auto &m : _rtsp_send_sdp.media) {
|
for (auto &m : _rtsp_send_sdp.media) {
|
||||||
switch (m.type) {
|
switch (m.type) {
|
||||||
case TrackVideo: {
|
case TrackVideo: {
|
||||||
configure.video.preferred_codec.insert(configure.video.preferred_codec.begin(), getCodecId(m.plan[0].codec));
|
configure.video.preferred_codec.clear();
|
||||||
|
configure.video.preferred_codec.emplace_back(getCodecId(m.plan[0].codec));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TrackAudio: {
|
case TrackAudio: {
|
||||||
configure.audio.preferred_codec.insert(configure.audio.preferred_codec.begin(),getCodecId(m.plan[0].codec));
|
configure.audio.preferred_codec.clear();
|
||||||
|
configure.audio.preferred_codec.emplace_back(getCodecId(m.plan[0].codec));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user