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

📄 mp4meta.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
bool MP4File::GetMetadataGenre(char** value){  u_int16_t genreIndex = 0;  unsigned char *val = NULL;  u_int32_t valSize = 0;  const char *t = "moov.udta.meta.ilst.gnre";  const char *s = "moov.udta.meta.ilst.gnre.data.metadata";  *value = NULL;  MP4Atom *gnre = FindAtom(t);  if (gnre)    {      GetBytesProperty(s, (u_int8_t**)&val, &valSize);      if (valSize != 2) {	CHECK_AND_FREE(val);	return false;      }      genreIndex = (u_int16_t)(val[1]);      genreIndex += (u_int16_t)(val[0]<<8);      GenreToString(value, genreIndex);      (void)DeleteMetadataAtom( "gnre" );      free(val);      return true;    } else {    const char *s2 = "moov.udta.meta.ilst.\251gen.data.metadata";    val = NULL;    valSize = 0;    GetBytesProperty(s2, (u_int8_t**)&val, &valSize);    if (valSize > 0)      {	*value = (char*)malloc((valSize+1)*sizeof(unsigned char));	if (*value != NULL) {	  memset(*value, 0, (valSize+1)*sizeof(unsigned char));	  memcpy(*value, val, valSize*sizeof(unsigned char));	}	free(val);	return true;      } else {      CHECK_AND_FREE(val);    }  }  return false;}bool MP4File::DeleteMetadataGenre(){  bool val1 = DeleteMetadataAtom("\251gen");  bool val2 = DeleteMetadataAtom("gnre");  return val1 || val2;}bool MP4File::SetMetadataTempo(u_int16_t tempo){  unsigned char t[3];  const char *s = "moov.udta.meta.ilst.tmpo.data";  MP4BytesProperty *pMetadataProperty = NULL;  MP4Atom *pMetaAtom = NULL;      pMetaAtom = m_pRootAtom->FindAtom(s);  if (!pMetaAtom)    {      if (!CreateMetadataAtom("tmpo"))	return false;      pMetaAtom = m_pRootAtom->FindAtom(s);      if (pMetaAtom == NULL) return false;    }  memset(t, 0, 3*sizeof(unsigned char));  t[0] = (unsigned char)(tempo>>8)&0xFF;  t[1] = (unsigned char)(tempo)&0xFF;  ASSERT(pMetaAtom->FindProperty("data.metadata", 				 (MP4Property**)&pMetadataProperty));  ASSERT(pMetadataProperty);  pMetadataProperty->SetValue((u_int8_t*)t, 2);  return true;}bool MP4File::GetMetadataTempo(u_int16_t* tempo){  unsigned char *val = NULL;  u_int32_t valSize = 0;  const char *s = "moov.udta.meta.ilst.tmpo.data.metadata";  *tempo = 0;  GetBytesProperty(s, (u_int8_t**)&val, &valSize);  if (valSize != 2) {    CHECK_AND_FREE(val);    return false;  }  *tempo = (u_int16_t)(val[1]);  *tempo += (u_int16_t)(val[0]<<8);  free(val);  return true;}bool MP4File::SetMetadataUint8 (const char *atom, uint8_t value){  char atompath[36];  MP4BytesProperty *pMetadataProperty = NULL;  MP4Atom *pMetaAtom = NULL;  snprintf(atompath, 36, "moov.udta.meta.ilst.%s.data", atom);  pMetaAtom = m_pRootAtom->FindAtom(atompath);  if (pMetaAtom == NULL) {    if (!CreateMetadataAtom(atom))      return false;    pMetaAtom = m_pRootAtom->FindAtom(atompath);    if (pMetaAtom == NULL) return false;  }  ASSERT(pMetaAtom->FindProperty("data.metadata", 				 (MP4Property**)&pMetadataProperty));  ASSERT(pMetadataProperty);    pMetadataProperty->SetValue(&value, 1);  return true;}bool MP4File::GetMetadataUint8(const char *atom, u_int8_t* retvalue){  unsigned char *val = NULL;  u_int32_t valSize = 0;  char atompath[80];  snprintf(atompath, 80, "moov.udta.meta.ilst.%s.data.metadata", atom);  *retvalue = 0;  GetBytesProperty(atompath, (u_int8_t**)&val, &valSize);  if (valSize != 1) {    CHECK_AND_FREE(val);    return false;  }  *retvalue = val[0];  free(val);  return true;}bool MP4File::SetMetadataCoverArt(u_int8_t *coverArt, u_int32_t size){  const char *s = "moov.udta.meta.ilst.covr.data";  MP4BytesProperty *pMetadataProperty = NULL;  MP4Atom *pMetaAtom = NULL;      pMetaAtom = m_pRootAtom->FindAtom(s);  if (!pMetaAtom)    {      if (!CreateMetadataAtom("covr"))	return false;      pMetaAtom = m_pRootAtom->FindAtom(s);      if (pMetaAtom == NULL) return false;    }  ASSERT(pMetaAtom->FindProperty("data.metadata", 				 (MP4Property**)&pMetadataProperty));  ASSERT(pMetadataProperty);  pMetadataProperty->SetValue(coverArt, size);  return true;}bool MP4File::GetMetadataCoverArt(u_int8_t **coverArt, u_int32_t *size,				  uint32_t index){  char buffer[256];  if (size == NULL || coverArt == NULL) return false;  if (index > 0 && index > GetMetadataCoverArtCount()) return false;  snprintf(buffer, 256, "moov.udta.meta.ilst.covr.data[%d].metadata", index);  *coverArt = NULL;  *size = 0;  GetBytesProperty(buffer, coverArt, size);  if (size == 0)    return false;  return true;}u_int32_t MP4File::GetMetadataCoverArtCount (void){  MP4Atom *pMetaAtom = m_pRootAtom->FindAtom("moov.udta.meta.ilst.covr");  if (!pMetaAtom)    return 0;  return pMetaAtom->GetNumberOfChildAtoms();}bool MP4File::SetMetadataFreeForm (const char *name, 				   const u_int8_t* pValue, 				   u_int32_t valueSize,				   const char *owner){  MP4Atom *pMetaAtom = NULL;  MP4BytesProperty *pMetadataProperty = NULL;  char s[256];  int i = 0;  size_t nameLen = strlen(name);  size_t ownerLen = owner != NULL ? strlen(owner) : 0;  while (1)    {      snprintf(s, 256, "moov.udta.meta.ilst.----[%u].name", i);      MP4Atom *pTagAtom = m_pRootAtom->FindAtom(s);      if (!pTagAtom)	break;      snprintf(s, 256, "moov.udta.meta.ilst.----[%u].mean", i);      MP4Atom *pMeanAtom = m_pRootAtom->FindAtom(s);      if (pTagAtom->FindProperty("name.metadata", 				 (MP4Property**)&pMetadataProperty) &&	  pMetadataProperty) {	u_int8_t* pV;	u_int32_t VSize = 0;	pMetadataProperty->GetValue(&pV, &VSize);	if (VSize == nameLen && memcmp(pV, name, VSize) == 0) {	  u_int8_t* pOwner=0;	  u_int32_t ownerSize = 0;	  	  if (pMeanAtom && 	      pMeanAtom->FindProperty("mean.metadata", 				      (MP4Property**)&pMetadataProperty) &&	      pMetadataProperty) {	    pMetadataProperty->GetValue(&pOwner, &ownerSize);	  }	  	  if (owner == NULL|| 	      (pOwner && 	       ownerLen == ownerSize && 	       memcmp(owner, pOwner, ownerSize))) {	    snprintf(s, 256, "moov.udta.meta.ilst.----[%u].data.metadata", i);	    SetBytesProperty(s, pValue, valueSize);	    CHECK_AND_FREE(pV);	    CHECK_AND_FREE(pOwner);	    	    return true;	  }	  CHECK_AND_FREE(pOwner);	}	CHECK_AND_FREE(pV);      }            i++;    }  /* doesn't exist yet, create it */  char t[256];  snprintf(t, 256, "udta.meta.ilst.----[%u]", i);  snprintf(s, 256, "moov.udta.meta.ilst.----[%u].data", i);  (void)AddDescendantAtoms("moov", t);  pMetaAtom = m_pRootAtom->FindAtom(s);  if (!pMetaAtom)    return false;  pMetaAtom->SetFlags(0x1);  MP4Atom *pHdlrAtom = m_pRootAtom->FindAtom("moov.udta.meta.hdlr");  MP4StringProperty *pStringProperty = NULL;  MP4BytesProperty *pBytesProperty = NULL;  ASSERT(pHdlrAtom);  ASSERT(pHdlrAtom->FindProperty("hdlr.handlerType", 				 (MP4Property**)&pStringProperty));  ASSERT(pStringProperty);  pStringProperty->SetValue("mdir");  u_int8_t val[12];  memset(val, 0, 12*sizeof(u_int8_t));  val[0] = 0x61;  val[1] = 0x70;  val[2] = 0x70;  val[3] = 0x6c;  ASSERT(pHdlrAtom->FindProperty("hdlr.reserved2", 				 (MP4Property**)&pBytesProperty));  ASSERT(pBytesProperty);  pBytesProperty->SetReadOnly(false);  pBytesProperty->SetValue(val, 12);  pBytesProperty->SetReadOnly(true);  pMetaAtom = m_pRootAtom->FindAtom(s);  ASSERT(pMetaAtom);  ASSERT(pMetaAtom->FindProperty("data.metadata", 				 (MP4Property**)&pMetadataProperty));  ASSERT(pMetadataProperty);  pMetadataProperty->SetValue(pValue, valueSize);  snprintf(s, 256, "moov.udta.meta.ilst.----[%u].name", i);  pMetaAtom = m_pRootAtom->FindAtom(s);  ASSERT(pMetaAtom->FindProperty("name.metadata", 				 (MP4Property**)&pMetadataProperty));  ASSERT(pMetadataProperty);  pMetadataProperty->SetValue((const u_int8_t*)name, strlen(name));  snprintf(s, 256, "moov.udta.meta.ilst.----[%u].mean", i);  pMetaAtom = m_pRootAtom->FindAtom(s);  ASSERT(pMetaAtom->FindProperty("mean.metadata", 				 (MP4Property**)&pMetadataProperty));  ASSERT(pMetadataProperty);  if (!owner || !*owner)    pMetadataProperty->SetValue((u_int8_t*)"com.apple.iTunes", 16); /* com.apple.iTunes is the default*/  else    pMetadataProperty->SetValue((const u_int8_t*)owner, strlen((const char *)owner));  return true;}bool MP4File::GetMetadataFreeForm(const char *name, 				  u_int8_t** ppValue, 				  u_int32_t *pValueSize,				  const char *owner){  char s[256];  int i = 0;  *ppValue = NULL;  *pValueSize = 0;  size_t nameLen = strlen(name);  size_t ownerLen = owner?strlen(owner):0;  while (1)    {      MP4BytesProperty *pMetadataProperty;      snprintf(s, 256,"moov.udta.meta.ilst.----[%u].name", i);      MP4Atom *pTagAtom = m_pRootAtom->FindAtom(s);      snprintf(s, 256,"moov.udta.meta.ilst.----[%u].mean", i);      MP4Atom *pMeanAtom = m_pRootAtom->FindAtom(s);      if (!pTagAtom)	return false;      if (pTagAtom->FindProperty("name.metadata", 				 (MP4Property**)&pMetadataProperty) &&	  pMetadataProperty) {	u_int8_t* pV;	u_int32_t VSize = 0;	pMetadataProperty->GetValue(&pV, &VSize);	if (VSize == nameLen && memcmp(pV, name, VSize) == 0) {	    u_int8_t* pOwner=0;	    u_int32_t ownerSize = 0;	    if (pMeanAtom && pMeanAtom->FindProperty("mean.metadata", 						     (MP4Property**)&pMetadataProperty) &&		pMetadataProperty) {	      pMetadataProperty->GetValue(&pOwner, &ownerSize);	    }	    if (!owner || (pOwner && ownerLen == ownerSize && memcmp(owner, pOwner, ownerSize))) {	      snprintf(s, 256, "moov.udta.meta.ilst.----[%u].data.metadata", i);	      GetBytesProperty(s, ppValue, pValueSize);	      CHECK_AND_FREE(pV);	      CHECK_AND_FREE(pOwner);	      return true;		    }	    CHECK_AND_FREE(pOwner);	}	CHECK_AND_FREE(pV);      }            i++;    }}bool MP4File::DeleteMetadataFreeForm(const char *name, const char *owner){  char s[256];  int i = 0;  size_t nameLen = strlen(name);  size_t ownerLen = owner?strlen(owner):0;  while (1)    {      MP4BytesProperty *pMetadataProperty;      snprintf(s, 256, "moov.udta.meta.ilst.----[%u].name", i);      MP4Atom *pTagAtom = m_pRootAtom->FindAtom(s);      snprintf(s, 256,"moov.udta.meta.ilst.----[%u].mean", i);      MP4Atom *pMeanAtom = m_pRootAtom->FindAtom(s);      if (!pTagAtom)	return false;      if (pTagAtom->FindProperty("name.metadata", 				 (MP4Property**)&pMetadataProperty) &&	  pMetadataProperty) {	u_int8_t* pV;	u_int32_t VSize = 0;	pMetadataProperty->GetValue(&pV, &VSize);	if (VSize != 0)	  {	    if (VSize == nameLen && memcmp(pV, name, VSize) == 0)	      {		u_int8_t* pOwner=0;		u_int32_t ownerSize = 0;		if (pMeanAtom && pMeanAtom->FindProperty("mean.metadata", 							 (MP4Property**)&pMetadataProperty) &&		    pMetadataProperty) 		  {		    pMetadataProperty->GetValue(&pOwner, &ownerSize);		  }		if (!owner || (pOwner && ownerLen == ownerSize && memcmp(owner, pOwner, ownerSize)))		  {		    snprintf(s, 256, "----[%u]", i);		    CHECK_AND_FREE(pOwner);		    CHECK_AND_FREE(pV);		    return DeleteMetadataAtom(s);		  }		CHECK_AND_FREE(pOwner);	      }	  }	CHECK_AND_FREE(pV);      }      i++;    }}bool MP4File::MetadataDelete(){  MP4Atom *pMetaAtom = NULL;  char s[256];  snprintf(s, 256, "moov.udta.meta");  pMetaAtom = m_pRootAtom->FindAtom(s);  /* if it exists, delete it */  if (pMetaAtom)    {      MP4Atom *pParent = pMetaAtom->GetParentAtom();      pParent->DeleteChildAtom(pMetaAtom);      delete pMetaAtom;      return true;    }  return false;}

⌨️ 快捷键说明

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