mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-06 03:28:09 +08:00
初步完成Rtp解包
This commit is contained in:
@@ -53,76 +53,73 @@ static int getTimeInSDP(const string &sdp) {
|
||||
RtpParser::RtpParser(const string& sdp) {
|
||||
RtspTrack tmp[2];
|
||||
int cnt = parserSDP(sdp, tmp);
|
||||
if (0 == cnt) {
|
||||
throw std::runtime_error("parse sdp failed");
|
||||
}
|
||||
|
||||
for (int i = 0; i < cnt; i++) {
|
||||
switch (tmp[i].type) {
|
||||
case TrackVideo: {
|
||||
try {
|
||||
onGetVideoTrack(tmp[i]);
|
||||
m_bHaveVideo = true;
|
||||
m_mapTracks.emplace(tmp[i].PT, tmp[i]);
|
||||
} catch (std::exception &ex) {
|
||||
WarnL << ex.what();
|
||||
}
|
||||
onGetVideoTrack(tmp[i]);
|
||||
}
|
||||
break;
|
||||
case TrackAudio: {
|
||||
try {
|
||||
onGetAudioTrack(tmp[i]);
|
||||
m_bHaveAudio = true;
|
||||
m_mapTracks.emplace(tmp[i].PT, tmp[i]);
|
||||
} catch (std::exception &ex) {
|
||||
WarnL << ex.what();
|
||||
}
|
||||
onGetAudioTrack(tmp[i]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!m_bHaveVideo && !m_bHaveAudio) {
|
||||
throw std::runtime_error("不支持该RTSP媒体格式");
|
||||
}
|
||||
m_fDuration = getTimeInSDP(sdp);
|
||||
}
|
||||
RtpParser::~RtpParser() {
|
||||
}
|
||||
|
||||
bool RtpParser::inputRtp(const RtpPacket::Ptr & rtp) {
|
||||
auto &track = m_mapTracks[rtp->PT];
|
||||
switch (track.type) {
|
||||
switch (rtp->getTrackType()) {
|
||||
case TrackVideo:
|
||||
if (m_bHaveVideo) {
|
||||
return inputVideo(rtp, track);
|
||||
}
|
||||
return false;
|
||||
return inputVideo(rtp);
|
||||
case TrackAudio:
|
||||
if (m_bHaveAudio) {
|
||||
return inputAudio(rtp, track);
|
||||
}
|
||||
return false;
|
||||
return inputAudio(rtp);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
inline bool RtpParser::inputVideo(const RtpPacket::Ptr & rtp, const RtspTrack& track) {
|
||||
inline bool RtpParser::inputVideo(const RtpPacket::Ptr &rtp) {
|
||||
if(_videoRtpDecoder){
|
||||
return _videoRtpDecoder->inputRtp(rtp, true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool RtpParser::inputAudio(const RtpPacket::Ptr &rtp) {
|
||||
if(_audioRtpDecoder){
|
||||
return _audioRtpDecoder->inputRtp(rtp, false);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline void RtpParser::onGetAudioTrack(const RtspTrack& audio) {
|
||||
|
||||
_audioTrack = dynamic_pointer_cast<AudioTrack>(Track::getTrackBySdp(audio.trackSdp));
|
||||
if(_audioTrack){
|
||||
_audioRtpDecoder = RtpCodec::getRtpDecoderById(_audioTrack->getCodecId(),_audioTrack->getAudioSampleRate());
|
||||
}
|
||||
}
|
||||
|
||||
inline void RtpParser::onGetVideoTrack(const RtspTrack& video) {
|
||||
|
||||
_videoTrack = dynamic_pointer_cast<VideoTrack>(Track::getTrackBySdp(video.trackSdp));
|
||||
if(_videoTrack){
|
||||
_videoRtpDecoder = RtpCodec::getRtpDecoderById(_videoTrack->getCodecId(),90000);
|
||||
}
|
||||
}
|
||||
|
||||
inline bool RtpParser::inputAudio(const RtpPacket::Ptr &rtppack, const RtspTrack& track) {
|
||||
vector<Track::Ptr> RtpParser::getTracks() const {
|
||||
vector<Track::Ptr> ret;
|
||||
if(_videoTrack){
|
||||
ret.emplace_back(_videoTrack);
|
||||
}
|
||||
if(_audioTrack){
|
||||
ret.emplace_back(_audioTrack);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
} /* namespace Rtsp */
|
||||
} /* namespace ZL */
|
||||
|
||||
@@ -45,7 +45,8 @@ class RtpParser : public PlayerBase{
|
||||
public:
|
||||
typedef std::shared_ptr<RtpParser> Ptr;
|
||||
RtpParser(const string &sdp);
|
||||
virtual ~RtpParser();
|
||||
virtual ~RtpParser(){};
|
||||
|
||||
//返回值:true 代表是i帧第一个rtp包
|
||||
bool inputRtp(const RtpPacket::Ptr &rtp);
|
||||
|
||||
@@ -54,32 +55,22 @@ public:
|
||||
}
|
||||
|
||||
bool isInited() const override{
|
||||
if (m_bHaveAudio && !m_strAudioCfg.size()) {
|
||||
return false;
|
||||
}
|
||||
if (m_bHaveVideo && !m_strSPS.size()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
private:
|
||||
std::unordered_map<uint8_t, RtspTrack> m_mapTracks;
|
||||
|
||||
vector<Track::Ptr> getTracks() const override;
|
||||
private:
|
||||
inline void onGetAudioTrack(const RtspTrack &audio);
|
||||
inline void onGetVideoTrack(const RtspTrack &video);
|
||||
|
||||
//返回值:true 代表是i帧第一个rtp包
|
||||
inline bool inputVideo(const RtpPacket::Ptr &rtp, const RtspTrack &track);
|
||||
inline bool inputAudio(const RtpPacket::Ptr &rtp, const RtspTrack &track);
|
||||
|
||||
string m_strSPS;
|
||||
string m_strPPS;
|
||||
string m_strAudioCfg;
|
||||
bool m_bHaveAudio = false;
|
||||
bool m_bHaveVideo= false;
|
||||
inline bool inputVideo(const RtpPacket::Ptr &rtp);
|
||||
inline bool inputAudio(const RtpPacket::Ptr &rtp);
|
||||
private:
|
||||
float m_fDuration = 0;
|
||||
|
||||
recursive_mutex m_mtxCB;
|
||||
AudioTrack::Ptr _audioTrack;
|
||||
VideoTrack::Ptr _videoTrack;
|
||||
RtpCodec::Ptr _audioRtpDecoder;
|
||||
RtpCodec::Ptr _videoRtpDecoder;
|
||||
};
|
||||
|
||||
} /* namespace Rtsp */
|
||||
|
||||
@@ -73,8 +73,8 @@ public:
|
||||
* @param frame 帧数据
|
||||
* @param key_pos 是否为关键帧
|
||||
*/
|
||||
void inputFrame(const Frame::Ptr &frame,bool key_pos) override{
|
||||
_encoder->inputFrame(frame,key_pos);
|
||||
bool inputFrame(const Frame::Ptr &frame,bool key_pos) override{
|
||||
return _encoder->inputFrame(frame,key_pos);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,8 +82,8 @@ public:
|
||||
* @param rtp rtp数据包
|
||||
* @param key_pos 是否为关键帧第一个rtp包
|
||||
*/
|
||||
void inputRtp(const RtpPacket::Ptr &rtp, bool key_pos) override{
|
||||
_encoder->inputRtp(rtp,key_pos);
|
||||
bool inputRtp(const RtpPacket::Ptr &rtp, bool key_pos) override{
|
||||
return _encoder->inputRtp(rtp,key_pos);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -108,12 +108,12 @@ public:
|
||||
* @param mtu mtu大小,一般小于1500字节,推荐1400
|
||||
*/
|
||||
virtual void createRtpEncoder(uint32_t ssrc, int mtu) {
|
||||
_encoder = RtpCodec::getRtpCodecById(getCodecId(),
|
||||
ssrc,
|
||||
mtu,
|
||||
_sample_rate,
|
||||
_playload_type,
|
||||
getTrackType() * 2);
|
||||
_encoder = RtpCodec::getRtpEncoderById(getCodecId(),
|
||||
ssrc,
|
||||
mtu,
|
||||
_sample_rate,
|
||||
_playload_type,
|
||||
getTrackType() * 2);
|
||||
}
|
||||
private:
|
||||
RtpCodec::Ptr _encoder;
|
||||
@@ -315,12 +315,12 @@ public:
|
||||
* @param frame 帧数据
|
||||
* @param key_pos 是否为关键帧
|
||||
*/
|
||||
void inputFrame(const Frame::Ptr &frame,bool key_pos = true) override {
|
||||
bool inputFrame(const Frame::Ptr &frame,bool key_pos = true) override {
|
||||
auto it = _sdp_map.find(frame->getTrackType());
|
||||
if(it == _sdp_map.end()){
|
||||
return ;
|
||||
return false;
|
||||
}
|
||||
it->second->inputFrame(frame,key_pos);
|
||||
return it->second->inputFrame(frame,key_pos);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -328,12 +328,12 @@ public:
|
||||
* @param rtp rtp包
|
||||
* @param key_pos 是否为关键帧的第一个rtp包
|
||||
*/
|
||||
void inputRtp(const RtpPacket::Ptr &rtp, bool key_pos = true) override {
|
||||
bool inputRtp(const RtpPacket::Ptr &rtp, bool key_pos = true) override {
|
||||
auto it = _sdp_map.find(rtp->getTrackType());
|
||||
if(it == _sdp_map.end()){
|
||||
return ;
|
||||
return false;
|
||||
}
|
||||
it->second->inputRtp(rtp,key_pos);
|
||||
return it->second->inputRtp(rtp,key_pos);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user