Mp42Aac.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*****************************************************************
  2. |
  3. |    AP4 - MP4 to AAC File Converter
  4. |
  5. |    Copyright 2003 Gilles Boccon-Gibod & Julien Boeuf
  6. |
  7. |
  8. |    This file is part of Bento4/AP4 (MP4 Atom Processing Library).
  9. |
  10. |    Unless you have obtained Bento4 under a difference license,
  11. |    this version of Bento4 is Bento4|GPL.
  12. |    Bento4|GPL is free software; you can redistribute it and/or modify
  13. |    it under the terms of the GNU General Public License as published by
  14. |    the Free Software Foundation; either version 2, or (at your option)
  15. |    any later version.
  16. |
  17. |    Bento4|GPL is distributed in the hope that it will be useful,
  18. |    but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. |    GNU General Public License for more details.
  21. |
  22. |    You should have received a copy of the GNU General Public License
  23. |    along with Bento4|GPL; see the file COPYING.  If not, write to the
  24. |    Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  25. |    02111-1307, USA.
  26. |
  27.  ****************************************************************/
  28. /*----------------------------------------------------------------------
  29. |       includes
  30. +---------------------------------------------------------------------*/
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include "Ap4.h"
  34. #include "Ap4FileByteStream.h"
  35. #include "Ap4Atom.h"
  36. #include "Ap4File.h"
  37. #include "Ap4Sample.h"
  38. /*----------------------------------------------------------------------
  39. |       constants
  40. +---------------------------------------------------------------------*/
  41. #define BANNER "MP4 To AAC File Converter - Version 0.1an"
  42.                "(c) 2003-2005 Gilles Boccon-Gibod & Julien Boeuf"
  43.  
  44. /*----------------------------------------------------------------------
  45. |       PrintUsageAndExit
  46. +---------------------------------------------------------------------*/
  47. static void
  48. PrintUsageAndExit()
  49. {
  50.     fprintf(stderr, 
  51.             BANNER 
  52.             "nnusage: ap42aac [options] <input> <output>n");
  53.     exit(1);
  54. }
  55. /*----------------------------------------------------------------------
  56. |       WriteAdtsHeader
  57. +---------------------------------------------------------------------*/
  58. static AP4_Result
  59. WriteAdtsHeader(AP4_ByteStream* output, unsigned int frame_size)
  60. {
  61. unsigned char bits[7];
  62. bits[0] = 0xFF;
  63. bits[1] = 0xF1; // 0xF9 (MPEG2)
  64. bits[2] = 0x50;
  65. bits[3] = 0x80 | ((frame_size+7) >> 11);
  66.     bits[4] = ((frame_size+7) >> 3)&0xFF;
  67. bits[5] = (((frame_size+7) << 5)&0xFF) | 0x1F;
  68. bits[6] = 0xFC;
  69. return output->Write(bits, 7);
  70. /*
  71. 0:  syncword 12 always: '111111111111' 
  72. 12: ID 1 0: MPEG-4, 1: MPEG-2 
  73. 13: layer 2 always: '00' 
  74. 15: protection_absent 1  
  75. 16: profile 2  
  76. 18: sampling_frequency_index 4  
  77. 22: private_bit 1  
  78. 23: channel_configuration 3  
  79. 26: original/copy 1  
  80. 27: home 1  
  81. 28: emphasis 2 only if ID == 0 
  82. ADTS Variable header: these can change from frame to frame 
  83. 28: copyright_identification_bit 1  
  84. 29: copyright_identification_start 1  
  85. 30: aac_frame_length 13 length of the frame including header (in bytes) 
  86. 43: adts_buffer_fullness 11 0x7FF indicates VBR 
  87. 54: no_raw_data_blocks_in_frame 2  
  88. ADTS Error check 
  89. crc_check 16 only if protection_absent == 0 
  90. */
  91. }
  92. /*----------------------------------------------------------------------
  93. |       main
  94. +---------------------------------------------------------------------*/
  95. int
  96. main(int argc, char** argv)
  97. {
  98.     if (argc < 3) {
  99.         PrintUsageAndExit();
  100.     }
  101.     
  102. // create the input stream
  103.     AP4_ByteStream* input = 
  104.         new AP4_FileByteStream(argv[1],
  105.                                AP4_FileByteStream::STREAM_MODE_READ);
  106. // create the output stream
  107.     AP4_ByteStream* output =
  108.         new AP4_FileByteStream(argv[2],
  109.                                AP4_FileByteStream::STREAM_MODE_WRITE);
  110. // open the file
  111.     AP4_File* input_file = new AP4_File(*input);   
  112.     // get the movie
  113.     AP4_Movie* movie = input_file->GetMovie();
  114.     if (movie != NULL) {
  115.         AP4_List<AP4_Track>& tracks = movie->GetTracks();
  116.         AP4_Debug("Found %d Tracksn", tracks.ItemCount());
  117.     // get audio track
  118.         AP4_Track* audio_track = movie->GetTrack(AP4_Track::TYPE_AUDIO);
  119.         if (audio_track != NULL) {
  120.     // show info
  121.             AP4_Debug("Audio Track:n");
  122.             AP4_Debug("  duration: %ld msn", audio_track->GetDurationMs());
  123.             AP4_Debug("  sample count: %ldn", audio_track->GetSampleCount());
  124.     AP4_Sample     sample;
  125.             AP4_DataBuffer data;
  126.     AP4_Ordinal    index = 0;
  127.             while (AP4_SUCCEEDED(audio_track->ReadSample(index, sample, data))) {
  128.     WriteAdtsHeader(output, sample.GetSize());
  129.                 output->Write(data.GetData(), data.GetDataSize());
  130.                 AP4_Debug("  [%d] writing %ld bytes of data...n", 
  131.                             index, sample.GetSize());
  132.     index++;
  133.             }
  134.         } else {
  135.             AP4_Debug("No Audio Track foundn");    
  136.         }
  137.     } else {
  138.         AP4_Debug("No Movie in filen");
  139.     }
  140.     delete input_file;
  141.     input->Release();
  142.     output->Release();
  143.     return 0;
  144. }