⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avi.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  if (foundVO == false) {    fprintf(stderr, 	    "%s:Warning: No VO header found in mpeg-4 video.\n"	    "This can cause problems with players other than mp4player\n",	    ProgName);  }  if (foundVOL == false) {    fprintf(stderr, 	    "%s: fatal: No VOL header found in mpeg-4 video stream\n",	    ProgName);    MP4DeleteTrack(mp4File, trackId);    return MP4_INVALID_TRACK_ID;  }  if (MP4GetNumberOfTracks(mp4File, MP4_VIDEO_TRACK_TYPE) == 1) {    if (VideoProfileLevelSpecified) {      videoProfileLevel = VideoProfileLevel;    }    MP4SetVideoProfileLevel(mp4File, videoProfileLevel);  }  set_es_config(mp4File, trackId, pFrameBuffer, vopStart);  pPrevFrameBuffer = &pFrameBuffer[vopStart];  prevFrameSize = frameSize - vopStart;  MP4Duration dur = mp4FrameDuration;  // process the rest of the frames  for (ix = 1; ix < numFrames; ix++) {    pFrameBuffer = ppFrames[use_buffer];    frameSize = AVI_read_frame(aviFile, (char*)pFrameBuffer);    if (frameSize < 0) {      fprintf(stderr,		      "%s: can't read video frame %i: %s\n",	      ProgName, ix + 1, AVI_strerror());      MP4DeleteTrack(mp4File, trackId);      return MP4_INVALID_TRACK_ID;    }    // we mark random access points in MP4 files    // note - we will skip any extra information in the    // header - only VOPs are allowed to be written    // wmay - 6-2004    uint8_t *vophdr = MP4AV_Mpeg4FindVop(pFrameBuffer, frameSize);		    if (vophdr != NULL) {      int32_t diff = vophdr - pFrameBuffer;      frameSize -= diff;      pFrameBuffer = vophdr;      vopType = MP4AV_Mpeg4GetVopType(pPrevFrameBuffer, prevFrameSize);      MP4WriteSample(mp4File, trackId, 		     pPrevFrameBuffer, prevFrameSize, dur, 0, 		     vopType  == VOP_TYPE_I);      dur = mp4FrameDuration;      pPrevFrameBuffer = vophdr;      prevFrameSize = frameSize;      use_buffer = use_buffer == 0 ? 1 : 0;    } else {      fprintf(stderr, 	      "Video frame %d does not have a VOP code - skipping\n",	      ix + 1);      dur += mp4FrameDuration;    }    // write the frame to the MP4 file  }  // write the last frame  vopType = MP4AV_Mpeg4GetVopType(pPrevFrameBuffer, prevFrameSize);  MP4WriteSample(mp4File, trackId, 		 pPrevFrameBuffer, prevFrameSize, dur, 0, 		 vopType  == VOP_TYPE_I);  return trackId;}static inline u_int32_t BytesToInt32(u_int8_t* pBytes) {  return (pBytes[0] << 24) | (pBytes[1] << 16)     | (pBytes[2] << 8) | pBytes[3];}static MP4TrackId AudioCreator(MP4FileHandle mp4File, avi_t* aviFile, bool doEncrypt){  int32_t audioType = AVI_audio_format(aviFile);  ismacryp_session_id_t ismaCrypSId;  mp4v2_ismacrypParams *icPp =  (mp4v2_ismacrypParams *) malloc(sizeof(mp4v2_ismacrypParams));  memset(icPp, 0, sizeof(mp4v2_ismacrypParams));  // Check for MP3 audio type  if (audioType != 0x55) {    fprintf(stderr,		    "%s: audio compressor 0x%x not recognized\n",	    ProgName, audioType);    return MP4_INVALID_TRACK_ID;  }  if (doEncrypt) {    if (ismacrypInitSession(&ismaCrypSId, KeyTypeAudio) != 0) {      fprintf(stderr, "%s: could not initialize the ISMAcryp session\n",	      ProgName);      return MP4_INVALID_TRACK_ID;    }    if (ismacrypGetScheme(ismaCrypSId, &(icPp->scheme_type)) != ismacryp_rc_ok) {      fprintf(stderr, "%s: could not get ismacryp scheme type. sid %d\n", 	      ProgName, ismaCrypSId);      ismacrypEndSession(ismaCrypSId);      return MP4_INVALID_TRACK_ID;    }    if (ismacrypGetSchemeVersion(ismaCrypSId, &(icPp->scheme_version)) != ismacryp_rc_ok) {      fprintf(stderr, "%s: could not get ismacryp scheme ver. sid %d\n",	      ProgName, ismaCrypSId);      ismacrypEndSession(ismaCrypSId);      return MP4_INVALID_TRACK_ID;    }    if (ismacrypGetKMSUri(ismaCrypSId, &(icPp->kms_uri)) != ismacryp_rc_ok) {      fprintf(stderr, "%s: could not get ismacryp kms uri. sid %d\n",	      ProgName, ismaCrypSId);      CHECK_AND_FREE(icPp->kms_uri);      ismacrypEndSession(ismaCrypSId);      return MP4_INVALID_TRACK_ID;    }    if ( ismacrypGetSelectiveEncryption(ismaCrypSId, &(icPp->selective_enc)) != ismacryp_rc_ok ) {      fprintf(stderr, "%s: could not get ismacryp selec enc. sid %d\n",	      ProgName, ismaCrypSId);      ismacrypEndSession(ismaCrypSId);      return MP4_INVALID_TRACK_ID;    }    if (ismacrypGetKeyIndicatorLength(ismaCrypSId, &(icPp->key_ind_len)) != ismacryp_rc_ok) {      fprintf(stderr, "%s: could not get ismacryp key ind len. sid %d\n",	      ProgName, ismaCrypSId);      ismacrypEndSession(ismaCrypSId);      return MP4_INVALID_TRACK_ID;    }    if (ismacrypGetIVLength(ismaCrypSId, &(icPp->iv_len)) != ismacryp_rc_ok) {      fprintf(stderr, "%s: could not get ismacryp iv len. sid %d\n",	      ProgName, ismaCrypSId);      ismacrypEndSession(ismaCrypSId);      return MP4_INVALID_TRACK_ID;    }  }  u_int8_t temp[4];  u_int32_t mp3header;  AVI_seek_start(aviFile);  if (AVI_read_audio(aviFile, (char*)&temp, 4) != 4) {    fprintf(stderr,		    "%s: can't read audio frame 0: %s\n",	    ProgName, AVI_strerror());    return MP4_INVALID_TRACK_ID;  }  mp3header = BytesToInt32(temp);  // check mp3header sanity  if ((mp3header & 0xFFE00000) != 0xFFE00000) {    fprintf(stderr,		    "%s: data in file doesn't appear to be valid mp3 audio\n",	    ProgName);    return MP4_INVALID_TRACK_ID;  }  u_int16_t samplesPerSecond =     MP4AV_Mp3GetHdrSamplingRate(mp3header);  u_int16_t samplesPerFrame =     MP4AV_Mp3GetHdrSamplingWindow(mp3header);  u_int8_t mp4AudioType =     MP4AV_Mp3ToMp4AudioType(MP4AV_Mp3GetHdrVersion(mp3header));  if (audioType == MP4_INVALID_AUDIO_TYPE      || samplesPerSecond == 0) {    fprintf(stderr,		    "%s: data in file doesn't appear to be valid mp3 audio\n",	    ProgName);    return MP4_INVALID_TRACK_ID;  }	  MP4TrackId trackId;  if (doEncrypt) {    trackId = MP4AddEncAudioTrack(mp4File, samplesPerSecond, 				  samplesPerFrame, 				  icPp,				  mp4AudioType);  } else {    trackId = MP4AddAudioTrack(mp4File, samplesPerSecond, 			       samplesPerFrame, mp4AudioType);  }  if (trackId == MP4_INVALID_TRACK_ID) {    fprintf(stderr,		    "%s: can't create audio track\n", ProgName);    return MP4_INVALID_TRACK_ID;  }  if (MP4GetNumberOfTracks(mp4File, MP4_AUDIO_TRACK_TYPE) == 1) {    MP4SetAudioProfileLevel(mp4File, 0xFE);  }  int32_t i;  int32_t aviFrameSize;  int32_t maxAviFrameSize = 0;  // determine maximum avi audio chunk size  // should be at least as large as maximum mp3 frame size  AVI_seek_start(aviFile);  i = 0;  while (AVI_set_audio_frame(aviFile, i, (long*)&aviFrameSize) == 0) {    if (aviFrameSize > maxAviFrameSize) {      maxAviFrameSize = aviFrameSize;    }    i++;  }  // allocate a large enough frame buffer  u_int8_t* pFrameBuffer = (u_int8_t*)malloc(maxAviFrameSize);  if (pFrameBuffer == NULL) {    fprintf(stderr,		    "%s: can't allocate memory\n", ProgName);    MP4DeleteTrack(mp4File, trackId);    return MP4_INVALID_TRACK_ID;  }  AVI_seek_start(aviFile);  u_int32_t mp3FrameNumber = 1;  while (true) {    if (AVI_read_audio(aviFile, (char*)pFrameBuffer, 4) != 4) {      // EOF presumably      break;    }    mp3header = BytesToInt32(&pFrameBuffer[0]);    u_int16_t mp3FrameSize = MP4AV_Mp3GetFrameSize(mp3header);    int bytesRead =      AVI_read_audio(aviFile, (char*)&pFrameBuffer[4], mp3FrameSize - 4);    if (bytesRead != mp3FrameSize - 4) {      fprintf(stderr,		      "%s: Warning, incomplete audio frame %u, ending audio track\n",	      ProgName, mp3FrameNumber);      break;    }    if (!MP4WriteSample(mp4File, trackId, 			&pFrameBuffer[0], mp3FrameSize)) {      fprintf(stderr,		      "%s: can't write audio frame %u\n", ProgName, mp3FrameNumber);      MP4DeleteTrack(mp4File, trackId);      return MP4_INVALID_TRACK_ID;    }	    mp3FrameNumber++;  }  return trackId;}MP4TrackId* AviCreator(MP4FileHandle mp4File, const char* aviFileName, 		       bool doEncrypt){  static MP4TrackId trackIds[3];  u_int8_t numTracks = 0;  avi_t* aviFile = AVI_open_input_file(aviFileName, true);  if (aviFile == NULL) {    fprintf(stderr,		    "%s: can't open %s: %s\n",	    ProgName, aviFileName, AVI_strerror());  } else {    if (AVI_video_frames(aviFile) > 0) {      trackIds[numTracks] = VideoCreator(mp4File, aviFile, 					 doEncrypt);      if (trackIds[numTracks] != MP4_INVALID_TRACK_ID) {	numTracks++;      }    }    if (AVI_audio_bytes(aviFile) > 0) {      trackIds[numTracks] = AudioCreator(mp4File, aviFile, 					 doEncrypt);      if (trackIds[numTracks] != MP4_INVALID_TRACK_ID) {	numTracks++;      }    }    AVI_close(aviFile);  }  trackIds[numTracks] = MP4_INVALID_TRACK_ID;  return trackIds;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -