Android下音訊進行轉碼(一)
不足: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年由位於德國
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"); } |
1.關閉解碼/編碼方法
public native static void close(); |
public native static int decodeMp3ToPCM(String mp3File, String mp3PCM); public native static int decodeMp3ToPCM2(String mp3File, String mp3PCM); |
引數:sourcePcm 源PCM格式檔案的全路徑 mp3PCM 需要進行合成PCM格式檔案的全路徑 mixPCM 合成後PCM格式檔案的全路徑
public native static int mix2PCMToPCM2(String sourcePCM, String mp3PCM,String mixPCM); |
public native static int convert(String input, String output, int bufferSize); |
int lead = AudioMp3AndMp3Mix.decodeMp3ToPCM2(LeadMusicMp3, LeadMusicPcm); |
引數: BackPcmPath 參與合成的PCM檔案的全路徑 LeadMusicPcmPath 參與合成的PCM檔案的全路徑 LeadMusicPcmMixPath 合成後生成PCM檔案的全路徑 返回值: r為合成進度 r=0是合成完成
int r = AudioMp3AndMp3Mix.mix2PCMToPCM2(BackPcmPath, LeadMusicPcmPath, LeadMusicPcmMixPath); |
/** * 錄製頻率,單位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); |
引數: LeadMusicPcmMixPath:參與編碼的PCM檔案的全路徑 LeadMusicMp3MixPath:編碼後生成的PM3檔案的全路徑 bufferSize:獲取最小的快取大小
int rs = AudioEncodeAndDeCode.convert(LeadMusicPcmMixPath, LeadMusicMp3MixPath, bufferSize); |
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(); } |