From 2da4e0a43ed012180b01978eb1392671375e766c Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 22 Mar 2020 08:28:51 +0800 Subject: [PATCH] For #1638, #307, config to discard aac for rtc --- trunk/conf/full.conf | 5 +++++ trunk/src/app/srs_app_config.cpp | 22 ++++++++++++++++++++-- trunk/src/app/srs_app_config.hpp | 1 + trunk/src/app/srs_app_rtc.cpp | 9 +++++++++ trunk/src/app/srs_app_rtc.hpp | 2 ++ 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 46b9229fc..bf2ec8377 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -335,6 +335,11 @@ vhost rtc.vhost.srs.com { # discard Discard bframe, maybe cause browser with little problems. # default: keep bframe discard; + # The strategy for aac audio. + # transcode Transcode aac to opus. + # discard Discard aac audio packet. + # default: transcode + aac transcode; } } diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index fdc5d1aef..c5a0e3a3c 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -3822,8 +3822,8 @@ srs_error_t SrsConfig::check_normal_config() } else if (n == "rtc") { for (int j = 0; j < (int)conf->directives.size(); j++) { string m = conf->at(j)->name; - if (m != "enabled" && m != "bframe") { - return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal vhost.bandcheck.%s of %s", m.c_str(), vhost->arg0().c_str()); + if (m != "enabled" && m != "bframe" && m != "aac") { + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal vhost.rtc.%s of %s", m.c_str(), vhost->arg0().c_str()); } } } @@ -4381,6 +4381,24 @@ bool SrsConfig::get_rtc_bframe_discard(string vhost) return conf->arg0() == "discard"; } +bool SrsConfig::get_rtc_aac_discard(string vhost) +{ + static bool DEFAULT = false; + + SrsConfDirective* conf = get_rtc(vhost); + + if (!conf) { + return DEFAULT; + } + + conf = conf->get("aac"); + if (!conf || conf->arg0().empty()) { + return DEFAULT; + } + + return conf->arg0() == "discard"; +} + SrsConfDirective* SrsConfig::get_vhost(string vhost, bool try_default_vhost) { srs_assert(root); diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index e50aff296..e58777dfa 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -509,6 +509,7 @@ public: SrsConfDirective* get_rtc(std::string vhost); bool get_rtc_enabled(std::string vhost); bool get_rtc_bframe_discard(std::string vhost); + bool get_rtc_aac_discard(std::string vhost); // vhost specified section public: diff --git a/trunk/src/app/srs_app_rtc.cpp b/trunk/src/app/srs_app_rtc.cpp index 3cf8dc1eb..9a2acda3b 100644 --- a/trunk/src/app/srs_app_rtc.cpp +++ b/trunk/src/app/srs_app_rtc.cpp @@ -430,6 +430,8 @@ SrsRtc::SrsRtc() enabled = false; disposable = false; last_update_time = 0; + + discard_aac = false; } SrsRtc::~SrsRtc() @@ -461,6 +463,8 @@ srs_error_t SrsRtc::initialize(SrsOriginHub* h, SrsRequest* r) rtp_h264_muxer = new SrsRtpMuxer(); rtp_h264_muxer->discard_bframe = _srs_config->get_rtc_bframe_discard(req->vhost); + // TODO: FIXME: Support reload and log it. + discard_aac = _srs_config->get_rtc_aac_discard(req->vhost); rtp_opus_muxer = new SrsRtpOpusMuxer(); if (rtp_opus_muxer) { @@ -527,6 +531,11 @@ srs_error_t SrsRtc::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* forma if (acodec != SrsAudioCodecIdAAC && acodec != SrsAudioCodecIdMP3) { return err; } + + // When drop aac audio packet, never transcode. + if (discard_aac && acodec == SrsAudioCodecIdAAC) { + return err; + } // ignore sequence header srs_assert(format->audio); diff --git a/trunk/src/app/srs_app_rtc.hpp b/trunk/src/app/srs_app_rtc.hpp index 27974943f..64c28db57 100644 --- a/trunk/src/app/srs_app_rtc.hpp +++ b/trunk/src/app/srs_app_rtc.hpp @@ -82,6 +82,7 @@ private: srs_error_t packet_stap_a(const std::string &sps, const std::string& pps, SrsSharedPtrMessage* shared_frame, std::vector& rtp_packet_vec); }; +// TODO: FIXME: It's not a muxer, but a transcoder. class SrsRtpOpusMuxer { private: @@ -105,6 +106,7 @@ private: SrsRequest* req; bool enabled; bool disposable; + bool discard_aac; srs_utime_t last_update_time; SrsRtpMuxer* rtp_h264_muxer; SrsRtpOpusMuxer* rtp_opus_muxer;