添加track在创建后input frame前回调,避免track订阅错过配置帧数据,MP4Demuxer接口添加virtual可派生扩展
This commit is contained in:
parent
584944d777
commit
6b1b9f3e35
|
|
@ -63,6 +63,8 @@ void MP4Demuxer::onVideoTrack(uint32_t track, uint8_t object, int width, int hei
|
||||||
}
|
}
|
||||||
video->setIndex(track);
|
video->setIndex(track);
|
||||||
_tracks.emplace(track, video);
|
_tracks.emplace(track, video);
|
||||||
|
if (_on_track_callback)
|
||||||
|
_on_track_callback(video);
|
||||||
if (extra && bytes) {
|
if (extra && bytes) {
|
||||||
video->setExtraData((uint8_t *)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);
|
audio->setIndex(track);
|
||||||
_tracks.emplace(track, audio);
|
_tracks.emplace(track, audio);
|
||||||
|
if (_on_track_callback)
|
||||||
|
_on_track_callback(audio);
|
||||||
if (extra && bytes) {
|
if (extra && bytes) {
|
||||||
audio->setExtraData((uint8_t *)extra, bytes);
|
audio->setExtraData((uint8_t *)extra, bytes);
|
||||||
}
|
}
|
||||||
|
|
@ -100,7 +104,10 @@ struct Context {
|
||||||
Frame::Ptr MP4Demuxer::readFrame(bool &keyFrame, bool &eof) {
|
Frame::Ptr MP4Demuxer::readFrame(bool &keyFrame, bool &eof) {
|
||||||
keyFrame = false;
|
keyFrame = false;
|
||||||
eof = 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 * {
|
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;
|
Context *ctx = (Context *) param;
|
||||||
ctx->pts = pts;
|
ctx->pts = pts;
|
||||||
|
|
|
||||||
|
|
@ -20,25 +20,25 @@ class MP4Demuxer : public TrackSource {
|
||||||
public:
|
public:
|
||||||
using Ptr = std::shared_ptr<MP4Demuxer>;
|
using Ptr = std::shared_ptr<MP4Demuxer>;
|
||||||
|
|
||||||
~MP4Demuxer() override;
|
virtual ~MP4Demuxer() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 打开文件
|
* 打开文件
|
||||||
* @param file mp4文件路径
|
* @param file mp4文件路径
|
||||||
*/
|
*/
|
||||||
void openMP4(const std::string &file);
|
virtual void openMP4(const std::string &file);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 关闭 mp4 文件
|
* @brief 关闭 mp4 文件
|
||||||
*/
|
*/
|
||||||
void closeMP4();
|
virtual void closeMP4();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 移动时间轴至某处
|
* 移动时间轴至某处
|
||||||
* @param stamp_ms 预期的时间轴位置,单位毫秒
|
* @param stamp_ms 预期的时间轴位置,单位毫秒
|
||||||
* @return 时间轴位置
|
* @return 时间轴位置
|
||||||
*/
|
*/
|
||||||
int64_t seekTo(int64_t stamp_ms);
|
virtual int64_t seekTo(int64_t stamp_ms);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一帧数据
|
* 读取一帧数据
|
||||||
|
|
@ -46,20 +46,22 @@ public:
|
||||||
* @param eof 是否文件读取完毕
|
* @param eof 是否文件读取完毕
|
||||||
* @return 帧数据,可能为空
|
* @return 帧数据,可能为空
|
||||||
*/
|
*/
|
||||||
Frame::Ptr readFrame(bool &keyFrame, bool &eof);
|
virtual Frame::Ptr readFrame(bool &keyFrame, bool &eof);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取所有Track信息
|
* 获取所有Track信息
|
||||||
* @param trackReady 是否要求track为就绪状态
|
* @param trackReady 是否要求track为就绪状态
|
||||||
* @return 所有Track
|
* @return 所有Track
|
||||||
*/
|
*/
|
||||||
std::vector<Track::Ptr> getTracks(bool trackReady) const override;
|
virtual std::vector<Track::Ptr> getTracks(bool trackReady) const override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取文件长度
|
* 获取文件长度
|
||||||
* @return 文件长度,单位毫秒
|
* @return 文件长度,单位毫秒
|
||||||
*/
|
*/
|
||||||
uint64_t getDurationMS() const;
|
virtual uint64_t getDurationMS() const;
|
||||||
|
|
||||||
|
virtual void setOnTrack(const std::function<void(Track::Ptr &track)> &callback) { _on_track_callback = callback; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int getAllTracks();
|
int getAllTracks();
|
||||||
|
|
@ -73,6 +75,7 @@ private:
|
||||||
uint64_t _duration_ms = 0;
|
uint64_t _duration_ms = 0;
|
||||||
std::unordered_map<int, Track::Ptr> _tracks;
|
std::unordered_map<int, Track::Ptr> _tracks;
|
||||||
toolkit::ResourcePool<toolkit::BufferRaw> _buffer_pool;
|
toolkit::ResourcePool<toolkit::BufferRaw> _buffer_pool;
|
||||||
|
std::function<void(Track::Ptr &track)> _on_track_callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue