diff --git a/src/Record/MP4Demuxer.cpp b/src/Record/MP4Demuxer.cpp index 4d6800d2..24657b99 100644 --- a/src/Record/MP4Demuxer.cpp +++ b/src/Record/MP4Demuxer.cpp @@ -63,6 +63,8 @@ void MP4Demuxer::onVideoTrack(uint32_t track, uint8_t object, int width, int hei } video->setIndex(track); _tracks.emplace(track, video); + if (_on_track_callback) + _on_track_callback(video); if (extra && bytes) { video->setExtraData((uint8_t *)extra, bytes); } @@ -75,6 +77,8 @@ void MP4Demuxer::onAudioTrack(uint32_t track, uint8_t object, int channel_count, } audio->setIndex(track); _tracks.emplace(track, audio); + if (_on_track_callback) + _on_track_callback(audio); if (extra && bytes) { audio->setExtraData((uint8_t *)extra, bytes); } @@ -100,7 +104,10 @@ struct Context { Frame::Ptr MP4Demuxer::readFrame(bool &keyFrame, bool &eof) { keyFrame = false; eof = false; - + if (!_mov_reader) { + eof = true; + return nullptr; + } static mov_reader_onread2 mov_onalloc = [](void *param, uint32_t track_id, size_t bytes, int64_t pts, int64_t dts, int flags) -> void * { Context *ctx = (Context *) param; ctx->pts = pts; diff --git a/src/Record/MP4Demuxer.h b/src/Record/MP4Demuxer.h index 889f91fc..c8b34c7b 100644 --- a/src/Record/MP4Demuxer.h +++ b/src/Record/MP4Demuxer.h @@ -20,25 +20,25 @@ class MP4Demuxer : public TrackSource { public: using Ptr = std::shared_ptr; - ~MP4Demuxer() override; + virtual ~MP4Demuxer() override; /** * 打开文件 * @param file mp4文件路径 */ - void openMP4(const std::string &file); + virtual void openMP4(const std::string &file); /** * @brief 关闭 mp4 文件 */ - void closeMP4(); + virtual void closeMP4(); /** * 移动时间轴至某处 * @param stamp_ms 预期的时间轴位置,单位毫秒 * @return 时间轴位置 */ - int64_t seekTo(int64_t stamp_ms); + virtual int64_t seekTo(int64_t stamp_ms); /** * 读取一帧数据 @@ -46,20 +46,22 @@ public: * @param eof 是否文件读取完毕 * @return 帧数据,可能为空 */ - Frame::Ptr readFrame(bool &keyFrame, bool &eof); + virtual Frame::Ptr readFrame(bool &keyFrame, bool &eof); /** * 获取所有Track信息 * @param trackReady 是否要求track为就绪状态 * @return 所有Track */ - std::vector getTracks(bool trackReady) const override; + virtual std::vector getTracks(bool trackReady) const override; /** * 获取文件长度 * @return 文件长度,单位毫秒 */ - uint64_t getDurationMS() const; + virtual uint64_t getDurationMS() const; + + virtual void setOnTrack(const std::function &callback) { _on_track_callback = callback; } private: int getAllTracks(); @@ -73,6 +75,7 @@ private: uint64_t _duration_ms = 0; std::unordered_map _tracks; toolkit::ResourcePool _buffer_pool; + std::function _on_track_callback; };