send config frames once before sending DirectProxy RTP packets
This commit is contained in:
parent
4f11cba26f
commit
f7411db180
|
|
@ -9,7 +9,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "WebRtcPlayer.h"
|
#include "WebRtcPlayer.h"
|
||||||
|
|
||||||
#include "Common/config.h"
|
#include "Common/config.h"
|
||||||
|
#include "Extension/Factory.h"
|
||||||
|
#include "Util/base64.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
@ -32,6 +35,9 @@ WebRtcPlayer::WebRtcPlayer(const EventPoller::Ptr &poller,
|
||||||
_media_info = info;
|
_media_info = info;
|
||||||
_play_src = src;
|
_play_src = src;
|
||||||
CHECK(src);
|
CHECK(src);
|
||||||
|
|
||||||
|
GET_CONFIG(bool, direct_proxy, Rtsp::kDirectProxy);
|
||||||
|
_send_config_frames_once = direct_proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebRtcPlayer::onStartWebRTC() {
|
void WebRtcPlayer::onStartWebRTC() {
|
||||||
|
|
@ -56,6 +62,13 @@ void WebRtcPlayer::onStartWebRTC() {
|
||||||
if (!strong_self) {
|
if (!strong_self) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strong_self->_send_config_frames_once && !pkt->empty()) {
|
||||||
|
const auto &first_rtp = pkt->front();
|
||||||
|
strong_self->sendConfigFrames(first_rtp->getSeq(), first_rtp->sample_rate, first_rtp->getStamp(), first_rtp->ntp_stamp);
|
||||||
|
strong_self->_send_config_frames_once = false;
|
||||||
|
}
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
pkt->for_each([&](const RtpPacket::Ptr &rtp) {
|
pkt->for_each([&](const RtpPacket::Ptr &rtp) {
|
||||||
//TraceL<<"send track type:"<<rtp->type<<" ts:"<<rtp->getStamp()<<" ntp:"<<rtp->ntp_stamp<<" size:"<<rtp->getPayloadSize()<<" i:"<<i;
|
//TraceL<<"send track type:"<<rtp->type<<" ts:"<<rtp->getStamp()<<" ntp:"<<rtp->ntp_stamp<<" size:"<<rtp->getPayloadSize()<<" i:"<<i;
|
||||||
|
|
@ -111,4 +124,37 @@ void WebRtcPlayer::onRtcConfigure(RtcConfigure &configure) const {
|
||||||
configure.setPlayRtspInfo(playSrc->getSdp());
|
configure.setPlayRtspInfo(playSrc->getSdp());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebRtcPlayer::sendConfigFrames(uint32_t before_seq, uint32_t sample_rate, uint32_t timestamp, uint64_t ntp_timestamp) {
|
||||||
|
auto play_src = _play_src.lock();
|
||||||
|
if (!play_src) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto video_track = std::dynamic_pointer_cast<mediakit::VideoTrack>(play_src->getTrack(mediakit::TrackVideo));
|
||||||
|
if (!video_track) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto frames = video_track->getConfigFrames();
|
||||||
|
if (frames.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto encoder = mediakit::Factory::getRtpEncoderByCodecId(video_track->getCodecId(), 0);
|
||||||
|
if (!encoder) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_CONFIG(uint32_t, video_mtu, Rtp::kVideoMtuSize);
|
||||||
|
encoder->setRtpInfo(0, video_mtu, sample_rate, 0, 0, 0);
|
||||||
|
|
||||||
|
auto seq = before_seq - frames.size();
|
||||||
|
for (const auto &frame : video_track->getConfigFrames()) {
|
||||||
|
auto rtp = encoder->getRtpInfo().makeRtp(
|
||||||
|
TrackVideo, frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize(), false, 0);
|
||||||
|
auto header = rtp->getHeader();
|
||||||
|
header->seq = htons(seq++);
|
||||||
|
header->stamp = htonl(timestamp);
|
||||||
|
rtp->ntp_stamp = ntp_timestamp;
|
||||||
|
onSendRtp(rtp, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}// namespace mediakit
|
}// namespace mediakit
|
||||||
|
|
@ -31,11 +31,17 @@ protected:
|
||||||
private:
|
private:
|
||||||
WebRtcPlayer(const EventPoller::Ptr &poller, const RtspMediaSource::Ptr &src, const MediaInfo &info);
|
WebRtcPlayer(const EventPoller::Ptr &poller, const RtspMediaSource::Ptr &src, const MediaInfo &info);
|
||||||
|
|
||||||
|
void sendConfigFrames(uint32_t before_seq, uint32_t sample_rate, uint32_t timestamp, uint64_t ntp_timestamp);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//媒体相关元数据
|
//媒体相关元数据
|
||||||
MediaInfo _media_info;
|
MediaInfo _media_info;
|
||||||
//播放的rtsp源
|
//播放的rtsp源
|
||||||
std::weak_ptr<RtspMediaSource> _play_src;
|
std::weak_ptr<RtspMediaSource> _play_src;
|
||||||
|
|
||||||
|
// rtp 直接转发情况下通常会缺少 sps/pps, 在转发 rtp 前, 先发送一次相关帧信息, 部分情况下是可以播放的
|
||||||
|
bool _send_config_frames_once { false };
|
||||||
|
|
||||||
//播放rtsp源的reader对象
|
//播放rtsp源的reader对象
|
||||||
RtspMediaSource::RingType::RingReader::Ptr _reader;
|
RtspMediaSource::RingType::RingReader::Ptr _reader;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue