【音视频开发(七)】---图片或者图像文件(Mp4或H264裸流文件)读取解析类封装

该封装类主要用于读入图片或者h264裸流或者mp4裸流。主要提供以下功能:

  • 自动适配视频的宽高帧率;
  • 获取视频文件的帧数
  • 输出视频文件的H264裸流数据
  • 输出图片文件的图像数据

头文件:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <thread>
#include "Mp4v2Util.h"
#if _WIN32
#else
#include <unistd.h>
#endif

#if __ANDROID__
#include "VideoDecoder.h"
#endif

#if defined(BUILD_USE_AMediaExtractor)
#include <media/NdkMediaExtractor.h>
#endif

class FileParser {

public:

	FileParser();
	~FileParser();
	bool ParseFile();

#define FILE_TYPE_H264  1
#define FILE_TYPE_MJPEG 0
	void Init(int type, int w, int h, int fps, std::string filePath);
	void Uninit();
	int GetPacketFrameIndex();
	int GetFramePeriodUs();
	int GetPacketFrameNumber(){ return mFrameNumber; }
	void WaitParseThreadDone() { if(m_splitThread) m_splitThread->join(); }
	void SetFrameLimitNumber(int number) { mFrameLimit = number;} //设置最多测试帧数,最长不超过4000
	uint8_t* GetFilePacket(int *outSize);
	void ReleaseFilePacket(uint8_t** packet);
	int GetWidth() { return mWidth;}
	int GetHeight() {return mHeight;}
	int GetFps(){return mFps;}
	bool GetFilePacketDone(){ return mFrameCnt==0;}
	void Sleep();


	void GetVideoCsd01(uint8_t **csd0, int *csd0Size, uint8_t **csd1, int *csd1Size)
	{
		*csd0 = videoCsd0;
		*csd0Size = videoCsd0Size;
		*csd1 = videoCsd1;
		*csd1Size = videoCsd1Size;
	}


private:    
	int mType;
	uint8_t *mData;
	int  mDataSize;
	
	int  mFrameValidLen;
    int *mFrameOffset;
    int *mFrameSize;
    int mFrameCnt=0;
    int mFrameNumber=0;
	
	void SplitH264Packet(uint8_t *m_data, int size);
	uint8_t* GetH264Packet(int *outSize);

	
	//DmMpp dmmpp;
	int mWidth;
	int mHeight;
	int mFps;
	bool mOpened;
	
	int mFramePeriod;
	unsigned char *mDecData;
	
	std::thread* m_splitThread = NULL;
	int mFrameLimit; //限制最大的帧数

	string mFilePath;

	uint64_t mPktGenTs;

#if defined(BUILD_USE_AMediaExtractor)
	AMediaExtractor *videoExtractor;
#endif
	uint8_t *videoCsd0;
	int videoCsd0Size;

	uint8_t *videoCsd1;
	int videoCsd1Size;

	MP4FileHandle m_hMP4File = NULL;
	MP4TrackId m_videoTrackId = MP4_INVALID_TRACK_ID;
	uint32_t m_numSamples;
};

源文件:

#include <string.h>
#include <stdio.h>
#include <time.h>
#include "FileParser.h"
#include "H264SpsParser.h"
#include "Mp4v2Util.h"
#if defined(__ANDROID__)
#include <android/log.h>

#define DM_NATIVE_PRINT(format, ...)  __android_log_print(ANDROID_LOG_INFO, "gvtest", format, ##__VA_ARGS__)
#define DM_NATIVE_ERR_PRINT(format, ...)  __android_log_print(ANDROID_LOG_ERROR, "gvtest", format, ##__VA_ARGS__)
#define DM_NATIVE_DEBUG_PRINT(format, ...)  __android_log_print(ANDROID_LOG_DEBUG, "gvtest", format, ##__VA_ARGS__)
#else
#define  DM_NATIVE_PRINT  printf
#define  DM_NATIVE_ERR_PRINT  printf
#define  DM_NATIVE_DEBUG_PRINT  printf
#endif

FileParser::FileParser()
{
	mType = 0;
	mData = NULL;
	
	mFrameOffset = NULL;
	mFrameSize   = NULL;
	mFrameValidLen = 0;
	
	mDecData = NULL;
	
	mFrameLimit = 1500;
#if defined(BUILD_USE_AMediaExtractor)
	videoExtractor = NULL;
#endif

	videoCsd0 = NULL;
	videoCsd0Size = 0;
	videoCsd1 = NULL;
	videoCsd1Size = 0;
	m_hMP4File = 0;
}

FileParser::~FileParser()
{
	if (mData) free(mData);
	if (mFrameOffset) free(mFrameOffset);
	if (mFrameSize) free
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值