mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
MediaSink: 确保收到数据后才触发TrackReady回调
This commit is contained in:
parent
1513e9a857
commit
e51a78ebdc
@ -39,7 +39,7 @@ bool MediaSink::addTrack(const Track::Ptr &track_in) {
|
|||||||
//克隆Track,只拷贝其数据,不拷贝其数据转发关系
|
//克隆Track,只拷贝其数据,不拷贝其数据转发关系
|
||||||
auto track = track_in->clone();
|
auto track = track_in->clone();
|
||||||
auto track_type = track->getTrackType();
|
auto track_type = track->getTrackType();
|
||||||
_track_map[track_type] = track;
|
_track_map[track_type] = std::make_pair(track, false);
|
||||||
_track_ready_callback[track_type] = [this, track]() {
|
_track_ready_callback[track_type] = [this, track]() {
|
||||||
onTrackReady(track);
|
onTrackReady(track);
|
||||||
};
|
};
|
||||||
@ -76,31 +76,27 @@ bool MediaSink::inputFrame(const Frame::Ptr &frame) {
|
|||||||
if (it == _track_map.end()) {
|
if (it == _track_map.end()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto ret = it->second->inputFrame(frame);
|
//got frame
|
||||||
|
it->second.second = true;
|
||||||
|
auto ret = it->second.first->inputFrame(frame);
|
||||||
if (_mute_audio_maker && frame->getTrackType() == TrackVideo) {
|
if (_mute_audio_maker && frame->getTrackType() == TrackVideo) {
|
||||||
//视频驱动产生静音音频
|
//视频驱动产生静音音频
|
||||||
_mute_audio_maker->inputFrame(frame);
|
_mute_audio_maker->inputFrame(frame);
|
||||||
}
|
}
|
||||||
checkTrackIfReady(nullptr);
|
checkTrackIfReady();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaSink::checkTrackIfReady_l(const Track::Ptr &track){
|
void MediaSink::checkTrackIfReady(){
|
||||||
//Track由未就绪状态转换成就绪状态,我们就触发onTrackReady回调
|
|
||||||
auto it_callback = _track_ready_callback.find(track->getTrackType());
|
|
||||||
if (it_callback != _track_ready_callback.end() && track->ready()) {
|
|
||||||
it_callback->second();
|
|
||||||
_track_ready_callback.erase(it_callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MediaSink::checkTrackIfReady(const Track::Ptr &track){
|
|
||||||
if (!_all_track_ready && !_track_ready_callback.empty()) {
|
if (!_all_track_ready && !_track_ready_callback.empty()) {
|
||||||
if (track) {
|
for (auto &pr : _track_map) {
|
||||||
checkTrackIfReady_l(track);
|
if (pr.second.second && pr.second.first->ready()) {
|
||||||
} else {
|
//Track由未就绪状态转换成就绪状态,我们就触发onTrackReady回调
|
||||||
for (auto &pr : _track_map) {
|
auto it = _track_ready_callback.find(pr.first);
|
||||||
checkTrackIfReady_l(pr.second);
|
if (it != _track_ready_callback.end()) {
|
||||||
|
it->second();
|
||||||
|
_track_ready_callback.erase(it);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -133,7 +129,7 @@ void MediaSink::checkTrackIfReady(const Track::Ptr &track){
|
|||||||
|
|
||||||
void MediaSink::addTrackCompleted(){
|
void MediaSink::addTrackCompleted(){
|
||||||
_max_track_size = _track_map.size();
|
_max_track_size = _track_map.size();
|
||||||
checkTrackIfReady(nullptr);
|
checkTrackIfReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaSink::emitAllTrackReady() {
|
void MediaSink::emitAllTrackReady() {
|
||||||
@ -147,8 +143,8 @@ void MediaSink::emitAllTrackReady() {
|
|||||||
_track_ready_callback.clear();
|
_track_ready_callback.clear();
|
||||||
//移除未准备好的Track
|
//移除未准备好的Track
|
||||||
for (auto it = _track_map.begin(); it != _track_map.end();) {
|
for (auto it = _track_map.begin(); it != _track_map.end();) {
|
||||||
if (!it->second->ready()) {
|
if (!it->second.second || !it->second.first->ready()) {
|
||||||
WarnL << "track not ready for a long time, ignored: " << it->second->getCodecName();
|
WarnL << "track not ready for a long time, ignored: " << it->second.first->getCodecName();
|
||||||
it = _track_map.erase(it);
|
it = _track_map.erase(it);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -184,13 +180,13 @@ void MediaSink::onAllTrackReady_l() {
|
|||||||
_all_track_ready = true;
|
_all_track_ready = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<Track::Ptr> MediaSink::getTracks(bool trackReady) const{
|
vector<Track::Ptr> MediaSink::getTracks(bool ready) const{
|
||||||
vector<Track::Ptr> ret;
|
vector<Track::Ptr> ret;
|
||||||
for (auto &pr : _track_map){
|
for (auto &pr : _track_map){
|
||||||
if(trackReady && !pr.second->ready()){
|
if(ready && !pr.second.first->ready()){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ret.emplace_back(pr.second);
|
ret.emplace_back(pr.second.first);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -256,7 +252,7 @@ bool MediaSink::addMuteAudioTrack() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto audio = std::make_shared<AACTrack>(makeAacConfig(MUTE_ADTS_DATA, ADTS_HEADER_LEN));
|
auto audio = std::make_shared<AACTrack>(makeAacConfig(MUTE_ADTS_DATA, ADTS_HEADER_LEN));
|
||||||
_track_map[audio->getTrackType()] = audio;
|
_track_map[audio->getTrackType()] = std::make_pair(audio, true);
|
||||||
audio->addDelegate(std::make_shared<FrameWriterInterfaceHelper>([this](const Frame::Ptr &frame) {
|
audio->addDelegate(std::make_shared<FrameWriterInterfaceHelper>([this](const Frame::Ptr &frame) {
|
||||||
return onTrackFrame(frame);
|
return onTrackFrame(frame);
|
||||||
}));
|
}));
|
||||||
|
@ -141,16 +141,15 @@ private:
|
|||||||
/**
|
/**
|
||||||
* 检查track是否准备完毕
|
* 检查track是否准备完毕
|
||||||
*/
|
*/
|
||||||
void checkTrackIfReady(const Track::Ptr &track);
|
void checkTrackIfReady();
|
||||||
void checkTrackIfReady_l(const Track::Ptr &track);
|
|
||||||
void onAllTrackReady_l();
|
void onAllTrackReady_l();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _all_track_ready = false;
|
bool _all_track_ready = false;
|
||||||
size_t _max_track_size = 2;
|
size_t _max_track_size = 2;
|
||||||
unordered_map<int,Track::Ptr> _track_map;
|
unordered_map<int, pair<Track::Ptr, bool/*got frame*/> > _track_map;
|
||||||
unordered_map<int,List<Frame::Ptr> > _frame_unread;
|
unordered_map<int, List<Frame::Ptr> > _frame_unread;
|
||||||
unordered_map<int,function<void()> > _track_ready_callback;
|
unordered_map<int, function<void()> > _track_ready_callback;
|
||||||
Ticker _ticker;
|
Ticker _ticker;
|
||||||
MuteAudioMaker::Ptr _mute_audio_maker;
|
MuteAudioMaker::Ptr _mute_audio_maker;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user