mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-30 07:26:53 +08:00
完成Rtp解码器与Track之间的帧数据传递
This commit is contained in:
parent
452f150f22
commit
be9af50dbb
@ -156,12 +156,46 @@ protected:
|
|||||||
ResourcePool<RtpPacket> m_rtpPool;
|
ResourcePool<RtpPacket> m_rtpPool;
|
||||||
};
|
};
|
||||||
|
|
||||||
class RtpCodec : public RtpRing, public FrameRing , public CodecInfo{
|
class RtpCodec : public RtpRing, public FrameRingInterface , public CodecInfo{
|
||||||
public:
|
public:
|
||||||
typedef std::shared_ptr<RtpCodec> Ptr;
|
typedef std::shared_ptr<RtpCodec> Ptr;
|
||||||
RtpCodec(){}
|
RtpCodec(){}
|
||||||
virtual ~RtpCodec(){}
|
virtual ~RtpCodec(){}
|
||||||
|
|
||||||
|
void setDelegate(const FrameRingInterface::Ptr &delegate){
|
||||||
|
_delegate = delegate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取帧环形缓存
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
FrameRingInterface::RingType::Ptr getFrameRing() const override {
|
||||||
|
if(_delegate){
|
||||||
|
return _delegate->getFrameRing();
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置帧环形缓存
|
||||||
|
* @param ring
|
||||||
|
*/
|
||||||
|
void setFrameRing(const FrameRingInterface::RingType::Ptr &ring) override {
|
||||||
|
if(_delegate){
|
||||||
|
_delegate->setFrameRing(ring);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入帧数据
|
||||||
|
* @param frame 帧
|
||||||
|
*/
|
||||||
|
void inputFrame(const Frame::Ptr &frame) override{
|
||||||
|
if(_delegate){
|
||||||
|
_delegate->inputFrame(frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据CodecId生成Rtp打包器
|
* 根据CodecId生成Rtp打包器
|
||||||
* @param codecId
|
* @param codecId
|
||||||
@ -186,6 +220,9 @@ public:
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
static Ptr getRtpDecoderById(CodecId codecId,uint32_t ui32SampleRate);
|
static Ptr getRtpDecoderById(CodecId codecId,uint32_t ui32SampleRate);
|
||||||
|
|
||||||
|
private:
|
||||||
|
FrameRingInterface::Ptr _delegate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,16 +96,28 @@ inline bool RtpParser::inputAudio(const RtpPacket::Ptr &rtp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline void RtpParser::onGetAudioTrack(const RtspTrack& audio) {
|
inline void RtpParser::onGetAudioTrack(const RtspTrack& audio) {
|
||||||
|
//生成Track对象
|
||||||
_audioTrack = dynamic_pointer_cast<AudioTrack>(Track::getTrackBySdp(audio.trackSdp));
|
_audioTrack = dynamic_pointer_cast<AudioTrack>(Track::getTrackBySdp(audio.trackSdp));
|
||||||
if(_audioTrack){
|
if(_audioTrack){
|
||||||
|
//生成RtpCodec对象以便解码rtp
|
||||||
_audioRtpDecoder = RtpCodec::getRtpDecoderById(_audioTrack->getCodecId(),_audioTrack->getAudioSampleRate());
|
_audioRtpDecoder = RtpCodec::getRtpDecoderById(_audioTrack->getCodecId(),_audioTrack->getAudioSampleRate());
|
||||||
|
if(_audioRtpDecoder){
|
||||||
|
//设置rtp解码器代理,生成的frame写入该Track
|
||||||
|
_audioRtpDecoder->setDelegate(_audioTrack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void RtpParser::onGetVideoTrack(const RtspTrack& video) {
|
inline void RtpParser::onGetVideoTrack(const RtspTrack& video) {
|
||||||
|
//生成Track对象
|
||||||
_videoTrack = dynamic_pointer_cast<VideoTrack>(Track::getTrackBySdp(video.trackSdp));
|
_videoTrack = dynamic_pointer_cast<VideoTrack>(Track::getTrackBySdp(video.trackSdp));
|
||||||
if(_videoTrack){
|
if(_videoTrack){
|
||||||
|
//生成RtpCodec对象以便解码rtp
|
||||||
_videoRtpDecoder = RtpCodec::getRtpDecoderById(_videoTrack->getCodecId(),90000);
|
_videoRtpDecoder = RtpCodec::getRtpDecoderById(_videoTrack->getCodecId(),90000);
|
||||||
|
if(_videoRtpDecoder){
|
||||||
|
//设置rtp解码器代理,生成的frame写入该Track
|
||||||
|
_videoRtpDecoder->setDelegate(_videoTrack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user