1. 程式人生 > >Android下音訊進行轉碼(一)

Android下音訊進行轉碼(一)

一. 音訊的簡介 先從音訊壓縮的原理講起, 人的聽力範圍是20hz--20khz, 而根據奈奎斯特定理, 要想不產生低頻失真,則取樣頻率至少是錄製的最高頻率的兩倍。 所以CD音質的取樣頻率是44100hz.   一秒取樣44100次, 每次的資料量是16*2=32bit(立體聲有2個聲道)。 所以1秒的資料量是44100*32/8=176k. 這麼大的資料量,為了方便傳輸和儲存,是需要壓縮的。 目前主流的音訊格式有MP3,WMA還有AAC。3種格式各有各的特點和用處。 ACC格式:        中文稱為“高階音訊編碼”,出現於1997年,基於 MPEG-2的音訊編碼技術。由Fraunhofer IIS、杜比實驗室、AT&T、Sony(索尼)等公司共同開發,目的是取代MP3格式。2000年,MPEG-4標準出現後,AAC 重新集成了其特性,加入了SBR技術和PS技術,為了區別於傳統的 MPEG-2 AAC 又稱為 MPEG-4 AAC。
       AAC分兩種, 一種是mpeg-2 aac(主要是adts), 還有一種mpeg4-aac(.m4a)。 前者是針對傳輸的ts流, 而後者有方便儲存的mp4容器。 AAC針對不同效能和頻寬的應用場合, 有三種profile, LC(low complexity), 增加SBR(aac plus或HE AAC), 增加PS(aac plus plus或HE AAC+)。      目前常用的AAC編碼器有FAAC和NERO AAC,前者是開源的,只支援LC Profile;後者不開源,支援到HE-AAC+。 目前千千靜聽和FOOBAR的AAC轉碼都使用NERO AAC外掛。 針對手機的音質,選擇預置中的 CBR/Stereo-48kbps 或 VBR/Stereo-Portable,40-50kbps即可。要勾選“匯出ISO 13818-7 AAC 軌道”,這樣輸出的是符合mpeg-2 aac標準的AAC TS流。 否者輸出的是.M4A。 注意,千千靜聽轉碼有個問題, 非44100HZ取樣的WAV轉出來都會變調。 
    優點:相對於mp3格式,AAC格式的音質更佳,檔案更小。 

   不足:AAC屬於有失真壓縮的格式,相對於APE和FLAC等時下流行的無損格式,音色“飽滿度”差距比較大。目前傳輸速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC頭上“小巧”的光環不再。 
MP3格式:        MP3是一種音訊壓縮技術,其全稱是動態影像專家壓縮標準音頻層面3(Moving Picture Experts Group Audio Layer III),簡稱為MP3。它被設計用來大幅度地降低音訊資料量。利用 MPEG Audio Layer 3 的技術,將音樂以1:10 甚至 1:12 的壓縮率,壓縮成容量較小的檔案,而對於大多數使用者來說重放的音質與最初的不壓縮音訊相比沒有明顯的下降。它是在1991年由位於德國
埃爾朗根
的研究組織Fraunhofer-Gesellschaft的一組工程師發明和標準化的。用MP3形式儲存的音樂就叫作MP3音樂,能播放MP3音樂的機器就叫作MP3播放器。
主要特點: 

1、MP3是一個數據壓縮格式;

2、它丟棄掉脈衝編碼調製(PCM)音訊資料中對人類聽覺不重要的資料(類似於JPEG是一個有損影象壓縮),從而達到了小得多的檔案大小;

3、MP3音訊可以按照不同的位速進行壓縮,提供了在資料大小和聲音質量之間進行權衡的一個範圍。MP3格式使用了混合的轉換機制將時域訊號轉換成頻域訊號。

4、32波段多相積分濾波器(PQF);

5、36或者12 tap 改良離散餘弦濾波器(MDCT);每個子波段大小可以在0...1和2...31之間獨立選擇;

6、MP3不僅有廣泛的使用者端軟體支援,也有很多的硬體支援比如行動式媒體播放器(指MP3播放器)DVD和CD播放器。

WMA格式:

    WMA的全稱是Windows Media Audio,是微軟力推的一種音訊格式。WMA格式是以減少資料流量但保持音質的方法來達到更高的壓縮率目的,其壓縮率一般可以達到1:18,生成的檔案大小隻有相應MP3檔案的一半。這對只裝配32M的機型來說是相當重要的,支援了WMA和RA格式,意味著32M的空間在無形中擴大了2倍。此外,WMA還可以通過DRM(Digital Rights Management)方案加入防止拷貝,或者加入限制播放時間和播放次數,甚至是播放機器的限制,可有力地防止盜版。 主要特點:      WMA可以用於多種格式的編碼檔案中。應用程式可以使用Windows Media Format SDK進行WMA格式的編碼和解碼。一些常見的支援WMA的應用程式包括Windows Media Player、Windows Media Encoder、RealPlayer、Winamp等等。其它一些平臺,例如Linux和移動裝置中的軟硬體也支援此格式。

優點

WMA 7之後的WMA支援證書加密,未經許可(即未獲得許可證書),即使是非法拷貝到本地,也是無法收聽的。同時,微軟公司開始時宣稱的:同文件比MP3體積小一倍而音質不變,也得到了兌現。事實上,這個說法,僅僅適用於低位元率的情況,另外,微軟公司在WMA 9大幅改進了其引擎,實際上幾乎可以在同文件同音質下比MP3體積少1/3左右,因此非常適合用於網路串流媒體及行動裝置。

缺點

