FlvParser.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #ifndef FLVPARSER_H
  2. #define FLVPARSER_H
  3. #include <stdint.h>
  4. #include <stdio.h>
  5. #include <cstdint>
  6. #include <iostream>
  7. class FlvParser {
  8. public:
  9. FlvParser();
  10. virtual ~FlvParser();
  11. int Parse(uint8_t *pBuf, int nBufLen, int &nUsedLen);
  12. int DumpH264(const std::string filepath);
  13. int DumpAAC(const std::string filepath);
  14. int DumpFlv(const std::string filepath);
  15. private:
  16. struct FlvHeader {
  17. int nVersion;
  18. int bHaveAudio;
  19. int bHaveVideo;
  20. int nHeaderSize;
  21. uint8_t *pFlvHeader;
  22. };
  23. typedef struct FlvHeader *pFlvHeader;
  24. struct TagHeader {
  25. int nTagType;
  26. int nDataSize;
  27. int nTimeSamp;
  28. int nTimeSampExt;
  29. int nStreamID;
  30. uint32_t nTotalTS;
  31. TagHeader()
  32. : nTagType(0),
  33. nDataSize(0),
  34. nTimeSamp(0),
  35. nTimeSampExt(0),
  36. nStreamID(0) {};
  37. ~TagHeader() {};
  38. };
  39. class Tag {
  40. public:
  41. Tag() : _pTagData(nullptr), _pTagHeader(nullptr), _pMedia(nullptr) {}
  42. void Init(TagHeader *pHeader, uint8_t *pBuf, int nLeftLen);
  43. TagHeader _header;
  44. uint8_t *_pTagHeader;
  45. uint8_t *_pTagData;
  46. uint8_t *_pMedia;
  47. int _nMediaLen;
  48. };
  49. class VideoTag : public Tag {
  50. public:
  51. VideoTag(TagHeader *pHeader, uint8_t *pBuf, int nLeftLen,
  52. FlvParser *pParser);
  53. int _nFrameType;
  54. int _nCodecType;
  55. int ParseH264Tag(FlvParser *pParser);
  56. int ParseH264Configuration(FlvParser *pParser, uint8_t *pTagData);
  57. int ParseNalu(FlvParser *pParser, uint8_t *pTagData);
  58. };
  59. class AudioTag : public Tag {
  60. public:
  61. AudioTag(TagHeader *pHeader, uint8_t *pBuf, int nLeftLen,
  62. FlvParser *pParser);
  63. int _nSoundType;
  64. int _nSoundRate;
  65. int _nSoundSize;
  66. int _nSoundFormat;
  67. static int _aacProfile;
  68. static int _sampleRateIndex;
  69. static int _channelConfig;
  70. int ParseAACTag(FlvParser *pParser);
  71. int ParseAudioSpecificConfig(FlvParser *pParser, uint8_t *pTagData);
  72. int ParseAACRaw(FlvParser *pParser, uint8_t *pTagData);
  73. };
  74. class MetaTag : public Tag {
  75. public:
  76. MetaTag(TagHeader *pHeader, uint8_t *pBuf, int nLeftLen,
  77. FlvParser *pParser);
  78. double hexStr2Double(const unsigned char *hex,
  79. const unsigned int length);
  80. int parseMeta(FlvParser *pParser);
  81. void printMeta();
  82. uint8_t m_amf1_type;
  83. uint32_t m_amf1_size;
  84. uint8_t m_amf2_type;
  85. unsigned char *m_meta;
  86. unsigned int m_length;
  87. double m_duration; // 视频时长
  88. double m_width; // 视频宽度
  89. double m_height; // 视频高度
  90. double m_videodatarate; // 视频码率(kbps)
  91. double m_framerate; // 视频帧率
  92. double m_videocodecid; // 视频编码格式编号
  93. double m_audiodatarate; // 音频码率
  94. double m_audiosamplerate; // 音频采样率
  95. double m_audiosamplesize; // 音频采样位数(通常是16bit)
  96. bool m_stereo; // 是否立体声(多声道)
  97. double m_audiocodecid; // 音频编码格式
  98. //
  99. std::string m_major_brand;
  100. std::string m_minor_version;
  101. std::string m_compatible_brand;
  102. std::string m_encoder;
  103. double m_filesize;
  104. };
  105. struct FlvStat {
  106. int nMetaNum;
  107. int nVideoNum;
  108. int nAudioNum;
  109. int nMaxTimeStamp;
  110. int nLengthSize;
  111. FlvStat()
  112. : nMetaNum(0),
  113. nVideoNum(0),
  114. nAudioNum(0),
  115. nMaxTimeStamp(0),
  116. nLengthSize(0) {}
  117. ~FlvStat() {};
  118. };
  119. void SetStat();
  120. void SetVideoStat(Tag *pTag);
  121. friend class Tag;
  122. public:
  123. static uint32_t SolveU32(uint8_t *pBuf) {
  124. return (pBuf[0] << 24 | pBuf[1] << 16 | pBuf[2] << 8 | pBuf[3]);
  125. }
  126. static uint32_t SolveU24(uint8_t *pBuf) {
  127. return (pBuf[0] << 16 | pBuf[1] << 8 | pBuf[0]);
  128. }
  129. static u_int32_t SolveU16(uint8_t *pBuf) {
  130. return (pBuf[0] << 8 | pBuf[1]);
  131. }
  132. static uint32_t SolveU8(uint8_t *pBuf) { return (pBuf[0]); }
  133. static void WriteU64(uint64_t &x, int length, int value) {
  134. uint64_t mask = 0xFFFFFFFFFFFFFFFF >> (64 - length);
  135. x = (x << length) | ((uint64_t)value & mask);
  136. }
  137. void PrintInfo();
  138. private:
  139. FlvParser::FlvHeader *CreateHeader(uint8_t *pBuf);
  140. void DestroyHeader(FlvHeader *pHeader);
  141. Tag *CreateTag(uint8_t *pBuf, int nLeftSize);
  142. void DestroyTag(Tag *pTag);
  143. private:
  144. FlvHeader *_pFlvHeader;
  145. std::vector<Tag *> _vpTag;
  146. FlvStat _sStat;
  147. int _nNaluUnitLength;
  148. };
  149. #endif // !FLVPARSER_H