本文已参与 [新人创作礼] 活动,一起开启掘金创作之路。
《使用gpac封装mp4代码解析(二)》详细分析了WriteH264函数,本文分析调用WriteH264函数中调用的函数WriteH264Nalu。
函数WriteH264Nalu源码如下:
int AF_MP4Writer::WriteH264Nalu(unsigned char **ppNaluData, int *pNaluLength)
{
m_nTrackID = gf_isom_new_track(m_pFile, 0, GF_ISOM_MEDIA_VISUAL, 1000);
gf_isom_set_track_enabled(m_pFile, m_nTrackID, 1);
GF_AVCConfig *pstAVCConfig = gf_odf_avc_cfg_new();
gf_isom_avc_config_new(m_pFile, m_nTrackID, pstAVCConfig, NULL, NULL, &m_nStreamIndex);
gf_isom_set_visual_info(m_pFile, m_nTrackID, m_nStreamIndex, m_nWidth, m_nHeight);
pstAVCConfig->configurationVersion = 1;
pstAVCConfig->AVCProfileIndication = ppNaluData[AF_NALU_SPS][1];
pstAVCConfig->profile_compatibility = ppNaluData[AF_NALU_SPS][2];
pstAVCConfig->AVCLevelIndication = ppNaluData[AF_NALU_SPS][3];
GF_AVCConfigSlot stAVCConfig[AF_NALU_MAX];
memset(stAVCConfig, 0, sizeof(stAVCConfig));
for (int i = 0; i < AF_NALU_MAX; i++)
{
if (i == AF_NALU_VPS)
continue;
stAVCConfig[i].size = pNaluLength[i];
stAVCConfig[i].data = (char *)ppNaluData[i];
if (i == AF_NALU_SPS)
{
gf_list_add(pstAVCConfig->sequenceParameterSets, &stAVCConfig[i]);
}
else if (i == AF_NALU_PPS)
{
gf_list_add(pstAVCConfig->pictureParameterSets, &stAVCConfig[i]);
}
}
gf_isom_avc_config_update(m_pFile, m_nTrackID, 1, pstAVCConfig);
pstAVCConfig->pictureParameterSets = NULL;
pstAVCConfig->sequenceParameterSets = NULL;
gf_odf_avc_cfg_del(pstAVCConfig);
pstAVCConfig = NULL;
return 0;
}
这个函数就与gpac底层代码紧密连接了,调用的基本都是gpac库的接口函数。一个一个来看。
m_nTrackID = gf_isom_new_track(m_pFile, 0, GF_ISOM_MEDIA_VISUAL, 1000);
函数定义位于gpac/include/gpac/isomedia.h中:
/*creates a new Track. If trackID = 0, the trackID is chosen by the API
returns the track number or 0 if error*/
u32 gf_isom_new_track(GF_ISOFile *the_file, u32 trackID, u32 MediaType, u32 TimeScale);
gf_isom_set_track_enabled(m_pFile, m_nTrackID, 1);
函数定义位于gpac/include/gpac/isomedia.h中:
/*sets the enable flag of a track*/
GF_Err gf_isom_set_track_enabled(GF_ISOFile *the_file, u32 trackNumber, u8 enableTrack);
GF_AVCConfig *pstAVCConfig = gf_odf_avc_cfg_new();
函数定义位于gpac/include/gpac/mpeg4_odf.h中:
/*! AVC config constructor
\return the created AVC config*/
GF_AVCConfig *gf_odf_avc_cfg_new();
gf_isom_avc_config_new(m_pFile, m_nTrackID, pstAVCConfig, NULL, NULL, &m_nStreamIndex);
函数定义位于gpac/include/gpac/isomedia.h中:
/*creates new AVC config*/
GF_Err gf_isom_avc_config_new(GF_ISOFile *the_file, u32 trackNumber, GF_AVCConfig *cfg, char *URLname, char *URNname, u32 *outDescriptionIndex);
gf_isom_set_visual_info(m_pFile, m_nTrackID, m_nStreamIndex, m_nWidth, m_nHeight);
函数定义位于gpac/include/gpac/isomedia.h中:
/*since v2 you must specify w/h of video tracks for authoring tools (no decode the video cfg / first sample)*/
GF_Err gf_isom_set_visual_info(GF_ISOFile *the_file, u32 trackNumber, u32 StreamDescriptionIndex, u32 Width, u32 Height);