精简复用rtp encoder创建相关代码

This commit is contained in:
ziyue
2022-08-05 17:36:51 +08:00
parent d3ac296228
commit f85de2e108
5 changed files with 98 additions and 116 deletions

View File

@@ -11,92 +11,64 @@
#if defined(ENABLE_RTPPROXY)
#include "RawEncoder.h"
#include "Extension/H264Rtp.h"
#include "Extension/AACRtp.h"
#include "Extension/H265Rtp.h"
#include "Extension/CommonRtp.h"
#include "Extension/G711Rtp.h"
#include "Extension/Factory.h"
#include "Rtsp/RtspMuxer.h"
using namespace toolkit;
namespace mediakit{
namespace mediakit {
RawEncoderImp::RawEncoderImp(uint32_t ssrc, uint8_t payload_type,bool sendAudio):_ssrc(ssrc),_payload_type(payload_type),_sendAudio(sendAudio) {
}
RawEncoderImp::RawEncoderImp(uint32_t ssrc, uint8_t payload_type, bool send_audio)
: _ssrc(ssrc)
, _payload_type(payload_type)
, _send_audio(send_audio) {}
RawEncoderImp::~RawEncoderImp() {
InfoL << this << " " << printSSRC(_ssrc);
}
bool RawEncoderImp::addTrack(const Track::Ptr &track){
if(_sendAudio && track->getTrackType() == TrackType::TrackAudio && !_rtp_encoder){// audio
bool RawEncoderImp::addTrack(const Track::Ptr &track) {
if (_send_audio && track->getTrackType() == TrackType::TrackAudio && !_rtp_encoder) { // audio
_rtp_encoder = createRtpEncoder(track);
_rtp_encoder->setRtpRing(std::make_shared<RtpRing::RingType>());
_rtp_encoder->getRtpRing()->setDelegate(std::make_shared<RingDelegateHelper>([this](RtpPacket::Ptr rtp, bool is_key){
onRTP(std::move(rtp),true);
}));
_rtp_encoder->getRtpRing()->setDelegate(std::make_shared<RingDelegateHelper>(
[this](RtpPacket::Ptr rtp, bool is_key) { onRTP(std::move(rtp), true); }));
return true;
}
if(!_sendAudio && track->getTrackType()==TrackType::TrackVideo && !_rtp_encoder){
_rtp_encoder = createRtpEncoder(track);
_rtp_encoder->setRtpRing(std::make_shared<RtpRing::RingType>());
_rtp_encoder->getRtpRing()->setDelegate(std::make_shared<RingDelegateHelper>([this](RtpPacket::Ptr rtp, bool is_key){
onRTP(std::move(rtp),is_key);
}));
if (!_send_audio && track->getTrackType() == TrackType::TrackVideo && !_rtp_encoder) {
_rtp_encoder = createRtpEncoder(track);
_rtp_encoder->setRtpRing(std::make_shared<RtpRing::RingType>());
_rtp_encoder->getRtpRing()->setDelegate(std::make_shared<RingDelegateHelper>(
[this](RtpPacket::Ptr rtp, bool is_key) { onRTP(std::move(rtp), is_key); }));
return true;
}
return true;
}
void RawEncoderImp::resetTracks(){
void RawEncoderImp::resetTracks() {
return;
}
bool RawEncoderImp::inputFrame(const Frame::Ptr &frame){
if(frame->getTrackType() == TrackType::TrackAudio && _sendAudio && _rtp_encoder){
bool RawEncoderImp::inputFrame(const Frame::Ptr &frame) {
if (frame->getTrackType() == TrackType::TrackAudio && _send_audio && _rtp_encoder) {
_rtp_encoder->inputFrame(frame);
}
if(frame->getTrackType() == TrackType::TrackVideo && !_sendAudio && _rtp_encoder){
_rtp_encoder->inputFrame(frame);
if (frame->getTrackType() == TrackType::TrackVideo && !_send_audio && _rtp_encoder) {
_rtp_encoder->inputFrame(frame);
}
return true;
}
RtpCodec::Ptr RawEncoderImp::createRtpEncoder(const Track::Ptr &track){
GET_CONFIG(uint32_t,audio_mtu,Rtp::kAudioMtuSize);
GET_CONFIG(uint32_t,video_mtu,Rtp::kVideoMtuSize);
auto codec_id = track->getCodecId();
RtpCodec::Ptr RawEncoderImp::createRtpEncoder(const Track::Ptr &track) {
uint32_t sample_rate = 90000;
int channels = 1;
auto mtu = (track->getTrackType() == TrackVideo ? video_mtu : audio_mtu);
if(track->getTrackType() == TrackType::TrackAudio){
AudioTrack::Ptr audioTrack = std::dynamic_pointer_cast<AudioTrack>(track);
sample_rate = audioTrack->getAudioSampleRate();
channels = audioTrack->getAudioChannel();
}
switch (codec_id){
case CodecH264 : return std::make_shared<H264RtpEncoder>(_ssrc, mtu, sample_rate, _payload_type, 0);
case CodecH265 : return std::make_shared<H265RtpEncoder>(_ssrc, mtu, sample_rate, _payload_type, 0);
case CodecAAC : return std::make_shared<AACRtpEncoder>(_ssrc, mtu, sample_rate, _payload_type, 0);
case CodecL16 :
case CodecOpus : return std::make_shared<CommonRtpEncoder>(codec_id, _ssrc, mtu, sample_rate, _payload_type, 0);
case CodecG711A :
case CodecG711U : {
if (_payload_type == Rtsp::PT_PCMA || _payload_type == Rtsp::PT_PCMU) {
return std::make_shared<G711RtpEncoder>(codec_id, _ssrc, mtu, sample_rate, _payload_type, 0, channels);
}
return std::make_shared<CommonRtpEncoder>(codec_id, _ssrc, mtu, sample_rate, _payload_type, 0);
}
default : WarnL << "暂不支持该CodecId:" << codec_id; return nullptr;
if (track->getTrackType() == TrackType::TrackAudio) {
sample_rate = std::static_pointer_cast<AudioTrack>(track)->getAudioSampleRate();
}
return Factory::getRtpEncoderByCodecId(track->getCodecId(), sample_rate, _payload_type, _ssrc);
}
}//namespace mediakit
} // namespace mediakit
#endif//defined(ENABLE_RTPPROXY)
#endif // defined(ENABLE_RTPPROXY)