audio_faac.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #include "mp4live.h"
  22. #include "audio_faac.h"
  23. CFaacAudioEncoder::CFaacAudioEncoder()
  24. {
  25. m_faacHandle = NULL;
  26. m_samplesPerFrame = 1024;
  27. m_aacFrameBuffer = NULL;
  28. m_aacFrameBufferLength = 0;
  29. m_aacFrameMaxSize = 0;
  30. }
  31. bool CFaacAudioEncoder::Init(CLiveConfig* pConfig, bool realTime)
  32. {
  33. m_pConfig = pConfig;
  34. m_faacHandle = faacEncOpen(
  35. m_pConfig->GetIntegerValue(CONFIG_AUDIO_SAMPLE_RATE),
  36. m_pConfig->GetIntegerValue(CONFIG_AUDIO_CHANNELS),
  37. (unsigned long*)&m_samplesPerFrame,
  38. (unsigned long*)&m_aacFrameMaxSize);
  39. if (m_faacHandle == NULL) {
  40. return false;
  41. }
  42. m_samplesPerFrame /= m_pConfig->GetIntegerValue(CONFIG_AUDIO_CHANNELS);
  43. m_faacConfig = faacEncGetCurrentConfiguration(m_faacHandle);
  44. m_faacConfig->mpegVersion = MPEG4;
  45. m_faacConfig->aacObjectType = LOW;
  46. m_faacConfig->useAdts = false;
  47. m_faacConfig->bitRate = 
  48. (m_pConfig->GetIntegerValue(CONFIG_AUDIO_BIT_RATE) * 1000)
  49. / m_pConfig->GetIntegerValue(CONFIG_AUDIO_CHANNELS);
  50. faacEncSetConfiguration(m_faacHandle, m_faacConfig);
  51. return true;
  52. }
  53. u_int32_t CFaacAudioEncoder::GetSamplesPerFrame()
  54. {
  55. return m_samplesPerFrame;
  56. }
  57. bool CFaacAudioEncoder::EncodeSamples(
  58. u_int16_t* pBuffer, 
  59. u_int32_t bufferLength)
  60. {
  61. int rc = 0;
  62. // just in case, should be NULL
  63. free(m_aacFrameBuffer);
  64. m_aacFrameBuffer = (u_int8_t*)malloc(m_aacFrameMaxSize);
  65. if (m_aacFrameBuffer == NULL) {
  66. return false;
  67. }
  68. rc = faacEncEncode(
  69. m_faacHandle,
  70. (short*)pBuffer,
  71. bufferLength / 2,
  72. m_aacFrameBuffer,
  73. m_aacFrameMaxSize);
  74. if (rc < 0) {
  75. return false;
  76. }
  77. m_aacFrameBufferLength = rc;
  78. return true;
  79. }
  80. bool CFaacAudioEncoder::EncodeSamples(
  81. u_int16_t* pLeftBuffer, 
  82. u_int16_t* pRightBuffer, 
  83. u_int32_t bufferLength)
  84. {
  85. if (pRightBuffer) {
  86. u_int16_t* pPcmBuffer = NULL;
  87. InterleaveStereoSamples(
  88. pLeftBuffer, 
  89. pRightBuffer,
  90. bufferLength / sizeof(u_int16_t),
  91. &pPcmBuffer);
  92. bool rc = EncodeSamples(pPcmBuffer, bufferLength * 2);
  93. free(pPcmBuffer);
  94. return rc;
  95. }
  96. return EncodeSamples(pLeftBuffer, bufferLength);
  97. }
  98. bool CFaacAudioEncoder::GetEncodedSamples(
  99. u_int8_t** ppBuffer, 
  100. u_int32_t* pBufferLength,
  101. u_int32_t* pNumSamples)
  102. {
  103. *ppBuffer = m_aacFrameBuffer;
  104. *pBufferLength = m_aacFrameBufferLength;
  105. *pNumSamples = m_samplesPerFrame;
  106. m_aacFrameBuffer = NULL;
  107. m_aacFrameBufferLength = 0;
  108. return true;
  109. }
  110. void CFaacAudioEncoder::Stop()
  111. {
  112. faacEncClose(m_faacHandle);
  113. m_faacHandle = NULL;
  114. }