From 278591d5ee88a2d2bdfeed052be040fc0aa3bea3 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 3 Apr 2020 21:39:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DMP4=E7=82=B9=E6=92=AD?= =?UTF-8?q?=E7=9B=B8=E5=85=B3bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Record/MP4Demuxer.cpp | 12 ++++-------- src/Record/MP4Demuxer.h | 2 +- src/Record/MP4Reader.cpp | 14 ++++++++++---- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/Record/MP4Demuxer.cpp b/src/Record/MP4Demuxer.cpp index 352ff876..20dec149 100644 --- a/src/Record/MP4Demuxer.cpp +++ b/src/Record/MP4Demuxer.cpp @@ -158,7 +158,7 @@ struct Context{ BufferRaw::Ptr buffer; }; -Frame::Ptr MP4Demuxer::readFrame(bool seekKeyFrame, bool *eof) { +Frame::Ptr MP4Demuxer::readFrame(bool &keyFrame, bool &eof) { static mov_reader_onread mov_reader_onread = [](void *param, uint32_t track_id, const void *buffer, size_t bytes, int64_t pts, int64_t dts, int flags) { Context *ctx = (Context *) param; ctx->pts = pts; @@ -179,23 +179,19 @@ Frame::Ptr MP4Demuxer::readFrame(bool seekKeyFrame, bool *eof) { auto ret = mov_reader_read2(_mov_reader.get(), mov_onalloc, mov_reader_onread, &ctx); switch (ret) { case 0 : { - if(eof){ - *eof = true; - } + eof = true; WarnL << "读取mp4文件完毕"; } break; case 1 : { - if (seekKeyFrame && !(ctx.flags & MOV_AV_FLAG_KEYFREAME)) { - //请求key帧,但是这个帧不是 - return nullptr; - } + keyFrame = ctx.flags & MOV_AV_FLAG_KEYFREAME; return makeFrame(ctx.track_id,ctx.buffer, ctx.pts, ctx.dts); } break; default: + eof = true; WarnL << "读取mp4文件数据失败:" << ret; break; } diff --git a/src/Record/MP4Demuxer.h b/src/Record/MP4Demuxer.h index e9159142..e5258379 100644 --- a/src/Record/MP4Demuxer.h +++ b/src/Record/MP4Demuxer.h @@ -38,7 +38,7 @@ public: MP4Demuxer(const char *file); ~MP4Demuxer() override; int64_t seekTo(int64_t stamp_ms); - Frame::Ptr readFrame(bool seekKeyFrame = false, bool *eof = nullptr); + Frame::Ptr readFrame(bool &keyFrame, bool &eof); vector getTracks(bool trackReady) const override ; uint64_t getDurationMS() const; private: diff --git a/src/Record/MP4Reader.cpp b/src/Record/MP4Reader.cpp index 9111a7e0..410d119e 100644 --- a/src/Record/MP4Reader.cpp +++ b/src/Record/MP4Reader.cpp @@ -47,7 +47,11 @@ MP4Reader::MP4Reader(const string &strVhost,const string &strApp, const string & _demuxer = std::make_shared(strFileName.data()); _mediaMuxer.reset(new MultiMediaSourceMuxer(strVhost, strApp, strId, _demuxer->getDurationMS() / 1000.0, true, true, false, false)); - for(auto &track : _demuxer->getTracks(false)){ + auto tracks = _demuxer->getTracks(false); + if(tracks.empty()){ + throw std::runtime_error(StrPrinter << "该mp4文件没有有效的track:" << strFileName); + } + for(auto &track : tracks){ _mediaMuxer->addTrack(track); if(track->getTrackType() == TrackVideo){ _have_video = true; @@ -59,8 +63,9 @@ MP4Reader::MP4Reader(const string &strVhost,const string &strApp, const string & bool MP4Reader::readSample() { bool eof = false; + bool keyFrame = false; while (!eof) { - auto frame = _demuxer->readFrame(false, &eof); + auto frame = _demuxer->readFrame(keyFrame, eof); if (!frame) { break; } @@ -139,12 +144,13 @@ bool MP4Reader::seekTo(uint32_t ui32Stamp){ } //搜索到下一帧关键帧 bool eof = false; + bool keyFrame = false; while (!eof) { - auto frame = _demuxer->readFrame(false, &eof); + auto frame = _demuxer->readFrame(keyFrame, eof); if(!frame){ break; } - if(frame->keyFrame() || frame->configFrame()){ + if(keyFrame || frame->keyFrame() || frame->configFrame()){ //定位到key帧 _mediaMuxer->inputFrame(frame); setNextStampForStop(frame->dts());