Merge branch 'master' of github.com:xuandu/ZLMediaKit_1

This commit is contained in:
xia-chu 2023-11-07 23:29:07 +08:00
commit a349a03ce9
12 changed files with 77 additions and 45 deletions

View File

@ -353,6 +353,7 @@ Value makeMediaSourceJson(MediaSource &media){
try { current_thread = media.getOwnerPoller()->isCurrentThread();} catch (...) {} try { current_thread = media.getOwnerPoller()->isCurrentThread();} catch (...) {}
float last_loss = -1; float last_loss = -1;
for(auto &track : media.getTracks(false)){ for(auto &track : media.getTracks(false)){
track->update();
Value obj; Value obj;
auto codec_type = track->getTrackType(); auto codec_type = track->getTrackType();
obj["codec_id"] = track->getCodecId(); obj["codec_id"] = track->getCodecId();

View File

@ -45,6 +45,7 @@ static string getTrackInfoStr(const TrackSource *track_src){
_StrPrinter codec_info; _StrPrinter codec_info;
auto tracks = track_src->getTracks(true); auto tracks = track_src->getTracks(true);
for (auto &track : tracks) { for (auto &track : tracks) {
track->update();
auto codec_type = track->getTrackType(); auto codec_type = track->getTrackType();
codec_info << track->getCodecName(); codec_info << track->getCodecName();
switch (codec_type) { switch (codec_type) {

View File

@ -67,7 +67,10 @@ static void dumpAdtsHeader(const AdtsHeader &hed, uint8_t *out) {
out[6] |= (hed.no_raw_data_blocks_in_frame & 0x03); // 2 bit out[6] |= (hed.no_raw_data_blocks_in_frame & 0x03); // 2 bit
} }
static void parseAacConfig(const string &config, AdtsHeader &adts) { static bool parseAacConfig(const string &config, AdtsHeader &adts) {
if (config.size() < 2) {
return false;
}
uint8_t cfg1 = config[0]; uint8_t cfg1 = config[0];
uint8_t cfg2 = config[1]; uint8_t cfg2 = config[1];
@ -94,6 +97,7 @@ static void parseAacConfig(const string &config, AdtsHeader &adts) {
adts.aac_frame_length = 7; adts.aac_frame_length = 7;
adts.adts_buffer_fullness = 2047; adts.adts_buffer_fullness = 2047;
adts.no_raw_data_blocks_in_frame = 0; adts.no_raw_data_blocks_in_frame = 0;
return true;
} }
#endif// ENABLE_MP4 #endif// ENABLE_MP4
@ -171,7 +175,9 @@ int dumpAacConfig(const string &config, size_t length, uint8_t *out, size_t out_
bool parseAacConfig(const string &config, int &samplerate, int &channels) { bool parseAacConfig(const string &config, int &samplerate, int &channels) {
#ifndef ENABLE_MP4 #ifndef ENABLE_MP4
AdtsHeader header; AdtsHeader header;
parseAacConfig(config, header); if (!parseAacConfig(config, header)) {
return false;
}
samplerate = samplingFrequencyTable[header.sf_index]; samplerate = samplingFrequencyTable[header.sf_index];
channels = header.channel_configuration; channels = header.channel_configuration;
return true; return true;
@ -326,13 +332,16 @@ bool AACTrack::inputFrame_l(const Frame::Ptr &frame) {
return false; return false;
} }
void AACTrack::onReady() { void AACTrack::update() {
if (_cfg.size() < 2) {
return;
}
parseAacConfig(_cfg, _sampleRate, _channel); parseAacConfig(_cfg, _sampleRate, _channel);
} }
void AACTrack::onReady() {
if (!parseAacConfig(_cfg, _sampleRate, _channel)) {
_cfg.clear();
}
}
Track::Ptr AACTrack::clone() { Track::Ptr AACTrack::clone() {
return std::make_shared<std::remove_reference<decltype(*this)>::type>(*this); return std::make_shared<std::remove_reference<decltype(*this)>::type>(*this);
} }
@ -342,6 +351,7 @@ Sdp::Ptr AACTrack::getSdp() {
WarnL << getCodecName() << " Track未准备好"; WarnL << getCodecName() << " Track未准备好";
return nullptr; return nullptr;
} }
update();
return std::make_shared<AACSdp>(getConfig(), getAudioSampleRate(), getAudioChannel(), getBitRate() / 1024); return std::make_shared<AACSdp>(getConfig(), getAudioSampleRate(), getAudioChannel(), getBitRate() / 1024);
} }

View File

@ -52,6 +52,7 @@ public:
int getAudioSampleRate() const override; int getAudioSampleRate() const override;
int getAudioSampleBit() const override; int getAudioSampleBit() const override;
bool inputFrame(const Frame::Ptr &frame) override; bool inputFrame(const Frame::Ptr &frame) override;
void update() override;
private: private:
void onReady(); void onReady();

View File

@ -168,6 +168,10 @@ bool H264Track::inputFrame(const Frame::Ptr &frame) {
return ret; return ret;
} }
void H264Track::update() {
getAVCInfo(_sps, _width, _height, _fps);
}
void H264Track::onReady() { void H264Track::onReady() {
if (!getAVCInfo(_sps, _width, _height, _fps)) { if (!getAVCInfo(_sps, _width, _height, _fps)) {
_sps.clear(); _sps.clear();

View File

@ -128,6 +128,7 @@ public:
int getVideoWidth() const override; int getVideoWidth() const override;
float getVideoFps() const override; float getVideoFps() const override;
bool inputFrame(const Frame::Ptr &frame) override; bool inputFrame(const Frame::Ptr &frame) override;
void update() override;
private: private:
void onReady(); void onReady();

View File

@ -144,6 +144,10 @@ bool H265Track::inputFrame_l(const Frame::Ptr &frame) {
return ret; return ret;
} }
void H265Track::update() {
getHEVCInfo(_vps, _sps, _width, _height, _fps);
}
void H265Track::onReady() { void H265Track::onReady() {
if (!getHEVCInfo(_vps, _sps, _width, _height, _fps)) { if (!getHEVCInfo(_vps, _sps, _width, _height, _fps)) {
_vps.clear(); _vps.clear();

View File

@ -150,6 +150,7 @@ public:
int getVideoHeight() const override; int getVideoHeight() const override;
float getVideoFps() const override; float getVideoFps() const override;
bool inputFrame(const Frame::Ptr &frame) override; bool inputFrame(const Frame::Ptr &frame) override;
void update() override;
private: private:
void onReady(); void onReady();

View File

@ -39,6 +39,11 @@ public:
*/ */
virtual Track::Ptr clone() = 0; virtual Track::Ptr clone() = 0;
/**
* track信息sps/pps解析
*/
virtual void update() {}
/** /**
* sdp * sdp
* @return sdp对象 * @return sdp对象

View File

@ -70,6 +70,7 @@ void PlayerProxy::setTranslationInfo()
_transtalion_info.stream_info.clear(); _transtalion_info.stream_info.clear();
auto tracks = _muxer->getTracks(); auto tracks = _muxer->getTracks();
for (auto &track : tracks) { for (auto &track : tracks) {
track->update();
_transtalion_info.stream_info.emplace_back(); _transtalion_info.stream_info.emplace_back();
auto &back = _transtalion_info.stream_info.back(); auto &back = _transtalion_info.stream_info.back();
back.bitrate = track->getBitRate(); back.bitrate = track->getBitRate();

View File

@ -198,6 +198,7 @@ bool MP4MuxerInterface::addTrack(const Track::Ptr &track) {
return false; return false;
} }
track->update();
switch (track->getCodecId()) { switch (track->getCodecId()) {
case CodecG711A: case CodecG711A:
case CodecG711U: case CodecG711U:

View File

@ -57,6 +57,7 @@ AudioMeta::AudioMeta(const AudioTrack::Ptr &audio) {
} }
uint8_t getAudioRtmpFlags(const Track::Ptr &track) { uint8_t getAudioRtmpFlags(const Track::Ptr &track) {
track->update();
switch (track->getTrackType()) { switch (track->getTrackType()) {
case TrackAudio: { case TrackAudio: {
auto audioTrack = std::dynamic_pointer_cast<AudioTrack>(track); auto audioTrack = std::dynamic_pointer_cast<AudioTrack>(track);
@ -115,6 +116,7 @@ uint8_t getAudioRtmpFlags(const Track::Ptr &track) {
void Metadata::addTrack(AMFValue &metadata, const Track::Ptr &track) { void Metadata::addTrack(AMFValue &metadata, const Track::Ptr &track) {
Metadata::Ptr new_metadata; Metadata::Ptr new_metadata;
track->update();
switch (track->getTrackType()) { switch (track->getTrackType()) {
case TrackVideo: { case TrackVideo: {
new_metadata = std::make_shared<VideoMeta>(std::dynamic_pointer_cast<VideoTrack>(track)); new_metadata = std::make_shared<VideoMeta>(std::dynamic_pointer_cast<VideoTrack>(track));