mp4v2 写mp4 java_MP4v2 基本使用(二)

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 #include

9

10 unsigned char sps[64],pps[64];11 int spslen = 0,ppslen = 0;12

13 int get264stream(MP4FileHandle oMp4File,int VTrackId,inttotalFrame)14 {15 if(!oMp4File) return -1;16 char NAL[5] = {0x00,0x00,0x00,0x01};17 unsigned char *pData =NULL;18 unsigned int nSize = 0;19 MP4Timestamp pStartTime;20 MP4Duration pDuration;21 MP4Duration pRenderingOffset;22 bool pIsSyncSample = 0;23

24 int nReadIndex = 0;25 FILE *pFile =NULL;26 pFile = fopen("out.h264","wb");27

28 while(nReadIndex

32 MP4ReadSample(oMp4File,VTrackId,nReadIndex,&pData,&nSize,&pStartTime,&pDuration,&pRenderingOffset,&pIsSyncSample);33

34 //IDR֡ 帧,写入sps pps先

35 if(pIsSyncSample)36 {37 fwrite(NAL,4,1,pFile);38 fwrite(sps,spslen,1,pFile);39

40 fwrite(NAL,4,1,pFile);41 fwrite(pps,ppslen,1,pFile);42

43 }44 //264frame

45 if(pData && nSize > 4)46 {47 //标准的264帧,前面几个字节就是frame的长度.48 //需要替换为标准的264 nal 头.

49 pData[0] = 0x00;50 pData[1] = 0x00;51 pData[2] = 0x00;52 pData[3] = 0x01;53 fwrite(pData,nSize,1,pFile);54 }55

56 //如果传入MP4ReadSample的视频pData是null57 //它内部就会new 一个内存58 //如果传入的是已知的内存区域,59 //则需要保证空间bigger then max frames size.

60 free(pData);61 pData =NULL;62 }63 fflush(pFile);64 fclose(pFile);65

66 return 0;67 }68 int openmp4file(char *sMp4file)69 {70 MP4FileHandle oMp4File;71 inti;72

73 //unsigned int oStreamDuration;

74 unsigned intoFrameCount;75

76 oMp4File =MP4Read(sMp4file);77 int videoindex = -1,audioindex = -1;78 uint32_t numSamples;79 //uint32_t timescale;80 //uint64_t duration;

81

82 if (!oMp4File)83 {84 printf("Read error....%s\r\n",sMp4file);85 return -1;86 }87

88 MP4TrackId trackId =MP4_INVALID_TRACK_ID;89 uint32_t numTracks = MP4GetNumberOfTracks(oMp4File,NULL,0);90 printf("numTracks:%d\n",numTracks);91

92 for (i = 0; i < numTracks; i++)93 {94 trackId = MP4FindTrackId(oMp4File, i,NULL,0);95 const char* trackType =MP4GetTrackType(oMp4File, trackId);96 if(MP4_IS_VIDEO_TRACK_TYPE(trackType))97 {98 //printf("[%s %d] trackId:%d\r\n",__FUNCTION__,__LINE__,trackId);

99 videoindex=trackId;100

101 //duration = MP4GetTrackDuration(oMp4File, trackId );

102 numSamples =MP4GetTrackNumberOfSamples(oMp4File, trackId);103 //timescale = MP4GetTrackTimeScale(oMp4File, trackId);104 //oStreamDuration = duration/(timescale/1000);

105 oFrameCount =numSamples;106

107 //read sps/pps

108 uint8_t **seqheader;109 uint8_t **pictheader;110 uint32_t *pictheadersize;111 uint32_t *seqheadersize;112 uint32_t ix;113 MP4GetTrackH264SeqPictHeaders(oMp4File, trackId, &seqheader, &seqheadersize, &pictheader, &pictheadersize);114

115 for (ix = 0; seqheadersize[ix] != 0; ix++)116 {117 memcpy(sps, seqheader[ix], seqheadersize[ix]);118 spslen =seqheadersize[ix];119 free(seqheader[ix]);120 }121 free(seqheader);122 free(seqheadersize);123

124 for (ix = 0; pictheadersize[ix] != 0; ix++)125 {126 memcpy(pps, pictheader[ix], pictheadersize[ix]);127 ppslen =pictheadersize[ix];128 free(pictheader[ix]);129 }

free(pictheader);

free(pictheadersize);

130 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值