该封装类主要用于读入图片或者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