在高位元率的渲染能力低下,同音源的一個320kbps的MP3與比較192kbps的WMA相比,音質和渲染力很容易分別出是前者較優。與MP3相同,WMA也是有損資料壓縮的檔案格式,對於有更高要求的使用者來說WMA並不是一個適合的格式。(9.0版本支援無失真壓縮)此外WMA也與MP3一樣同為有專利版權的檔案格式。支援的裝置需要購買使用版權。

wma格式和avi格式,mp4格式是一樣的,它是有聲音有圖片的。但mp3不支援avi。mp4格式的只支援wma。

二.PM3格式與PCM格式的編碼/解碼/合成


MP3格式與PCM格式編碼/解碼/合成,由於轉碼效率來說C程式碼的速度比Java程式碼的效率高,所以採用JNI技術,實現具體的程式碼是由C程式碼完成的。

 1. MP3格式與PCM格式編碼/解碼/合成的步驟如下: 

 Java程式碼呼叫步驟: 

  (1).需要在Libs下面匯入Libmad.so庫檔案 

     注意: 如需修改so庫名稱,需要在jni原始碼中的Android.MK配置檔案中進行修改.

  (2).載入本地so庫檔案到記憶體中

 static {

        System.loadLibrary("mad");     }
 注意: 如需修改載入本地so庫的類的全路徑,需要重新打包so庫檔案,需要修改對應C程式碼呼叫Java的類的全路徑。   (3).宣告本地方法
 1.關閉解碼/編碼方法 
    public native static void close();
2.PM3格式解碼成為PCM格式 兩個方法都是進行解碼為PCM格式 引數:       mp3File    需要進行轉換MP3格式檔案的全路徑       mp3PCM     需要生成PCM格式的全路徑
  public native static int decodeMp3ToPCM(String mp3File, String mp3PCM);   public native static int decodeMp3ToPCM2(String mp3File, String mp3PCM);
3.PCM格式合成     mix2PCMToPCM2方法描述: 將兩個PCM格式的音訊檔案進行合成為一個音訊格式的檔案。
 引數:sourcePcm 源PCM格式檔案的全路徑            mp3PCM 需要進行合成PCM格式檔案的全路徑        mixPCM 合成後PCM格式檔案的全路徑
  public native static int mix2PCMToPCM2(String sourcePCM, String mp3PCM,String mixPCM);
4.PCM格式編碼為PM3格式    convert方法描述: 該方法功能是將PCM格式轉換為PM3格式    引數:            input  源pcm格式檔案的全路徑           output   生成MP3格式檔案的全路徑           bufferSize  快取區大小
public native static int convert(String input, String output, int bufferSize);
(4).呼叫本地方法 1.PM3格式解碼為PCM格式  引數:  LeadMusicMp3 為MP3檔案的全路徑  LeadMusicPcm 轉換為PCM檔案的全路徑   返回值:lead 為解碼進度      lead=0 時解碼完成。
int lead = AudioMp3AndMp3Mix.decodeMp3ToPCM2(LeadMusicMp3, LeadMusicPcm);
 2.PCM合成  mix2PCMToPCM2方法為兩個PCM合併為一個PCM格式檔案 
引數:  BackPcmPath 參與合成的PCM檔案的全路徑  LeadMusicPcmPath 參與合成的PCM檔案的全路徑  LeadMusicPcmMixPath 合成後生成PCM檔案的全路徑 返回值: r為合成進度  r=0是合成完成
int r = AudioMp3AndMp3Mix.mix2PCMToPCM2(BackPcmPath, LeadMusicPcmPath, LeadMusicPcmMixPath);
3.獲取快取區大小  
    /**      * 錄製頻率,單位hz,能例項化AudioRecord物件的時候,會出錯。我開始寫成11025就不行。這取決於硬體裝置      * 設定音訊取樣率,44100是目前的標準,但是某些裝置仍然支援22050,16000,11025      */     private int sampleRateInHz = 44100;
    /**      * 設定音訊的錄製的聲道CHANNEL_IN_STEREO為雙聲道,CHANNEL_CONFIGURATION_MONO為單聲道      */     private int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
    /**      * 音訊資料格式:PCM 16位每個樣本。保證裝置支援。PCM 8位每個樣本。不一定能得到裝置支援。      */     private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
    int bufferSize = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
4.PCM格式編碼PM3格式   convert方法是把PCM格式編碼為PM3格式檔案
引數:     LeadMusicPcmMixPath:參與編碼的PCM檔案的全路徑    LeadMusicMp3MixPath:編碼後生成的PM3檔案的全路徑    bufferSize:獲取最小的快取大小  
  int rs = AudioEncodeAndDeCode.convert(LeadMusicPcmMixPath, LeadMusicMp3MixPath, bufferSize);
 三.MP3與MP4進行合成  MP3與MP4合成的步驟如下:   (1).在Libs資料夾下匯入isoviewer-1.0-RC-35.jar包    (2).MP3與MP4進行合成程式碼 引數說明:  Videomp4 : 參與合成的視訊檔案全路徑  MusicMP3:  參與合成的音訊檔案全路徑
    public void MixDealVideo() {         new Thread() {             public void run() {                 try {                     Movie countVideo = MovieCreator.build(Videomp4);                     MP3TrackImpl MP3Track = new MP3TrackImpl(                             new FileDataSourceImpl(MusicMP3));                     countVideo.addTrack(MP3Track);                     {                         Container out = new DefaultMp4Builder()                                 .build(countVideo);                         FileOutputStream fos = new FileOutputStream(new File(                                 ResourceMp4));                         out.writeContainer(fos.getChannel());                         fos.close();                     }                 } catch (IOException e) {                     e.printStackTrace();                 }             };         }.start();     }