HI_S32 NETSDK_APICALL OnStreamCallback(HI_U32 u32Handle, /* 句柄 */ HI_U32 u32DataType, /* 数据类型,视频或音频数据或音视频复合数据 */ HI_U8* pu8Buffer, /* 数据包含帧头 */ HI_U32 u32Length, /* 数据长度 */ HI_VOID* pUserData /* 用户数据*/ ) { HI_S_AVFrame* pstruAV = HI_NULL; HI_S_SysHeader* pstruSys = HI_NULL; if (u32DataType == HI_NET_DEV_AV_DATA) { pstruAV = (HI_S_AVFrame*)pu8Buffer; if (pstruAV->u32AVFrameFlag == HI_NET_DEV_VIDEO_FRAME_FLAG) { if(fHlsHandle == 0 ) return 0; printf("Get Video Len:%d Timestamp:%d \n", pstruAV->u32AVFrameLen, pstruAV->u32AVFramePTS); unsigned int uiFrameType = 0; if (pstruAV->u32VFrameType == HI_NET_DEV_VIDEO_FRAME_I) { uiFrameType = TS_TYPE_PES_VIDEO_I_FRAME; } else { uiFrameType = TS_TYPE_PES_VIDEO_P_FRAME; } EasyHLS_VideoMux(fHlsHandle, uiFrameType, (unsigned char*)pu8Buffer+sizeof(HI_S_AVFrame), pstruAV->u32AVFrameLen, pstruAV->u32AVFramePTS*90, pstruAV->u32AVFramePTS*90, pstruAV->u32AVFramePTS*90); } else if (pstruAV->u32AVFrameFlag == HI_NET_DEV_AUDIO_FRAME_FLAG) { //printf("Audio %u PTS: %u \n", pstruAV->u32AVFrameLen, pstruAV->u32AVFramePTS); } } else if (u32DataType == HI_NET_DEV_SYS_DATA) { pstruSys = (HI_S_SysHeader*)pu8Buffer; printf("Video W:%u H:%u Audio: %u \n", pstruSys->struVHeader.u32Width, pstruSys->struVHeader.u32Height, pstruSys->struAHeader.u32Format); } return HI_SUCCESS; }
/* RTSPClient获取数据后回调给上层 */ int Easy_APICALL __RTSPClientCallBack( int _chid, int *_chPtr, int _frameType, char *_pBuf, RTSP_FRAME_INFO *_frameInfo) { if(NULL == fHLSHandle) return -1; if (_frameType == EASY_SDK_VIDEO_FRAME_FLAG) { unsigned long long llPTS = (_frameInfo->timestamp_sec%1000000)*1000 + _frameInfo->timestamp_usec/1000; printf("Get %s Video \tLen:%d \ttm:%u.%u \t%u\n",_frameInfo->type==EASY_SDK_VIDEO_FRAME_I?"I":"P", _frameInfo->length, _frameInfo->timestamp_sec, _frameInfo->timestamp_usec, llPTS); unsigned int uiFrameType = 0; if (_frameInfo->type == EASY_SDK_VIDEO_FRAME_I) { uiFrameType = TS_TYPE_PES_VIDEO_I_FRAME; } else if (_frameInfo->type == EASY_SDK_VIDEO_FRAME_P) { uiFrameType = TS_TYPE_PES_VIDEO_P_FRAME; } EasyHLS_VideoMux(fHLSHandle, uiFrameType, (unsigned char*)_pBuf, _frameInfo->length, llPTS*90, llPTS*90, llPTS*90); } else if (_frameType == EASY_SDK_AUDIO_FRAME_FLAG) { unsigned long long llPTS = (_frameInfo->timestamp_sec%1000000)*1000 + _frameInfo->timestamp_usec/1000; printf("Get Audio \tLen:%d \ttm:%u.%u \t%u\n", _frameInfo->length, _frameInfo->timestamp_sec, _frameInfo->timestamp_usec, llPTS); if (_frameInfo->codec == EASY_SDK_AUDIO_CODEC_AAC) { EasyHLS_AudioMux(fHLSHandle, (unsigned char*)_pBuf, _frameInfo->length, llPTS*90, llPTS*90); } } else if (_frameType == EASY_SDK_EVENT_FRAME_FLAG) { if (NULL == _pBuf && NULL == _frameInfo) { printf("Connecting:%s ...\n", ConfigRTSPURL); } else if (NULL!=_frameInfo && _frameInfo->type==0xF1) { printf("Lose Packet:%s ...\n", ConfigRTSPURL); } } return 0; }
int main(int argc, char * argv[]) { #ifdef _WIN32 extern char* optarg; #endif int ch; ProgName = argv[0]; PrintUsage(); while ((ch = getopt(argc,argv, "hc:C:v:t:d:n:u:U:")) != EOF) { switch(ch) { case 'h': PrintUsage(); return 0; break; case 'c': ConfigPlayListCapacity =atoi(optarg); break; case 'C': ConfigAllowCache =atoi(optarg); break; case 'v': ConfigM3U8Version =atoi(optarg); break; case 't': ConfigTargetDuration =atoi(optarg); break; case 'd': ConfigHLSRootDir =optarg; break; case 'n': ConfigHLSessionName =optarg; break; case 'U': ConfigHttpRootUrl =optarg; break; case '?': return 0; break; default: break; } } int buf_size = 1024*512; char *pbuf = (char *) malloc(buf_size); FILE *fES = NULL; int position = 0; int iFrameNo = 0; int timestamp = 0; fES = fopen("./EasyPusher.264", "rb"); if (NULL == fES) return 0; //´´½¨EasyHLS Session fHLSHandle = EasyHLS_Session_Create(ConfigPlayListCapacity, ConfigAllowCache, ConfigM3U8Version); char subDir[64] = { 0 }; sprintf(subDir,"%s/",ConfigHLSessionName); EasyHLS_ResetStreamCache(fHLSHandle, ConfigHLSRootDir, subDir, ConfigHLSessionName, ConfigTargetDuration); printf("HLS URL:%s%s/%s.m3u8\n", ConfigHLSRootDir, ConfigHLSessionName, ConfigHLSessionName); while (1) { int nReadBytes = fread(pbuf+position, 1, 1, fES); if (nReadBytes < 1) { if (feof(fES)) { position = 0; fseek(fES, 0, SEEK_SET); continue; } break; } position ++; if (position > 5) { unsigned char naltype = ( (unsigned char)pbuf[position-1] & 0x1F); if ( (unsigned char)pbuf[position-5]== 0x00 && (unsigned char)pbuf[position-4]== 0x00 && (unsigned char)pbuf[position-3] == 0x00 && (unsigned char)pbuf[position-2] == 0x01 && (naltype == 0x07 || naltype == 0x01 ) ) { int framesize = position - 5; naltype = (unsigned char)pbuf[4] & 0x1F; timestamp += 1000/25; unsigned int uiFrameType = 0; if (naltype == 0x07) { uiFrameType = TS_TYPE_PES_VIDEO_I_FRAME; } else { uiFrameType = TS_TYPE_PES_VIDEO_P_FRAME; } EasyHLS_VideoMux(fHLSHandle, uiFrameType, (unsigned char*)pbuf, framesize, timestamp*90, timestamp*90, timestamp*90); #ifndef _WIN32 usleep(30*1000); #else Sleep(30); #endif memmove(pbuf, pbuf+position-5, 5); position = 5; iFrameNo ++; } } } printf("Press Enter exit...\n"); getchar(); EasyHLS_Session_Release(fHLSHandle); fHLSHandle = 0; free(pbuf); return 0; }