MP4Reader.h 2.31 KB
Newer Older
xiongziliang committed
1
/*
xiongziliang committed
2
 * Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
xiongziliang committed
3
 *
4
 * This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
xiongziliang committed
5
 *
xiongziliang committed
6 7 8
 * Use of this source code is governed by MIT license that can be found in the
 * LICENSE file in the root of the source tree. All contributing project authors
 * may be found in the AUTHORS file in the root of the source tree.
xzl committed
9 10
 */

11 12
#ifndef SRC_MEDIAFILE_MEDIAREADER_H_
#define SRC_MEDIAFILE_MEDIAREADER_H_
xiongziliang committed
13 14
#ifdef ENABLE_MP4
#include "MP4Demuxer.h"
xiongziliang committed
15
#include "Common/MultiMediaSourceMuxer.h"
xiongziliang committed
16 17
using namespace toolkit;
namespace mediakit {
xzl committed
18

xiongziliang committed
19
class MP4Reader : public std::enable_shared_from_this<MP4Reader> ,public MediaSourceEvent{
xzl committed
20
public:
21
    typedef std::shared_ptr<MP4Reader> Ptr;
xiongziliang committed
22
    virtual ~MP4Reader() = default;
xiongziliang committed
23

24 25 26 27 28 29 30 31
    /**
     * 流化一个mp4文件,使之转换成RtspMediaSource和RtmpMediaSource
     * @param strVhost 虚拟主机
     * @param strApp 应用名
     * @param strId 流id
     * @param filePath 文件路径,如果为空则根据配置文件和上面参数自动生成,否则使用指定的文件
     */
    MP4Reader(const string &strVhost,const string &strApp, const string &strId,const string &filePath = "");
xiongziliang committed
32

33 34 35 36 37
    /**
     * 开始流化MP4文件,需要指出的是,MP4Reader对象一经过调用startReadMP4方法,它的强引用会自持有,
     * 意思是在文件流化结束之前或中断之前,MP4Reader对象是不会被销毁的(不管有没有被外部对象持有)
     */
    void startReadMP4();
38

39
private:
40 41 42 43
    //MediaSourceEvent override
    bool seekTo(MediaSource &sender,uint32_t ui32Stamp) override;
    bool close(MediaSource &sender,bool force) override;
    int totalReaderCount(MediaSource &sender) override;
44 45
    MediaOriginType getOriginType(MediaSource &sender) const override;
    string getOriginUrl(MediaSource &sender) const override;
xzl committed
46

xiongziliang committed
47
    bool readSample();
xiongziliang committed
48 49
    uint32_t getCurrentStamp();
    void setCurrentStamp(uint32_t ui32Stamp);
xiongziliang committed
50
    bool seekTo(uint32_t ui32Stamp);
51

xiongziliang committed
52
private:
53
    bool _have_video = false;
xiongziliang committed
54
    uint32_t _seek_to;
55
    string _file_path;
56
    recursive_mutex _mtx;
xiongziliang committed
57
    Ticker _seek_ticker;
58 59
    Timer::Ptr _timer;
    EventPoller::Ptr _poller;
xiongziliang committed
60
    MP4Demuxer::Ptr _demuxer;
61
    MultiMediaSourceMuxer::Ptr _mediaMuxer;
xzl committed
62 63
};

xiongziliang committed
64
} /* namespace mediakit */
xiongziliang committed
65
#endif //ENABLE_MP4
66
#endif /* SRC_MEDIAFILE_MEDIAREADER_H_ */