『壹』 android中mediamuxer和mediacodec的區別
Android中MediaMuxer和MediaCodec用例
在Android的多媒體類中,MediaMuxer和MediaCodec算是比較年輕的,它們是JB 4.1和JB 4.3才引入的。前者用於將音頻和視頻進行混合生成多媒體文件。缺點是目前只能支持一個audio track和一個video track,而且僅支持mp4輸出。不過既然是新生事物,相信之後的版本應該會有大的改進。MediaCodec用於將音視頻進行壓縮編碼,它有個比較牛X的地方是可以對Surface內容進行編碼,如KK 4.4中屏幕錄像功能就是用它實現的。
注意它們和其它一些多媒體相關類的關系和區別:MediaExtractor用於音視頻分路,和MediaMuxer正好是反過程。MediaFormat用於描述多媒體數據的格式。MediaRecorder用於錄像+壓縮編碼,生成編碼好的文件如mp4, 3gpp,視頻主要是用於錄制Camera preview。MediaPlayer用於播放壓縮編碼後的音視頻文件。AudioRecord用於錄制PCM數據。AudioTrack用於播放PCM數據。PCM即原始音頻采樣數據,可以用如vlc播放器播放。當然了,通道采樣率之類的要自己設,因為原始采樣數據是沒有文件頭的,如:
vlc --demux=rawaud --rawaud-channels 2 --rawaud-samplerate 44100 audio.pcm
回到MediaMuxer和MediaCodec這兩個類,它們的參考文檔見http://developer.android.com/reference/android/media/MediaMuxer.html和http://developer.android.com/reference/android/media/MediaCodec.html,里邊有使用的框架。這個組合可以實現很多功能,比如音視頻文件的編輯(結合MediaExtractor),用OpenGL繪制Surface並生成mp4文件,屏幕錄像以及類似Camera app里的錄像功能(雖然這個用MediaRecorder更合適)等。
這里以一個很無聊的功能為例,就是在一個Surface上畫圖編碼生成視頻,同時用MIC錄音編碼生成音頻,然後將音視頻混合生成mp4文件。程序本身沒什麼用,但是示例了MediaMuxer和MediaCodec的基本用法。本程序主要是基於兩個測試程序:一個是Grafika中的SoftInputSurfaceActivity和HWEncoderExperiments。它們一個是生成視頻,一個生成音頻,這里把它們結合一下,同時生成音頻和視頻。基本框架和流程如下:
首先是錄音線程,主要參考HWEncoderExperiments。通過AudioRecord類接收來自麥克風的采樣數據,然後丟給Encoder准備編碼:
AudioRecord audio_recorder;
audio_recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, buffer_size);
// ...
audio_recorder.startRecording();
while (is_recording) {
byte[] this_buffer = new byte[frame_buffer_size];
read_result = audio_recorder.read(this_buffer, 0, frame_buffer_size); // read audio raw data
// …
presentationTimeStamp = System.nanoTime() / 1000;
audioEncoder.offerAudioEncoder(this_buffer.clone(), presentationTimeStamp); // feed to audio encoder
}
這里也可以設置AudioRecord的回調(通過())來觸發音頻數據的讀取。offerAudioEncoder()里主要是把audio采樣數據送入音頻MediaCodec的InputBuffer進行編碼:
ByteBuffer[] inputBuffers = mAudioEncoder.getInputBuffers();
int inputBufferIndex = mAudioEncoder.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(this_buffer);
...
mAudioEncoder.queueInputBuffer(inputBufferIndex, 0, this_buffer.length, presentationTimeStamp, 0);
}
下面,參考Grafika-SoftInputSurfaceActivity,並加入音頻處理。主循環大體分四部分:
try {
// Part 1
prepareEncoder(outputFile);
...
// Part 2
for (int i = 0; i < NUM_FRAMES; i++) {
generateFrame(i);
drainVideoEncoder(false);
drainAudioEncoder(false);
}
// Part 3
...
drainVideoEncoder(true);
drainAudioEncoder(true);
} catch (IOException ioe) {
throw new RuntimeException(ioe);
} finally {
// Part 4
releaseEncoder();
}
第1部分是准備工作,除了video的MediaCodec,這里還初始化了audio的MediaCodec:
MediaFormat audioFormat = new MediaFormat();
audioFormat.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
audioFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
...
mAudioEncoder = MediaCodec.createEncoderByType(AUDIO_MIME_TYPE);
mAudioEncoder.configure(audioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mAudioEncoder.start();
第2部分進入主循環,app在Surface上直接繪圖,由於這個Surface是從MediaCodec中用createInputSurface()申請來的,所以畫完後不用顯式用queueInputBuffer()交給Encoder。drainVideoEncoder()和drainAudioEncoder()分別將編碼好的音視頻從buffer中拿出來(通過dequeueOutputBuffer()),然後交由MediaMuxer進行混合(通過writeSampleData())。注意音視頻通過PTS(Presentation time stamp,決定了某一幀的音視頻數據何時顯示或播放)來同步,音頻的time stamp需在AudioRecord從MIC採集到數據時獲取並放到相應的bufferInfo中,視頻由於是在Surface上畫,因此直接用dequeueOutputBuffer()出來的bufferInfo中的就行,最後將編碼好的數據送去MediaMuxer進行多路混合。
注意這里Muxer要等把audio track和video track都加入了再開始。MediaCodec在一開始調用dequeueOutputBuffer()時會返回一次INFO_OUTPUT_FORMAT_CHANGED消息。我們只需在這里獲取該MediaCodec的format,並注冊到MediaMuxer里。接著判斷當前audio track和video track是否都已就緒,如果是的話就啟動Muxer。
總結來說,drainVideoEncoder()的主邏輯大致如下,drainAudioEncoder也是類似的,只是把video的MediaCodec換成audio的MediaCodec即可。
while(true) {
int encoderStatus = mVideoEncoder.dequeueOutputBuffer(mBufferInfo, TIMEOUT_USEC);
if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
...
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
encoderOutputBuffers = mVideoEncoder.getOutputBuffers();
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
MediaFormat newFormat = mAudioEncoder.getOutputFormat();
mAudioTrackIndex = mMuxer.addTrack(newFormat);
mNumTracksAdded++;
if (mNumTracksAdded == TOTAL_NUM_TRACKS) {
mMuxer.start();
}
} else if (encoderStatus < 0) {
...
} else {
ByteBuffer encodedData = encoderOutputBuffers[encoderStatus];
...
if (mBufferInfo.size != 0) {
mMuxer.writeSampleData(mVideoTrackIndex, encodedData, mBufferInfo);
}
mVideoEncoder.releaseOutputBuffer(encoderStatus, false);
if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
break;
}
}
}
第3部分是結束錄制,發送EOS信息,這樣在drainVideoEncoder()和drainAudioEncoder中就可以根據EOS退出內循環。第4部分為清理工作。把audio和video的MediaCodec,MediaCodec用的Surface及MediaMuxer對象釋放。
最後幾點注意:
1. 在AndroidManifest.xml里加上錄音許可權,否則創建AudioRecord對象時鐵定失敗:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
2. 音視頻通過PTS同步,兩個的單位要一致。
3. MediaMuxer的使用要按照Constructor -> addTrack -> start -> writeSampleData -> stop 的順序。如果既有音頻又有視頻,在stop前兩個都要writeSampleData()過。
Code references:
Grafika: https://github.com/google/grafika
Bigflake: http://bigflake.com/mediacodec/
HWEncoderExperiments:https://github.com/OnlyInAmerica/HWEncoderExperiments/tree/audioonly/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperiments
Android test:http://androidxref.com/4.4.2_r2/xref/cts/tests/tests/media/src/android/media/cts/
http://androidxref.com/4.4.2_r2/xref/pdk/apps/TestingCamera2/src/com/android/testingcamera2/CameraRecordingStream.java
『貳』 移動端頁面最好用的框架是哪幾個
1、jQuery Mobile
jQuery Mobile 是 jQuery 在手機上和平板設備上的版本。jQuery Mobile 不僅會給主流移動平台帶來jQuery核心庫,而且會發布一個完整統一的jQuery移動UI框架。支持全球主流的移動平台。jQuery Mobile開發團隊說:能開發這個項目,我們非常興奮。移動Web太需要一個跨瀏覽器的框架,讓開發人員開發出真正的移動Web網站。
2、jQTouch
jQTouch 是一個 jQuery 的插件,主要用於手機上的 Webkit 瀏覽器上實現一些包括動畫、列表導航、默認應用樣式等各種常見UI效果的 JavaScript 庫。支持包括 iPhone、Android 等手機。
3、DHTMLX Touch
DHTMLX Touch是一個免費的HTML5/JavaScript框架,專門為觸摸屏設備而優化。為您帶來快速開發工藝精美的移動Web應用程序的能力。DHTMLX Touch UI Designer是一個可視化的編輯器用於構建移動用戶界面。它能夠幫您以最少的編碼構建一流的用戶界面。在其主頁上提供一些示例可以展示DHTMLX Touch強大的用戶界面。包括一個menu app for the iPad (適用於開發餐廳應用) 和Book Shop (一個電子書店應用)。
4、Mobilize.js
Mobilize.js是一個開源的HTML5-JavaScript框架用於從任何現在有標准網站快速,簡便地構建移動網站。這個框架其實就是將需要在移動設備上顯示的部分頁面以jQuery Mobile的默認主題顯示,而不是實現一個全新完整的移動頁面。Mobilize.js 可用於任意網站,但對於基於WordPress和Sphinx的網站不需要使用該框架轉換,因為已經有非常多的插件可以使用。
5、The M Project
The-M-Project是另外一個強大的JavaScript框架,它利用HTML5新的特性來更好和更簡便地開發移動應用。這個框架遵循著名的MVC軟體架構模式。它還支持離線,所以你的用戶可以在沒有連接網路的情況下繼續操作(當下次有連線的時候,再將數據同步到伺服器中)。提供優秀的文檔(這個項目擁有一個引導新用戶入門的開發指南)。可以查看提供的示例來對該項目有一個初目的了解。這些示例包括:ToDo App(待辦事項目應用) 和 KitchenSink (這個示例包括這個框架提供的所有UI元素)。
6、WebApp.Net
WebApp.Net 提供了很多的 API,因此可以幫助你節省很多工作了。不需要花時間去進行 Ajax 調用的編碼,因為已經內置了,另外還有很多其它內置功能,提供了詳細的文檔和應用演示。
7、Wijmo
Wijmo是一個基於jQuery UI的UI部件的套件。Wijmo部件進行了優化客戶端Web開發和利用jQuery的優越的性能和易用性的力量。所有的Wijmo部件都配備了20多個主題和支持ThemeRoller。
8、960 Grid on jQuery-Mobile
jquery-mobile-960 是一個用於移動 Web 開發的網格框架,綜合了 960.gs 的靈活性和 jQuery Mobile 的方便性。它的目的是讓 jQuery Mobile 布局更加的靈活,使得應用應許在移動終端更加易用。
9、Sencha Touch Framework
Sencha Touch 是世界上第一個基於 HTML5 的移動 Web 開發框架,支持最新的 HTML5 和 CSS3 標准,全面兼容 Android 和 Apple iOS 設備,提供了豐富的 WEB UI 組件,可以快速的開發出運行於移動終端的應用程序。Shencha是第一個使用HTML5,CSS和JavaScript並且支持音頻/視頻,本地存儲,圓角,漸變背景以及陰影的開發框架。
10、NimbleKit
NimbleKit 是為 iOS 設備構建應用程序最快速的方式,你不需要知道 Objective-C 或者 iOS SDK,你只需結合 JavaScript 代碼編寫 HTML 頁面就可以了。
11、Touchy™ Boilerplate
Touchy Boilerplate 是一個用來創建移動web app,包括HTML模板,Meta tag等的工具。Touchy可以支持動態頁面導航,固定頁頭,滾動內容,瀏覽歷史記錄等功能。Touchy使用jQuery或者 Zepto.JS。
12、PhoneGap
PhoneGap是一個用基於HTML,CSS和JavaScript的,創建移動跨平台移動應用程序的快速開發平台。它使開發者能夠利用iPhone,Android,Palm,Symbian,WP7,Bada和Blackberry智能手機的核心功能——包括地理定位,加速器,聯系人,聲音和振動等,此外PhoneGap擁有豐富的插件,可以以此擴展無限的功能。PhoneGap是免費的,但是它需要特定平台提供的附加軟體,例如iPhone的iPhone SDK,Android的Android SDK等,也可以和DW5.5配套開發。使用PhoneGap只比為每個平台分別建立應用程序好一點點,因為雖然基本代碼是一樣的,但是你仍然需要為每個平台分別編譯應用程序。
13、joshfire
Joshfire是一個開源的跨設備開發框架,幫助開發者創建可以在多種設備上運行的web app。它使用HTML5和JavaScript,並且允許開發者快速整合本地應用和特定的web應用。Joshfire可以讓你的應用接受鍵盤,滑鼠,觸摸屏,遙控器等設備的輸入。Joshfire支持Node.JS。4.Sencha Touch:基於HTML5的移動網頁開發框架。
14、 Julia
Julia框架由基本CSS3文件、JS庫和各個平台的運行庫構成。不像PhoneGap,Julia不僅僅包含調用本機代碼的介面層,它還包含 Model-View-Controller(MVC)支持,Delegation支持,OAuth支持,非同步資料庫存取介面,HTML選擇符(類jQuery調用介面),HTML模版(允 許嵌入JS代碼)等應用開發必備的API介面。 基於Julia的應用開發就像網站開發那麼簡單,是的,你終於可以用HTML5開發一個完整的、跨平台 的、不亞於本機代碼的、易於維護的移動應用了!大幕即將揭曉,讓我們一起進入移動開發的新時代
15、SproutCore HTML5 Application Framework
SproutCore 是一個 HTML5 移動 Web 開發框架,它的目標是在無需瀏覽器插件的情況下,在瀏覽器中位應用程序提供極佳的桌面效果。
16、Titanium
這是一個強大的,健壯的移動Web開發框架。能夠讓使用現有的HTML, CSS和JavaScript知識來為 iOS和Android平台開發原生移動應用。作為一個越來越大的移動Web框架,它擁有超過300個的APIs和活躍的開發者社區。你從這個社區中得到每一個開發人員的幫助。Titanium Mobile支持原生的iOS和Android UI元素如Table views, tabs, switches和popovers。它提供能夠與移動設備的攝像頭和本地文件存儲系統相交互的特性。
17、Lungo.js
Lungo.js 是一個採用HTML5, CSS3 和JavaScript技術實現的移動Web應用程序開發框架。利用這框架開發的應用程序可運行所有流行的平台包括:iOS, Android, Blackberry 和 WebOs。它還支持觸摸事件如:tap, double-tap和swipe。整個框架沒有用到任何圖片包括圖標,所有都矢量化。可以在這個框架中使用HTML5擁有的一些特性如:WebSQL, 地理位置定位,歷史或設備方向等。Lungo.js是一個模塊化並且完全可定製的框架。
18、xui.js
有時候你可能需要一個超輕量級的框架,只要擁有用於開發標准客戶端所需要的功能如:DOM操作,事件處理,Ajax和一些動畫效果。如果是這樣的話,這個框架剛好非常適合你。整個框架採用GZIP壓縮完之後只有4.2 KB。
19、EmbedJS
EmbedJS是一個用於嵌入式設備的JavaScript框架如:行動電話,TVs、tablets和so forth。EmbedJS強大之處在於,它擁有專門為特定平台和瀏覽器如iOS, Firefox, Android等提供相應的開發版本。這樣就能夠以最少的代碼,為用戶提供最佳的體驗。而且假如你喜歡自己定製,可以利用其提供的EmbedJS Build tool工具實現。EmbedJS基於Dojo實現,所以你如果熟悉Dojo API語法,那EmbedJS將是你最佳的選擇。
20、zepto.js
zepto.js是一個專為mobile WebKit瀏覽器(如:Safari和Chrome)而開發的一個JavaScript框架。它標榜自己在其簡約的開發理念,能夠幫助開發人員簡單、快速地完成開發交付任務。更重要的是這個JS框架,是超輕量級的,只有5KB。zepto.js的語法借鑒並且兼容jQuery。
21、Baker
Baker是用來在iPad或者iPhone平台上發布互動式的電子書或者電子雜志的HTML5電子書框架。
22、ChocolateChip-UI
ChocolateChip-UI 是一個手機移動 Web 開發框架,採用 HTML5, WAML, CSS 和 JavaScript等技術實現。基於 ChocolateChip JavaScript 框架,包含最新的 ChUI.JS 和 ChUI.css.
23、Magazine Grid
Magazine Grid 是一個超現代的 CSS 框架,用於 iPad 和 iPhone 手機,使用類似雜志的設計風格。Magazine Grid 可讓用戶使用 HTML5 元素來組織雜志頁,非常輕量級(<4k),在移動設備上載入非常快,對老的瀏覽器也支持。
24、Kendo UI
Kendo UI是一個強大的框架用於快速HTML5 UI開發。基於最新的HTML5、CSS3和JavaScript標准。 Kendo UI包含了開發現代JavaScript開發所需要的所有一切,包括:強大的數據源,通用的拖拉(Drag-and-Drop)功能,模板,和UI控制項。
25、HTML App Host Framework
這是一個用於構建基於 Windows Phone 7 的 HTML/JavaScript 託管框架,使用 HTML5 技術。該框架由支持在標准 xap 格式中嵌入 html 應用的控制項。
『叄』 android開發框架有哪些
主要總結了7個好用的android 開發框架推薦給你:
一、 Afinal
Afinal是一個Android的ioc,orm框架,內置了四大模塊功能:,FinalBitmap,FinalDb,FinalHttp。通過,我們可以通過註解的方式進行綁定ui和事件。通過finalBitmap,我們可以方便的載入bitmap圖片,而無需考慮oom等問題。通過finalDB模塊,我們一行代碼就可以對android的sqlite資料庫進行增刪改查。通過FinalHttp模塊,我們可以以ajax形式請求http數據。
功能:
一個android的ioc,orm框架,內置了四大模塊功能:,FinalBitmap,FinalDb,FinalHttp。通過,我們可以通過註解的方式進行綁定ui和事件。通過finalBitmap,我們可以方便的載入bitmap圖片,而無需考慮oom等問題。通過finalDB模塊,我們一行代碼就可以對android的sqlite資料庫進行增刪改查。通過FinalHttp模塊,我們可遲戚以以ajax形式請求http數據。
優點:功能比較全面,文檔完善,代碼效率比較高。
缺點:沒有項目demo,框架的時間比較久,代碼冗餘比較多(這也是無可避免的),文檔比較老跟不上代碼更新進度。
二、 xUtils
xUtils:可以說是Afinal的升級版。
xUtils 包含了簡旦陪很多實用的android工具。
xUtils 支持大文件上傳,更全面的http請求協議支持(10種謂詞),擁有更加靈活的ORM,更多的事件註解支持且不受混淆影響...
xUitls 最低兼容android 2.2 (api level 8)
三、
是一個免費的開源的、簡易的、遵循Apache2開源協議發布的Android開發框架,其開發宗旨是簡單、快速的進行Android應用程序的開發,包含Android
mvc、簡易sqlite orm、ioc模塊、封裝Android
httpclitent的http模塊,具有快速構建文件緩存功能,無需考慮緩存文件的格式,都可以非常輕松的實現緩存,它還基於文件緩存模塊實現了圖片緩存功能,在android中載入的圖片的時候,對oom的問題,和對載入圖片錯位的問題都輕易解決。他還包括了一個手機開發中經常應用的實用工具類,如日誌管理,配置文件管理,android下載器模塊,網路切換檢測等等工具
四、 LoonAndroid
如果你想看ui方面的東西,這里沒有,想要看牛逼的效果這里也沒有。這只是純實現功能的框架,它的目標是節省代碼量,降低耦合,讓代碼層次看起來更清晰。整個框架一部分是網上的,一部分是我改的,為了適應我的編碼習慣,還有一部分像orm完全是網上的組件。在此感謝那些朋友們。
整個框架式的初衷是為了偷懶,之前都是一個功能一個jar,做項目的時候拉進去,這樣對於我來說依然還是比較麻煩。最後就導致我把所有的jar做成了一個工具集合包。
有很多框架都含有這個工具集合里的功能,這些不一定都好用,因為這是根據我個人使用喜歡來實現的,如果你們有自己的想法,可以自己把架包解壓了以後,源碼拉出來改動下。
目前很多框架都用到了註解,除了沒有入侵我們應用的代碼以外,其他的基本上都有,要麼是必須繼承框架裡面的activity,要麼是必須在activity的oncreat裡面調用某個方法。
整個框架式不同於,Roboguice等ioc框架,這是一個類似spring的實現方式。在整應用的生命周期中找到切入點,然後對activity的生命周期進行攔截,然後插入自己的功能。
五、
又叫KJLibrary,是一個android的orm 和 ioc
框架。同時封裝了android中的Bitmap與Http操作的框架,使其更加簡單易用;
的設計思想是通過封裝Android原生SDK中復雜的復雜操作而達到簡化Android應用級開發,最終實現快速而又安全的開發APP。我們提倡用最少的代碼,完成最多的操作,用最高的效率,完成最復雜的功能。
功能:
一個android的orm 和 ioc 框架。同時封裝了android中的Bitmap與Http操作的框架,使其更加簡單易用;
開發框架的設計思想是通過封攔蠢裝Android原生SDK中復雜的復雜操作而達到簡化Android應用級開發,最終實現快速而又安全的開發APP。總共分為五大模塊:UILibrary,HttpLibrary,DBLibrary。
六、 dhroid
dhroid 是基於android 平台,
極速開發框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能強大、輕量級、易擴展.使你更快,更好的開發商業級別應用
功能:
1.Ioc容器: (用過spring的都知道)視圖注入,對象注入,介面注入,解決類依賴關系
2.Eventbus: android平台事件匯流排框架,獨創延時事件,事件管理輕松
3.Dhnet: 網路http請求的解決方案,使用簡單,減少代碼,自帶多種網路訪問緩存策略
4.adapter模塊: 數據綁定輕松,不用寫多餘的adapter,天生網路支持(一行代碼搞定載入,刷新問題)
5.DhDb: android中sqlite的最輕量orm框架(增刪改查輕松搞定)
6.Perference: android自帶Perference 升級版,讓你的Perference更強大,更方便
工具集合 JSONUtil(安全處理json),ViewUtil(數據綁定更快) (非同步任務工具)...
七、
SmartAndroid是一套給
Android開發者使用的應用程序開發框架和工具包。它提供一套豐富的標准庫以及簡單的介面和邏輯結構,其目的是使開發人員更快速地進行項目開發。使用
SmartAndroid可以減少代碼的編寫量,並將你的精力投入到項目的創造性開發上。
功能:
SmartAndroid 擁有全范圍的類庫,可以完成大多數通常需要的APP開發任務,包括:非同步網路操作相關所有功能、強大的圖片處理操作、輕量級ORM資料庫Sqlite庫、zip操作、動畫特效、Html等解析採集、事件匯流排EventBus/Otto、Gson(Json)、AQuery、主流所有UI控制項(例如:ActionbarSherlock,SlidingMenu,BottomView,Actionbar,DragListView等10多種UI庫)等。
『肆』 android 五大應用開發框架是什麼
1.Linux Kernel
2.Android Runtime
3.Libraries
4.Application Framework
5.Applications