当前位置: 首页 > news >正文

建设网站需要哪些认证cms 做网站模板

建设网站需要哪些认证,cms 做网站模板,wordpress文章导入公众号,什么是外包公司?文章目录 程序功能#xff1a;函数调用流程#xff1a;部分FlvParse.h部分FlvParse.cpp 程序功能#xff1a; 解析flv文件#xff0c;重写一个h264文件#xff0c;如输入movie.flv , 输出movie.h264 (只有视频#xff0c;没有声音) 函数调用流程#xff1a; 1 Proce… 文章目录 程序功能函数调用流程部分FlvParse.h部分FlvParse.cpp 程序功能 解析flv文件重写一个h264文件如输入movie.flv , 输出movie.h264 (只有视频没有声音) 函数调用流程 1 Process() 处理函数1 读文件 2 解析flv 3 将flv的视频数据输出到.h264文件2 Parse() 解析flv 文件,入口函数 DumpH264() 生成h264文件3 CreateFlvHeader() 解析 flv head4 CreateTag() 解析视频标签tag入口函数5 CVideoTag() 创建video tag6 ParseH264Tag() 解析 vido tag7 ParseH264Configuration() 解析配置信息8 ParseNalu() 解析nalu数据9 DumpH264() 生成h264文件通过_pMedia写入部分FlvParse.h class CFlvParser { public:CFlvParser();virtual ~CFlvParser();int Parse(uint8_t *pBuf, int nBufSize, int nUsedLen);int PrintInfo();int DumpH264(const std::string path);int DumpAAC(const std::string path);int DumpFlv(const std::string path);private:// FLV头typedef struct FlvHeader_s{int nVersion; // 版本int bHaveVideo; // 是否包含视频int bHaveAudio; // 是否包含音频int nHeadSize; // FLV头部长度/*** 指向存放FLV头部的buffer** 上面的三个成员指明了FLV头部的信息是从FLV的头部中“翻译”得到的** 真实的FLV头部是一个二进制比特串放在一个buffer中由pFlvHeader成员指明*/uint8_t *pFlvHeader;} FlvHeader;// Tag头部struct TagHeader{int nType; // 类型int nDataSize; // 标签body的大小int nTimeStamp; // 时间戳int nTSEx; // 时间戳的扩展字节int nStreamID; // 流的ID总是0uint32_t nTotalTS; // 完整的时间戳nTimeStamp和nTSEx拼装TagHeader() : nType(0), nDataSize(0), nTimeStamp(0), nTSEx(0), nStreamID(0), nTotalTS(0) {}~TagHeader() {}};class Tag{public:Tag() : _pTagHeader(NULL), _pTagData(NULL), _pMedia(NULL), _nMediaLen(0) {}void Init(TagHeader *pHeader, uint8_t *pBuf, int nLeftLen);TagHeader _header;uint8_t *_pTagHeader; // 指向标签头部uint8_t *_pTagData; // 指向标签body原始的tag data数据uint8_t *_pMedia; // 指向标签的元数据改造后的数据int _nMediaLen; // 数据长度};class CVideoTag : public Tag{public:/*** brief CVideoTag* param pHeader* param pBuf 整个tag的起始地址* param nLeftLen* param pParser*/CVideoTag(TagHeader *pHeader, uint8_t *pBuf, int nLeftLen, CFlvParser *pParser);int _nFrameType; // 帧类型int _nCodecID; // 视频编解码类型int ParseH264Tag(CFlvParser *pParser);int ParseH264Configuration(CFlvParser *pParser, uint8_t *pTagData);int ParseNalu(CFlvParser *pParser, uint8_t *pTagData);};friend class Tag;private:FlvHeader *CreateFlvHeader(uint8_t *pBuf);Tag *CreateTag(uint8_t *pBuf, int nLeftLen);private:FlvHeader* _pFlvHeader;vectorTag * _vpTag; 部分FlvParse.cpp int main() {fstream fin;fin.open(argv[1], ios_base::in | ios_base::binary); // 打开文件if (!fin)return 0;Process(fin); //输出文件fin.close();return 1; }// 循环读文件 void Process(fstream fin) {CFlvParser parser;int nBufSize 2*1024 * 1024;int nFlvPos 0;uint8_t *pBuf, *pBak;pBuf new uint8_t[nBufSize];pBak new uint8_t[nBufSize];while (1){int nReadNum 0;int nUsedLen 0;fin.read((char *)pBuf nFlvPos, nBufSize - nFlvPos); // 循环读取数据读到内存当中nReadNum fin.gcount();if (nReadNum 0)break;nFlvPos nReadNum;parser.Parse(pBuf, nFlvPos, nUsedLen);if (nFlvPos ! nUsedLen){memcpy(pBak, pBuf nUsedLen, nFlvPos - nUsedLen);memcpy(pBuf, pBak, nFlvPos - nUsedLen);}nFlvPos - nUsedLen;}parser.PrintInfo();parser.DumpH264(parser.264);delete []pBak;delete []pBuf; } // 解析 int CFlvParser::Parse(uint8_t *pBuf, int nBufSize, int nUsedLen){CheckBuffer(9); // 检测9字节的head// 检测headerwhile(1) {CheckBuffer(15); // nPrevSize(4字节) Tag header(11字节)}Tag *pTag CreateTag(pBuf nOffset, nBufSize-nOffset); //创建头部if (pTag NULL){nOffset - 4;break;}nOffset (11 pTag-_header.nDataSize);_vpTag.push_back(pTag); // vectorTag * _vpTag; }// 写flv header CFlvParser::FlvHeader *CFlvParser::CreateFlvHeader(uint8_t *pBuf) {pHeader-pFlvHeader new uint8_t[pHeader-nHeadSize];memcpy(pHeader-pFlvHeader, pBuf, pHeader-nHeadSize); }// 写tag 头部 CFlvParser::Tag *CFlvParser::CreateTag(uint8_t *pBuf, int nLeftLen) {TagHeader header;header.nType ShowU8(pBuf0); // 类型header.nDataSize ShowU24(pBuf 1); // 1 为 偏移 nType的字节数header.nTimeStamp ShowU24(pBuf 4); // 4 为 偏移nType和 nDataSize的 字数之和switch (header.nType) {case 0x09: // 视频类型的TagpTag new CVideoTag(header, pBuf, nLeftLen, this);break;case 0x08: // 音频类型的TagpTag new CAudioTag(header, pBuf, nLeftLen, this);break;case 0x12: // script TagpTag new CMetaDataTag(header, pBuf, nLeftLen, this);break;default: // script类型的TagpTag new Tag();pTag-Init(header, pBuf, nLeftLen);} }// 之后解析tag的类型 :video aac script // 构造函数 CFlvParser::CVideoTag::CVideoTag(TagHeader *pHeader, uint8_t *pBuf, int nLeftLen, CFlvParser *pParser) {// 初始化Init(pHeader, pBuf, nLeftLen); uint8_t *pd _pTagData;_nFrameType (pd[0] 0xf0) 4; // 帧类型_nCodecID pd[0] 0x0f; // 视频编码类型// 开始解析if (_header.nType 0x09 _nCodecID 7) //类型为7进行解析{ParseH264Tag(pParser);} }int CFlvParser::CVideoTag::ParseH264Tag(CFlvParser *pParser) {uint8_t *pd _pTagData;/*** 数据包的类型** 视频数据被压缩之后被打包成数据包在网上传输** 有两种类型的数据包视频信息包sps、pps等和视频数据包视频的压缩数据*/int nAVCPacketType pd[1];int nCompositionTime CFlvParser::ShowU24(pd 2);// 如果是视频配置信息if (nAVCPacketType 0) // AVC sequence header{ParseH264Configuration(pParser, pd);}// 如果是视频数据else if (nAVCPacketType 1) // AVC NALU{ParseNalu(pParser, pd);}return 1; } int CFlvParser::CVideoTag::ParseH264Configuration(CFlvParser *pParser, uint8_t *pTagData) {uint8_t *pd pTagData;// 跨过 Tag Data的VIDEODATA(1字节) AVCVIDEOPACKET(AVCPacketType(1字节) 和CompositionTime(3字节) 4字节)// 总共跨过5个字节// NalUnit长度表示占用的字节pParser-_nNalUnitLength (pd[9] 0x03) 1; // lengthSizeMinusOne 9 5 4 0x03只占两个字节int sps_size, pps_size;// sps序列参数集的长度sps_size CFlvParser::ShowU16(pd 11); // sequenceParameterSetLength 11 5 6// pps图像参数集的长度pps_size CFlvParser::ShowU16(pd 11 (2 sps_size) 1); // pictureParameterSetLength// 元数据的长度_nMediaLen 4 sps_size 4 pps_size; // 添加start code_pMedia new uint8_t[_nMediaLen];// 保存元数据memcpy(_pMedia, nH264StartCode, 4);memcpy(_pMedia 4, pd 11 2, sps_size);memcpy(_pMedia 4 sps_size, nH264StartCode, 4);memcpy(_pMedia 4 sps_size 4, pd 11 2 sps_size 2 1, pps_size);return 1; }int CFlvParser::CVideoTag::ParseNalu(CFlvParser *pParser, uint8_t *pTagData) {uint8_t *pd pTagData;int nOffset 0;_pMedia new uint8_t[_header.nDataSize10];_nMediaLen 0;// 跨过 Tag Data的VIDEODATA(1字节) AVCVIDEOPACKET(AVCPacketType和CompositionTime 4字节)nOffset 5; // 总共跨过5个字节 132 - 5 127 _nNalUnitLength(4字节) NALU(123字节)// startcode(4字节) NALU(123字节) 127while (1){// 如果解析完了一个Tag那么就跳出循环if (nOffset _header.nDataSize)break;// 计算NALU视频数据被包装成NALU在网上传输的长度,// 一个tag可能包含多个nalu, 所以每个nalu前面有NalUnitLength字节表示每个nalu的长度// video tag data 如果有两个nalu 一个长度是300字节一个500字节// 0x00 0x00 0x01 0x2c (300) ------nalu--------0x00 0x00 0x01 0xF4(500)// _pMeida 先拷贝startcode再拷贝nalu int nNaluLen;switch (pParser-_nNalUnitLength){case 4:nNaluLen CFlvParser::ShowU32(pd nOffset);break;case 3:nNaluLen CFlvParser::ShowU24(pd nOffset);break;case 2:nNaluLen CFlvParser::ShowU16(pd nOffset);break;default:nNaluLen CFlvParser::ShowU8(pd nOffset);}// 获取NALU的起始码memcpy(_pMedia _nMediaLen, nH264StartCode, 4);// 复制NALU的数据memcpy(_pMedia _nMediaLen 4, pd nOffset pParser-_nNalUnitLength, nNaluLen);// 解析NALU // pParser-_vjj-Process(_pMedia_nMediaLen, 4nNaluLen, _header.nTotalTS);_nMediaLen (4 nNaluLen); // 4 startcodenOffset (pParser-_nNalUnitLength nNaluLen);}return 1; }// 写h264数据 int CFlvParser::DumpH264(const std::string path) {fstream f;f.open(path.c_str(), ios_base::out|ios_base::binary);vectorTag *::iterator it_tag;for (it_tag _vpTag.begin(); it_tag ! _vpTag.end(); it_tag){if ((*it_tag)-_header.nType ! 0x09)continue;f.write((char *)(*it_tag)-_pMedia, (*it_tag)-_nMediaLen);}f.close();return 1; }
http://www.w-s-a.com/news/364062/

