There are many examples of H264 encoding and muxing. But not many for AAC encoding and muxing. I am trying to mux AAC data to a mp4 file.
The data I obtain is from Directshow samplegrabber callback.
This is my setting for the muxer:
m_AudioEncoderParams.m_info_in.sample_frequency = 44100; m_AudioEncoderParams.m_info_in.channels = 2; m_AudioEncoderParams.m_info_in.bitPerSample = 16; m_AudioEncoderParams.m_info_in.bitrate = (audioFormat->nSamplesPerSec * audioFormat->nChannels * audioFormat->wBitsPerSample); m_AudioEncoderParams.m_info_out.bitrate = 192000; m_AudioEncoderParams.m_info_out.stream_type = UMC :: AAC_AUDIO;
m_mp4muxerParams.m_lpDataWriter = &m_fileWriter; m_mp4muxerParams.m_SystemType = UMC :: MPEG4_SYSTEM_STREAM; m_mp4muxerParams.m_nNumberOfTracks = 1; m_mp4muxerParams.pTrackParams = new UMC::TrackParams[m_mp4muxerParams.m_nNumberOfTracks]; m_mp4muxerParams.pTrackParams[0].type = UMC :: AUDIO_TRACK; m_mp4muxerParams.pTrackParams[0].info.audio = &m_AudioEncoderParams.m_info_out; m_mp4muxerParams.pTrackParams[0].bufferParams.m_prefInputBufferSize = (m_AudioEncoderParams.m_info_out.bitrate * 2); m_mp4muxerParams.pTrackParams[0].bufferParams.m_prefOutputBufferSize = (m_AudioEncoderParams.m_info_out.bitrate * 2);
Then I have my function from callback:
HRESULT CaptureGraphBuilder :: AddAudioSample(double Time, IMediaSample * pSample)
{
HRESULT hr = S_OK;
UMC :: Status status;
BYTE * inBuffer;
hr = pSample->GetPointer(&inBuffer);
if (FAILED(hr)) {
printf("Fail at getting input audio data buffer");
goto done;
}
status = m_inAudioData.SetBufferPointer(inBuffer, pSample->GetActualDataLength());
printf("Audio data length is %d", pSample->GetActualDataLength());
m_inAudioData.SetDataSize(pSample->GetActualDataLength());
if (m_AudioStartTime == 0) {
m_AudioStartTime = Time;
}
Time -= m_AudioStartTime;
status = m_mp4Muxer.LockBuffer(&m_outAudioData, m_mp4Muxer.GetTrackIndex(UMC :: AUDIO_TRACK));
if (status == UMC :: UMC_OK) {
status = m_AudioEncoder.GetFrame(&m_inAudioData, &m_outAudioData);
m_outAudioData.SetTime(Time);
if (status == UMC :: UMC_OK) {
m_mp4Muxer.UnlockBuffer(&m_outAudioData, m_mp4Muxer.GetTrackIndex(UMC :: AUDIO_TRACK));
} else {
printf("FATAL. FAIL AT AAC ENCODING");
}
} else {
printf("Error in Audio status = %d", status);
}
done:
return hr;
} The audio mp4 file is not valid. I can hear sound for a split second and then nothing else.
What am I doing wrong? I am attaching the mp4 file for reference.


