当前位置:   article > 正文

将H.264封装生成mp4文件_c++ h264转mp4

c++ h264转mp4

本项目需要用到mp4v2库,首先编译mp4v2库
以海思平台,交叉编译libmp4v2
MP4v2下载地址
1.编译mp4v2库

./configure --host=aarch64-himix100-linux CC=aarch64-himix100-linux-gcc CXX=aarch64-himix100-linux-g++ --disable-debug
make
make install

2.使用mp4v2库

int first_enter= 0;
char isSyncSample = 0;
#define _NALU_Iframe 0
#define _NALU_Pframe 1

#include "mp4v2/mp4v2.h"

MP4TrackId video = 0;
MP4FileHandle hMP4File = NULL;

void mp4write(char *_naluData,int size,int width,int height)
{
        int index = -1;
        if(_naluData[0]==0 && _naluData[1]==0 && _naluData[2]==0 && _naluData[3]==1 && _naluData[4]==0x67)
        {
		index = _NALU_Iframe;
                isSyncSample = 1;
	}
	
	if(_naluData[0]==0 && _naluData[1]==0 && _naluData[2]==0 && _naluData[3]==1 && _naluData[4]==0x61)
        {
		index = _NALU_Pframe;
                isSyncSample = 0;
	}

        switch(index)
        {
		case _NALU_Iframe:
                  if(first_enter ==0)
                  {
                  	 	 video = MP4AddH264VideoTrack(hMP4File, 90000, 90000 / 60, width, height, _naluData[4+1], _naluData[4+2], _naluData[4+3],3);
                 		 printf("_naluData[4+1]=%2x\n",_naluData[4+1]);
                         if (video == MP4_INVALID_TRACK_ID)  
                  	     {
                     		 printf("add video track failed.\n");
                     		 return;
                  	     }
                 	     MP4SetVideoProfileLevel(hMP4File, 0X7F);
                 	     MP4AddH264SequenceParameterSet(hMP4File, video, _naluData+4, 15);//sps
   		 	             MP4AddH264PictureParameterSet(hMP4File, video, _naluData+23, 4);//pps
			             first_enter =1;
                  }

		          _naluData[36] = ((size- 36 - 4) >> 24) &0xff;
		          _naluData[37] = ((size- 36 - 4) >> 16) &0xff;
	              _naluData[38] = ((size- 36 - 4) >> 8) &0xff;
		          _naluData[39] = (size- 36 - 4) & 0XFF;
                  MP4WriteSample(hMP4File, video, _naluData+36, size-36,MP4_INVALID_DURATION, 0, isSyncSample);
                  break;
                  
        case _NALU_Pframe:
                  _naluData[0] = ((size - 4) >> 24) &0xff;
                  _naluData[1] = ((size - 4) >> 16) &0xff;
                  _naluData[2] = ((size - 4) >> 8) &0xff;
                  _naluData[3] = (size - 4) & 0Xff;
                  MP4WriteSample(hMP4File, video, _naluData, size,MP4_INVALID_DURATION, 0, isSyncSample);
                  break;
	     }
}



void mp4init()
{
    char string[10]="save.mp4";   
    if(hMP4File == NULL)
    {
	    hMP4File = MP4CreateEx(string, 0, 1, 1, 0, 0, 0, 0);
        if (hMP4File == MP4_INVALID_FILE_HANDLE)	
        {   
		      printf("open file failed.\n");
		      return ;
	    }
        MP4SetTimeScale(hMP4File, 90000);
    }
}

void mp4close()
{
 	MP4Close(hMP4File,0);
	hMP4File = NULL;
	video = 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

调用方式:
初始化: mp4init();
循环写帧:mp4write(char *_naluData,int size,int width,int height);
关闭: mp4close();一定要关闭

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/491227
推荐阅读
  

闽ICP备14008679号