From 3765873582dbb35887d4bc49eb3083050a9e39b8 Mon Sep 17 00:00:00 2001 From: cqm Date: Thu, 17 Nov 2022 12:43:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E8=BD=AC=E7=A0=81=E5=92=8C?= =?UTF-8?q?=E9=9D=99=E9=9F=B3=E5=8F=91=E7=94=9F=E5=99=A8=E5=86=B2=E7=AA=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9A=20=E7=94=B1=E4=BA=8E=E9=9D=99?= =?UTF-8?q?=E9=9F=B3=E5=8F=91=E7=94=9F=E5=99=A8=E4=BA=A7=E7=94=9F=E7=9A=84?= =?UTF-8?q?=E9=9F=B3=E9=A2=91=E6=97=B6=E9=97=B4=E6=88=B3=E4=B8=8D=E8=BF=9E?= =?UTF-8?q?=E7=BB=AD=EF=BC=8C=E4=BC=9A=E5=AF=BC=E8=87=B4=E8=BD=AC=E7=A0=81?= =?UTF-8?q?=E5=87=BA=E4=B8=80=E5=A4=A7=E5=A0=86=E8=AD=A6=E5=91=8A=E6=97=A5?= =?UTF-8?q?=E5=BF=97=EF=BC=8C=E5=B9=B6=E5=8D=A0=E7=94=A8cpu=20=E8=BF=99?= =?UTF-8?q?=E5=8F=98=E9=87=87=E7=94=A8opus=E9=9D=99=E9=9F=B3=E5=8F=91?= =?UTF-8?q?=E7=94=9F=E5=99=A8=E6=9D=A5=E4=BC=AA=E9=80=A0rtc=E9=9D=99?= =?UTF-8?q?=E9=9F=B3=EF=BC=8C=E8=80=8C=E4=B8=8D=E6=98=AF=E7=94=A8=E8=BD=AC?= =?UTF-8?q?=E7=A0=81=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MultiMediaSourceMuxer.cpp | 44 ++++++++++++++++++---------- src/Common/MultiMediaSourceMuxer.h | 2 +- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 1579fc98..f7104e0b 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -139,10 +139,10 @@ MultiMediaSourceMuxer::MultiMediaSourceMuxer(const MediaTuple& tuple, float dur_ } if (option.audio_transcode) { #if defined(ENABLE_FFMPEG) - _audio_transcode = option.audio_transcode; InfoL << "enable audio_transcode"; #else InfoL << "without ffmpeg disable audio_transcode"; + _option.audio_transcode = false; #endif } @@ -410,7 +410,7 @@ bool MultiMediaSourceMuxer::onTrackReady(const Track::Ptr &track) { auto rtmp = _rtmp; auto rtc = _rtc; #if defined(ENABLE_FFMPEG) - if (_audio_transcode) { + if (_option.audio_transcode) { if (track->getCodecId() == CodecAAC) { if (rtmp) { rtmp->addTrack(track); @@ -418,24 +418,34 @@ bool MultiMediaSourceMuxer::onTrackReady(const Track::Ptr &track) { } _audio_dec = nullptr; _audio_enc = nullptr; + _opus_mute_maker = nullptr; if (rtc) { Track::Ptr newTrack(new OpusTrack()); GET_CONFIG(int, bitrate, General::kOpusBitrate); newTrack->setBitRate(bitrate); rtc->addTrack(newTrack); rtc = nullptr; - - // aac to opus - _audio_dec.reset(new FFmpegDecoder(track)); - _audio_enc.reset(new FFmpegEncoder(newTrack)); - _audio_dec->setOnDecode([this](const FFmpegFrame::Ptr & frame) { - _audio_enc->inputFrame(frame, false); - }); - _audio_enc->setOnEncode([this](const Frame::Ptr& frame) { - // fill data to _rtc - if (_rtc && _rtc->isEnabled()) - _rtc->inputFrame(frame); - }); + if (!hasMuteAudio()) { + // aac to opus + _audio_dec.reset(new FFmpegDecoder(track)); + _audio_enc.reset(new FFmpegEncoder(newTrack)); + _audio_dec->setOnDecode([this](const FFmpegFrame::Ptr & frame) { + _audio_enc->inputFrame(frame, false); + }); + _audio_enc->setOnEncode([this](const Frame::Ptr& frame) { + // fill data to _rtc + if (_rtc && _rtc->isEnabled()) + _rtc->inputFrame(frame); + }); + } + else { + _opus_mute_maker = std::make_shared(CodecOpus); + _opus_mute_maker->addDelegate([this](const Frame::Ptr &frame) { + if (_rtc && _rtc->isEnabled()) + _rtc->inputFrame(frame); + return true; + }); + } } } else if (track->getTrackType() == TrackAudio) { @@ -445,6 +455,7 @@ bool MultiMediaSourceMuxer::onTrackReady(const Track::Ptr &track) { } _audio_dec = nullptr; _audio_enc = nullptr; + _opus_mute_maker = nullptr; if (rtmp) { Track::Ptr newTrack(new AACTrack(44100, std::dynamic_pointer_cast(track)->getAudioChannel())); GET_CONFIG(int, bitrate, General::kAacBitrate); @@ -571,6 +582,7 @@ void MultiMediaSourceMuxer::resetTracks() { #if defined(ENABLE_FFMPEG) _audio_dec = nullptr; _audio_dec = nullptr; + _opus_mute_maker = nullptr; #endif if (_fmp4) { _fmp4->resetTracks(); @@ -601,7 +613,7 @@ bool MultiMediaSourceMuxer::onTrackFrame(const Frame::Ptr &frame_in) { if (_rtmp && _rtmp->isEnabled()) rtmp = _rtmp; #if defined(ENABLE_FFMPEG) - if (_audio_transcode) { + if (_option.audio_transcode) { if (frame->getCodecId() == CodecAAC) { if (rtc) { if (_audio_dec && rtc->readerCount()) @@ -615,6 +627,8 @@ bool MultiMediaSourceMuxer::onTrackFrame(const Frame::Ptr &frame_in) { _audio_dec->inputFrame(frame, true, false, false); rtmp = nullptr; } + } else if (_opus_mute_maker && rtc) { + _opus_mute_maker->inputFrame(frame); } } #endif diff --git a/src/Common/MultiMediaSourceMuxer.h b/src/Common/MultiMediaSourceMuxer.h index ffb3acfa..5042ef65 100644 --- a/src/Common/MultiMediaSourceMuxer.h +++ b/src/Common/MultiMediaSourceMuxer.h @@ -179,7 +179,7 @@ private: std::shared_ptr _ts; std::shared_ptr _rtc; #if defined(ENABLE_FFMPEG) - bool _audio_transcode = false; + MuteAudioMaker::Ptr _opus_mute_maker; std::shared_ptr _audio_dec; std::shared_ptr _audio_enc; #endif