Commit cb165025 by cqm

支持多种类型的静音发生器

parent 5041cf5b
...@@ -236,18 +236,65 @@ static uint8_t s_mute_adts[] = {0xff, 0xf1, 0x6c, 0x40, 0x2d, 0x3f, 0xfc, 0x00, ...@@ -236,18 +236,65 @@ static uint8_t s_mute_adts[] = {0xff, 0xf1, 0x6c, 0x40, 0x2d, 0x3f, 0xfc, 0x00,
0x39, 0x1a, 0x77, 0x92, 0x9b, 0xff, 0xc6, 0xae, 0xf8, 0x36, 0xba, 0xa8, 0xaa, 0x6b, 0x1e, 0x8c, 0x39, 0x1a, 0x77, 0x92, 0x9b, 0xff, 0xc6, 0xae, 0xf8, 0x36, 0xba, 0xa8, 0xaa, 0x6b, 0x1e, 0x8c,
0xc5, 0x97, 0x39, 0x6a, 0xb8, 0xa2, 0x55, 0xa8, 0xf8}; 0xc5, 0x97, 0x39, 0x6a, 0xb8, 0xa2, 0x55, 0xa8, 0xf8};
#define MUTE_ADTS_DATA s_mute_adts static uint8_t opus_silence[] = {
#define MUTE_ADTS_DATA_LEN sizeof(s_mute_adts) 0xf8, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
#define MUTE_ADTS_DATA_MS 128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static uint8_t g711_silence[160] = { 0 };
MuteAudioMaker::MuteAudioMaker(CodecId codec /*= CodecAAC*/) : _codec(codec)
{
switch (codec)
{
case CodecAAC:
_frame_ms = 128;
break;
case CodecOpus:
_frame_ms = 20;
break;
case CodecG711A:
case CodecG711U:
_frame_ms = 20;
break;
default:
_frame_ms = 0;
break;
}
}
Frame::Ptr MuteAudioMaker::makeSlienceFrame(int64_t dts) {
switch (_codec)
{
case CodecAAC:
return std::make_shared<FrameFromStaticPtr>(_codec, (char*)s_mute_adts, sizeof(s_mute_adts),
dts, 0, ADTS_HEADER_LEN);
break;
case CodecOpus:
return std::make_shared<FrameFromStaticPtr>(_codec, (char*)opus_silence, sizeof(opus_silence),
dts, 0, 0);
case CodecG711A:
case CodecG711U:
return std::make_shared<FrameFromStaticPtr>(_codec, (char*)g711_silence, sizeof(g711_silence),
dts, 0, 0);
default:
return nullptr;
}
}
bool MuteAudioMaker::inputFrame(const Frame::Ptr &frame) { bool MuteAudioMaker::inputFrame(const Frame::Ptr &frame) {
if (frame->getTrackType() == TrackVideo) { if (frame->getTrackType() == TrackVideo && _frame_ms > 0) {
auto audio_idx = frame->dts() / MUTE_ADTS_DATA_MS; auto audio_idx = frame->dts() / _frame_ms;
if (_audio_idx != audio_idx) { if (_audio_idx != audio_idx) {
_audio_idx = audio_idx; _audio_idx = audio_idx;
auto aacFrame = std::make_shared<FrameFromStaticPtr>(CodecAAC, (char *) MUTE_ADTS_DATA, MUTE_ADTS_DATA_LEN, return FrameDispatcher::inputFrame(makeSlienceFrame(_audio_idx * _frame_ms));
_audio_idx * MUTE_ADTS_DATA_MS, 0, ADTS_HEADER_LEN);
return FrameDispatcher::inputFrame(aacFrame);
} }
} }
return false; return false;
...@@ -260,7 +307,7 @@ bool MediaSink::addMuteAudioTrack() { ...@@ -260,7 +307,7 @@ bool MediaSink::addMuteAudioTrack() {
if (_track_map.find(TrackAudio) != _track_map.end()) { if (_track_map.find(TrackAudio) != _track_map.end()) {
return false; return false;
} }
auto audio = std::make_shared<AACTrack>(makeAacConfig(MUTE_ADTS_DATA, ADTS_HEADER_LEN)); auto audio = std::make_shared<AACTrack>(makeAacConfig(s_mute_adts, ADTS_HEADER_LEN));
_track_map[audio->getTrackType()] = std::make_pair(audio, true); _track_map[audio->getTrackType()] = std::make_pair(audio, true);
audio->addDelegate([this](const Frame::Ptr &frame) { audio->addDelegate([this](const Frame::Ptr &frame) {
return onTrackFrame(frame); return onTrackFrame(frame);
......
...@@ -53,14 +53,17 @@ public: ...@@ -53,14 +53,17 @@ public:
/** /**
* aac静音音频添加器 * aac静音音频添加器
*/ */
class MuteAudioMaker : public FrameDispatcher { class MuteAudioMaker : public FrameDispatcher, public CodecInfo {
public: public:
using Ptr = std::shared_ptr<MuteAudioMaker>; using Ptr = std::shared_ptr<MuteAudioMaker>;
MuteAudioMaker() = default; MuteAudioMaker(CodecId codec = CodecAAC);
~MuteAudioMaker() override = default; ~MuteAudioMaker() override = default;
bool inputFrame(const Frame::Ptr &frame) override; bool inputFrame(const Frame::Ptr &frame) override;
Frame::Ptr makeSlienceFrame(int64_t dts);
CodecId getCodecId() const override { return _codec; }
private: private:
CodecId _codec;
int _frame_ms = 0;
uint64_t _audio_idx = 0; uint64_t _audio_idx = 0;
}; };
...@@ -130,7 +133,10 @@ public: ...@@ -130,7 +133,10 @@ public:
* 设置是否开启添加静音音频 * 设置是否开启添加静音音频
*/ */
void enableMuteAudio(bool flag); void enableMuteAudio(bool flag);
bool hasMuteAudio() const { return _mute_audio_maker != nullptr; }
bool isMuteCodec(CodecId codec) const {
return _mute_audio_maker && codec == _mute_audio_maker->getCodecId();
}
/** /**
* 是否有视频track * 是否有视频track
*/ */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论