Commit ac41a1e9 by ziyue

RtmpPlay: 兼容无metadata的rtmp流

parent e51a78eb
......@@ -13,6 +13,23 @@
namespace mediakit {
size_t RtmpDemuxer::trackCount(const AMFValue &metadata) {
size_t ret = 0;
metadata.object_for_each([&](const string &key, const AMFValue &val) {
if (key == "videocodecid") {
//找到视频
++ret;
return;
}
if (key == "audiocodecid") {
//找到音频
++ret;
return;
}
});
return ret;
}
bool RtmpDemuxer::loadMetaData(const AMFValue &val){
bool ret = false;
try {
......
......@@ -30,6 +30,8 @@ public:
RtmpDemuxer() = default;
~RtmpDemuxer() override = default;
static size_t trackCount(const AMFValue &metadata);
bool loadMetaData(const AMFValue &metadata);
/**
......
......@@ -63,6 +63,8 @@ public:
private:
//派生类回调函数
bool onCheckMeta(const AMFValue &val) override {
//无metadata或metadata中无track信息时,需要从数据包中获取track
_wait_track_ready = (*this)[Client::kWaitTrackReady].as<bool>() || RtmpDemuxer::trackCount(val) == 0;
onCheckMeta_l(val);
return true;
}
......@@ -79,7 +81,7 @@ private:
}
void onPlayResult(const SockException &ex) override {
if (!(*this)[Client::kWaitTrackReady].as<bool>() || ex) {
if (!_wait_track_ready || ex) {
Super::onPlayResult(ex);
return;
}
......@@ -88,7 +90,7 @@ private:
bool addTrack(const Track::Ptr &track) override { return true; }
void addTrackCompleted() override {
if ((*this)[Client::kWaitTrackReady].as<bool>()) {
if (_wait_track_ready) {
Super::onPlayResult(SockException(Err_success, "play success"));
}
}
......@@ -100,11 +102,12 @@ private:
_rtmp_src->setMetaData(val);
}
_demuxer = std::make_shared<RtmpDemuxer>();
_demuxer->setTrackListener(this, (*this)[Client::kWaitTrackReady].as<bool>());
_demuxer->setTrackListener(this, _wait_track_ready);
_demuxer->loadMetaData(val);
}
private:
bool _wait_track_ready = true;
RtmpDemuxer::Ptr _demuxer;
RtmpMediaSource::Ptr _rtmp_src;
};
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论