⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zzlfilereader.h

📁 mysee网络直播源代码Mysee Lite是Mysee独立研发的网络视频流媒体播放系统。在应有了P2P技术和一系列先进流媒体技术之后
💻 H
字号:
#pragma once

class CTVStreamSource;

class ZZLFileReader
{
public:
	ZZLFileReader();
	virtual ~ZZLFileReader(void);

	bool Init(const char* filename);
	void Uninit();

	STDMETHODIMP GetAvailable(LONGLONG& pEarliest,LONGLONG& pLatest);
	STDMETHODIMP GetDuration(LONGLONG& pDuration);
	STDMETHODIMP GetStopPosition(LONGLONG& pStop);
	//
	LONGLONG GetStartTime()
	{
		if(IsInited())
			return m_startTime;
		//
		return 0;
	}
	LONGLONG GetEndTime()
	{
		if(IsInited())
			return m_endTime;
		//
		return 0;
	}

    //尝试获得精确的结束时间。这是通过获得的sample计算的,所以越接近终结就越准确
    LONGLONG TryGetExplictEndTime(bool isAudio)
    {
        if(isAudio)
            return m_AudioEndTime;
        else
            return m_VideoEndTime;
    }

	// 获取媒体类型
	int GetMediaType(TVMEDIATYPESECTION&, BOOL isAudio);
	// 获取媒体数据
	int GetMediaData(PBYTE, BOOL isAudio);

	// 获取Sample. 
	// startTime != _I64_MAX的话,寻找startTime之后的第一个Sample,
	// 视频Sample的话还要满足是关键帧的条件
	P2P_RETURN_TYPE GetSample(
					SampleHeader& header,	// Sample头
					PBYTE& pData,			// Sample数据
					const UINT maxSize,		// Sample的最大值
					LONGLONG seekTime);		// Seek的目标时间

	// Seek到某个时间
	bool SeekTo(LONGLONG& seekTime, int pin = 3);	// 目标时间
    bool SeekVideoTo(LONGLONG& seekTime);
    bool SeekAudioTo(LONGLONG& seekTime);

private:
	P2P_RETURN_TYPE LoadSample(
		SampleHeader& header,	// Sample头
		PBYTE& sampleData,		// Sample数据
		UINT sampleOff,			// 已经读取的长度
		const UINT maxSize,		// Sample最大长度
		const bool isAudio);	// 视频还是音频

	// http下载线程
	static void __stdcall RunHttpDownload(ZZLFileReader*);

	// 读取文件头
	bool ReadFileHeader();

	// 如果headerSize已经已知,则说明已经读取过文件头,初始化成功了
	bool IsInited() {return m_iHeaderSize > 0;};

private:
	HANDLE m_hDownThread;		// 下载线程

	bool m_isStopped;			// 是否已经停止

	HANDLE m_hFile;		// 打开文件的句柄

	UINT m_iFileSize;			// 文件大小
	UINT m_iDownloadedSize;	// 对于HTTP的zzl,已经下载的长度
	UINT m_iHeaderSize;		// 文件头的长度

	TVMEDIATYPESECTION m_VideoType;
	TVMEDIATYPESECTION m_AudioType;
	//
	BYTE* m_pVideoFormat;
	BYTE* m_pAudioFormat;

	LONGLONG m_startTime;
	LONGLONG m_endTime;

    LONGLONG m_VideoEndTime;
    LONGLONG m_AudioEndTime;    //具有10^7精度的媒体时间
	//
	LONGLONG m_llSeekTo;

	BYTE A_currBlock[BLOCK_SIZE];
	BYTE V_currBlock[BLOCK_SIZE];
	//
	UINT A_currBlockID;
	UINT V_currBlockID;
	//
	UINT A_iLeftDataInCurrBlock;
	UINT V_iLeftDataInCurrBlock;

//	CTVStreamSource* m_pFilter;
	//
	CCritSec        m_pLock;

	const float FILE_VERSION;		// 支持的zzl文件的版本
	const float LIMIT_DOWN_SPEED;	// 限制下载速度的最大值
	const UINT MAX_HEADER_SIZE;		// zzl header的最大长度(用来检查zzl header是否已经下载)
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -