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

流媒体/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-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. /* 
  22.  * Notes:
  23.  *  - file formatted with tabstops == 4 spaces 
  24.  */
  25. #include <mp4av_common.h>
  26. static MP4AV_Mp3Header GetMp3Header(
  27. MP4FileHandle mp4File, 
  28. MP4TrackId audioTrackId)
  29. {
  30. u_int8_t* pMp3Frame = NULL;
  31. u_int32_t mp3FrameLength = 0;
  32. bool rc = MP4ReadSample(
  33. mp4File,
  34. audioTrackId,
  35. 1,
  36. &pMp3Frame,
  37. &mp3FrameLength);
  38. if (!rc || mp3FrameLength < 4) {
  39. return 0;
  40. }
  41. MP4AV_Mp3Header mp3Hdr =
  42. MP4AV_Mp3HeaderFromBytes(pMp3Frame);
  43. free(pMp3Frame);
  44. return mp3Hdr;
  45. }
  46. extern "C" u_int8_t MP4AV_AudioGetChannels(
  47. MP4FileHandle mp4File, 
  48. MP4TrackId audioTrackId)
  49. {
  50. u_int8_t audioType = 
  51. MP4GetTrackAudioType(mp4File, audioTrackId);
  52. if (audioType == MP4_INVALID_AUDIO_TYPE) {
  53. return 0;
  54. }
  55. if (MP4_IS_MP3_AUDIO_TYPE(audioType)) {
  56. MP4AV_Mp3Header mp3Hdr =
  57. GetMp3Header(mp4File, audioTrackId);
  58. if (mp3Hdr == 0) {
  59. return 0;
  60. }
  61. return MP4AV_Mp3GetChannels(mp3Hdr);
  62. } else if (MP4_IS_AAC_AUDIO_TYPE(audioType)) {
  63. u_int8_t* pAacConfig = NULL;
  64. u_int32_t aacConfigLength;
  65. MP4GetTrackESConfiguration(
  66. mp4File, 
  67. audioTrackId,
  68. &pAacConfig,
  69. &aacConfigLength);
  70. if (pAacConfig == NULL || aacConfigLength < 2) {
  71. return 0;
  72. }
  73. u_int8_t channels =
  74. MP4AV_AacConfigGetChannels(pAacConfig);
  75. free(pAacConfig);
  76. return channels;
  77. } else if (audioType == MP4_PCM16_AUDIO_TYPE) {
  78. u_int32_t samplesPerFrame =
  79. MP4GetSampleSize(mp4File, audioTrackId, 1) / 2;
  80. MP4Duration frameDuration =
  81. MP4GetSampleDuration(mp4File, audioTrackId, 1);
  82. if (frameDuration == 0) {
  83. return 0;
  84. }
  85. // assumes track time scale == sampling rate
  86. return samplesPerFrame / frameDuration;
  87. }
  88. return 0;
  89. }
  90. extern "C" u_int32_t MP4AV_AudioGetSamplingRate(
  91. MP4FileHandle mp4File, 
  92. MP4TrackId audioTrackId)
  93. {
  94. u_int8_t audioType = 
  95. MP4GetTrackAudioType(mp4File, audioTrackId);
  96. if (audioType == MP4_INVALID_AUDIO_TYPE) {
  97. return 0;
  98. }
  99. if (MP4_IS_MP3_AUDIO_TYPE(audioType)) {
  100. MP4AV_Mp3Header mp3Hdr =
  101. GetMp3Header(mp4File, audioTrackId);
  102. if (mp3Hdr == 0) {
  103. return 0;
  104. }
  105. return MP4AV_Mp3GetHdrSamplingRate(mp3Hdr);
  106. } else if (MP4_IS_AAC_AUDIO_TYPE(audioType)) {
  107. u_int8_t* pAacConfig = NULL;
  108. u_int32_t aacConfigLength;
  109. MP4GetTrackESConfiguration(
  110. mp4File, 
  111. audioTrackId,
  112. &pAacConfig,
  113. &aacConfigLength);
  114. if (pAacConfig == NULL || aacConfigLength < 2) {
  115. return 0;
  116. }
  117. u_int32_t samplingRate =
  118. MP4AV_AacConfigGetSamplingRate(pAacConfig);
  119. free(pAacConfig);
  120. return samplingRate;
  121. } else if (audioType == MP4_PCM16_AUDIO_TYPE) {
  122. return MP4GetTrackTimeScale(mp4File, audioTrackId);
  123. }
  124. return 0;
  125. }
  126. extern "C" u_int16_t MP4AV_AudioGetSamplingWindow(
  127. MP4FileHandle mp4File, 
  128. MP4TrackId audioTrackId)
  129. {
  130. u_int8_t audioType = 
  131. MP4GetTrackAudioType(mp4File, audioTrackId);
  132. if (audioType == MP4_INVALID_AUDIO_TYPE) {
  133. return 0;
  134. }
  135. if (MP4_IS_MP3_AUDIO_TYPE(audioType)) {
  136. MP4AV_Mp3Header mp3Hdr =
  137. GetMp3Header(mp4File, audioTrackId);
  138. return MP4AV_Mp3GetHdrSamplingWindow(mp3Hdr);
  139. } else if (MP4_IS_AAC_AUDIO_TYPE(audioType)) {
  140. u_int8_t* pAacConfig = NULL;
  141. u_int32_t aacConfigLength;
  142. MP4GetTrackESConfiguration(
  143. mp4File, 
  144. audioTrackId,
  145. &pAacConfig,
  146. &aacConfigLength);
  147. if (pAacConfig == NULL || aacConfigLength < 2) {
  148. return 0;
  149. }
  150. u_int32_t samplingWindow =
  151. MP4AV_AacConfigGetSamplingWindow(pAacConfig);
  152. free(pAacConfig);
  153. return samplingWindow;
  154. } else if (audioType == MP4_PCM16_AUDIO_TYPE) {
  155. MP4Duration frameDuration =
  156. MP4GetSampleDuration(mp4File, audioTrackId, 1);
  157. // assumes track time scale == sampling rate
  158. // and constant frame size was used
  159. return frameDuration;
  160. }
  161. return 0;
  162. }