相关文章:

  • 太原网站域名开发什么是网页界面设计
  • 做产品类网站有哪些做一百度网站吗
  • 在线视频网站建设国外最新创意产品网站有哪些方面
  • 在一个网站下建设多个子网站宣传册画册设计公司
  • 潍坊网站建设公司排名网站建设预付
  • 手机和wap网站建设crm客户管理系统模板
  • 微商城网站建设市场唐山地方志网站建设
  • 想象力做网站网站301跳转代码
  • 做暧暧小视频有声音的网站太原网页搜索排名提升
  • 公众号链接的手机网站怎么做动易2006学校网站
  • 网站网上推广网站推他网站
  • 如何进行网站建设分析济宁做企业网站
  • 长沙网站seo技巧wordpress插件头像
  • appserv做网站教程微信信息流广告案例
  • 前端网站开发兼职长春火车站地下停车场收费标准
  • 苏州推广网站建设概况大连公交app
  • 移动互联网站开发与维护招聘网站建设计入什么费用
  • 郑州营销型网站建设erp系统有什么用
  • 公司网站开发费怎么入账投放广告网站
  • 企业网站开发文献综述加盟网网站建设策划书
  • 最便宜的网站空间网站建设和app开发
  • 承装承修承试材料在哪个网站做如何用虚拟主机建设网站
  • 如何建一个外贸网站网页设计零基础学习课程
  • 营销型外贸网站广州昆明建设网站制作
  • 网页制作网站素材项目建设全过程管理
  • 正能量网站下载柬埔寨网赌网站开发
  • 如何免费建设公司网站广州传业建设有限公司网站
  • 织梦做的网站快照被攻击张家口网站建设公司
  • 平顶山公司网站建设南昌网站seo多少钱
  • 网站开发要先买服务器吗建设婚恋网站用什么搭建