C++ 解析flv文件
来源:互联网 发布:虾米音乐vip 知乎 编辑:程序博客网 时间:2024/06/05 08:51
#include "stdafx.h"#include <windows.h>typedef struct FLV_HEADER{BYTE btSignature[3];BYTE btVersion;BYTE btFlags;BYTE btDataOffset[4];FLV_HEADER(){memset(this, 0, sizeof(FLV_HEADER));}};typedef struct TAG_HEADER{BYTE btPreviousTagSize[4];BYTE btTagType;BYTE btDataSize[3];BYTE btTimeStamp[3];BYTE btReserved;BYTE btStreamID[3];TAG_HEADER(){memset(this, 0, sizeof(TAG_HEADER));}};void printfTagAudioInfo(TAG_HEADER& _tag_header, int j, DWORD dwPreviousTagSize, DWORD dwDataSize, DWORD dwTimeStamp, BYTE btAudioFormat, BYTE btSamplingRate, BYTE btSamplingLen, BYTE btAudioType){printf("%d :%d ", j, dwPreviousTagSize);if (_tag_header.btTagType == 0x08){printf("Audio ");}if (_tag_header.btTagType == 0x09){printf("vedio ");}if (_tag_header.btTagType == 0x12){printf("srcipt ");}printf(":%d :%d ", dwDataSize, dwTimeStamp);switch (btAudioFormat){case 0:printf("Linear PCM, platform endian");break;case 1:printf("ADPCM");break;case 2:printf("MP3");break;case 3:printf("Linear PCM, little endian");break;case 4:printf("Nellymoser 16-kHz mono");break;case 5:printf("Nellymoser 8-kHz mono");break;case 6:printf("Nellymoser");break;case 7:printf("G.711 A-law logarithmic PCM");break;case 8:printf("G.711 mu-law logarithmic PCM");break;case 9:printf("reserved");break;case 10:printf("AAC");break;case 11:printf("Speex");break;case 14:printf("MP3 8-Khz");break;case 15:printf("Device-specific sound");break;default:printf("UNKNOWN");break;}printf(" ");switch (btSamplingRate){case 0:printf("5.5-kHz");break;case 1:printf("1-kHz");break;case 2:printf("22-kHz");break;case 3:printf("44-kHz");break;default:printf("UNKNOWN");break;}printf(" ");switch (btSamplingLen){case 0:printf("8Bit");break;case 1:printf("16Bit");break;default:printf("UNKNOWN");break;}printf(" ");switch (btAudioType){case 0:printf("Mono");break;case 1:printf("Stereo");break;default:printf("UNKNOWN");break;}printf("\r\n");}void printfTagVedioInfo(TAG_HEADER& _tag_header, int j, DWORD dwPreviousTagSize, DWORD dwDataSize, DWORD dwTimeStamp, BYTE btFrameType, BYTE btCodecID){printf("%d :%d ", j, dwPreviousTagSize);if (_tag_header.btTagType == 0x08){printf("Audio ");}if (_tag_header.btTagType == 0x09){printf("vedio ");}if (_tag_header.btTagType == 0x12){printf("srcipt ");}printf(":%d :%d ", dwDataSize, dwTimeStamp);switch (btFrameType){case 1:printf("key frame ");break;case 2:printf("inter frame");break;case 3:printf("disposable inter frame");break;case 4:printf("generated keyframe");break;case 5:printf("video info/command frame");break;default:printf("UNKNOWN");break;}printf(" ");switch (btCodecID){case 1:printf("JPEG (currently unused)");break;case 2:printf("Sorenson H.263");break;case 3:printf("Screen video");break;case 4:printf("On2 VP6");break;case 5:printf("On2 VP6 with alpha channel");break;case 6:printf("Screen video version 2");break;case 7:printf("AVC");break;default:printf("UNKNOWN");break;}printf("\r\n");}int _tmain(int argc, _TCHAR* argv[]){BYTE *btData = NULL;DWORD dwFileSize = 0;HANDLE hFile = CreateFile(L"E:\\video\\cuc_ieschool.flv", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE){dwFileSize = GetFileSize(hFile, NULL);btData = new BYTE[dwFileSize];memset(btData, 0, dwFileSize);DWORD dwRead = 0;ReadFile(hFile, btData, dwFileSize, &dwRead, NULL);CloseHandle(hFile);}FLV_HEADER _flv_header;memcpy(&_flv_header, btData, sizeof(FLV_HEADER));printf("%c %c %c 版本:%d 视频:%d 音频:%d\n", _flv_header.btSignature[0], _flv_header.btSignature[1], _flv_header.btSignature[2], _flv_header.btVersion, _flv_header.btFlags & 0x1, (_flv_header.btFlags >> 2) & 0x01);int j = 1;int i = sizeof(FLV_HEADER);while (i < dwFileSize){TAG_HEADER _tag_header;memcpy(&_tag_header, btData + i, sizeof(TAG_HEADER));DWORD dwPreviousTagSize = (_tag_header.btPreviousTagSize[0]<<24) | (_tag_header.btPreviousTagSize[1]<<16) | (_tag_header.btPreviousTagSize[2] <<8) | _tag_header.btPreviousTagSize[3];DWORD dwDataSize = (_tag_header.btDataSize[0]<<16) | (_tag_header.btDataSize[1]<<8) | _tag_header.btDataSize[2];DWORD dwTimeStamp = (_tag_header.btTimeStamp[0]<<16) | (_tag_header.btTimeStamp[1]<<8) | _tag_header.btTimeStamp[2];if (_tag_header.btTagType == 0x08){BYTE btInfo = btData[i + sizeof(TAG_HEADER)];//取得音频信息BYTE btAudioFormat = btInfo>>4;//音频格式.BYTE btSamplingRate = (btInfo>>2) & 0x03;//采样率0 = 5.5-kHz;1 = 11-kHz;2 = 22-kHz;3 = 44-kHz;对于AAC总是3BYTE btSamplingLen = (btInfo>>1) & 0x01;//采样长度.0 = snd8Bit;1 = snd16Bit;压缩过的音频都是16bitBYTE btAudioType = btInfo & 0x01;printfTagAudioInfo(_tag_header, j, dwPreviousTagSize, dwDataSize, dwTimeStamp, btAudioFormat, btSamplingRate, btSamplingLen, btAudioType);}if (_tag_header.btTagType == 0x09){BYTE btInfo = btData[i + sizeof(TAG_HEADER)];//取得视频信息BYTE btFrameType = btInfo >>4;//帧类型BYTE btCodecID = btInfo & 0x0f;printfTagVedioInfo(_tag_header, j, dwPreviousTagSize, dwDataSize, dwTimeStamp, btFrameType, btCodecID);}j++;i += sizeof(TAG_HEADER) + dwDataSize;//每个Tag由也是由两部分组成的:Tag Header和Tag Data。}if (btData){delete[] btData;btData = NULL;}return 0;}
http://download.csdn.net/detail/sz76211822/9716241
格式解析:http://blog.csdn.net/sz76211822/article/details/53760825
0 0
- Flv文件解析(c#)
- FLV文件结构解析
- FLV文件结构解析
- flv文件解析
- FLV文件解析
- FLV文件结构解析
- c#解析FLV文件
- C++ 解析flv文件
- (转)FLV文件结构解析
- (转)FLV文件结构解析
- flv文件的onMetaData部分解析
- SRS 代码分析【FLV文件解析】
- flv文件
- C语言实现AAC数据保存FLV文件
- FLV格式解析
- Php解析土豆flv
- FLV文件格式解析
- FLV文件格式解析
- extjs6.2中Ext.DomHelper类与Ext.XTemplate类初探
- 不同中奖概率的多奖包抽奖几种算法
- java之常用API(二)
- Oracle集群断电恢复实例(续)
- OpenAI:generative-models blogs
- C++ 解析flv文件
- C10K问题
- jQuery is not defined
- EOJ 1802 铁路调度
- 普通服务器与负载均衡服务器下的$_SERVER变量对比
- PopupWindow,DatePickerDialog,TimePickerDialog,ProgressDialog的使用
- Android 获取验证码使用倒计时
- 链表的引入和简单应用
- OSX和Linux设置环境变量的方法