初步完成Rtp解包

This commit is contained in:
xiongziliang
2018-10-23 18:39:17 +08:00
parent 49daa1baad
commit 8930dd099e
13 changed files with 158 additions and 118 deletions

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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);
}
/**