水墨画龙 2016-04-20 03:14 采纳率: 0%
浏览 3884

关于h264+aac合成MP4问题

bool Mp4Mutex::init(int& nTrackId, int nSampleRate, int nChannal, int bitsPerSample,char* pMp4File )
{
//m_Mp4File = pMp4File;
m_nSampleRate = nSampleRate;
m_nAudioChannal = nChannal;
m_nBitsPerSample = bitsPerSample;

// init faac
m_hEncoder = faacEncOpen( nSampleRate, nChannal, &m_nInputSamples, &m_nMaxOutputBytes);

m_nMaxInputBytes=m_nInputSamples*bitsPerSample/8;   

m_pbPCMBuffer = new BYTE [m_nMaxInputBytes];
m_pOutAACBuffer = new BYTE [m_nMaxOutputBytes];
m_pTempBuffer = new BYTE [TEMP_BUFFER_SIZE];
memset(m_pTempBuffer, 0 , TEMP_BUFFER_SIZE);

// Get current encoding configuration
faacEncConfigurationPtr pConfiguration = faacEncGetCurrentConfiguration(m_hEncoder);
if( !pConfiguration )
{
    printf("GetCurrentConfiguration error!\n");
    return false;
}

//设置版本,录制MP4文件时要用MPEG4
pConfiguration->version = MPEG4 ;
pConfiguration->aacObjectType = LOW; //LC编码

//输入数据类型
pConfiguration->inputFormat = FAAC_INPUT_16BIT;

// outputFormat (0 = Raw; 1 = ADTS)
// 录制MP4文件时,要用raw流。检验编码是否正确时可设置为 adts传输流,
pConfiguration->outputFormat= 0;


//瞬时噪声定形(temporal noise shaping,TNS)滤波器
pConfiguration->shortctl = SHORTCTL_NORMAL;

pConfiguration->useTns=true;
//pConfiguration->useLfe=false;
pConfiguration->quantqual=100;
pConfiguration->bandWidth=0;
pConfiguration->bitRate=0;

//  Set encoding configuration
faacEncSetConfiguration( m_hEncoder, pConfiguration);


// 2.1 create mp4 file
//char tmp[255] = "E:\\test1.mp4";
m_Mp4File = MP4Create(pMp4File ,  0);
if ( m_Mp4File == MP4_INVALID_FILE_HANDLE)
{
    printf("open file fialed.\n");
    return false;
}

// 2.2 add audio track
m_AudioTrackId  = MP4AddAudioTrack( m_Mp4File, nSampleRate, m_nInputSamples , MP4_MPEG4_AUDIO_TYPE );
if (m_AudioTrackId == MP4_INVALID_TRACK_ID)
{
    //MP4Close(m_Mp4File);
    ///free(faacDecoderInfo);
    return false;
}
nTrackId = m_AudioTrackId;
// 2.3 set audio level  LC
MP4SetAudioProfileLevel(m_Mp4File, 0x2 ); //  

// 2.4 get decoder info
unsigned char* faacDecoderInfo = NULL;    
unsigned long  faacDecoderInfoSize = 0;    
if( faacEncGetDecoderSpecificInfo( m_hEncoder, &faacDecoderInfo, &faacDecoderInfoSize )) 
{        
    //MP4Close(m_Mp4File);
    free(faacDecoderInfo);
    return false ;   
} 

// 2.5 set encoder info [16bit-8000hz-1channal->{ 0x15, 0x88 } ]
bool bOk = MP4SetTrackESConfiguration(m_Mp4File, m_AudioTrackId, faacDecoderInfo, faacDecoderInfoSize );
if( !bOk )
{
    free(faacDecoderInfo);
    //MP4Close(m_Mp4File);
    return false;   
}
free( faacDecoderInfo );

return true;

}

void Mp4Mutex::StartWriteMp4(const unsigned char const pBufferG711,int nG711Len)
{
static FILE
fp = fopen("E:\3.g711a","wb");
fwrite(pBufferG711,nG711Len,1,fp);
fflush(fp);
if ( G711_BUFFER_SIZE < nG711Len )
{
}
BYTE szPcmBuff[PCM_BUFFER_SIZE] = {0};//1024
int nPcmLen = g711a_decode( (short*)szPcmBuff, pBufferG711, nG711Len );

memcpy(m_pTempBuffer+m_nTempPos, szPcmBuff ,nPcmLen ) ;
m_nTempPos += nPcmLen;

if ( m_nTempPos < m_nMaxInputBytes )
{
    return ;
}

memcpy(m_pbPCMBuffer, m_pTempBuffer ,m_nMaxInputBytes ) ;

char szTemp[2048]={0};
int nLeft = m_nTempPos-m_nMaxInputBytes;
memcpy( szTemp, (m_pTempBuffer+m_nMaxInputBytes), nLeft );
memset(m_pTempBuffer, 0, TEMP_BUFFER_SIZE );
memcpy( m_pTempBuffer, szTemp, nLeft );
m_nTempPos -= m_nMaxInputBytes ;

int nRet = faacEncEncode(m_hEncoder, (int*)m_pbPCMBuffer, m_nInputSamples, m_pOutAACBuffer, m_nMaxOutputBytes );
if ( nRet <= 0 )
{
    return ;
}
MP4WriteSample( m_Mp4File, m_AudioTrackId, (BYTE*)&m_pOutAACBuffer[0], nRet-0 , 1024, 0, true);

}

代码如上,直接从摄像机组播取H264+G711a的标准流,合成完MP4后没有音频,从收流处直接将g711a保存成文件单独使用如上代码dome转化为MP4后播放正常,求原因啊!!!!!!

  • 写回答

1条回答 默认 最新

  • 水墨画龙 2016-04-26 03:54
    关注

    查到一个问题编码完的音频数据编码显示为 ftypmp42 mp42avc1 n頼dat? libfaac 1.28,avc1应该是视频编码吧。。。,但是找不到哪里的问题导致的啊。。。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)