版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄TOC\o"1-5"\h\z緒論2提出問(wèn)題2研究現(xiàn)狀2研究思路與方法4Android操作系統(tǒng)整體結(jié)構(gòu)分析6Android系統(tǒng)簡(jiǎn)介6Android整體結(jié)構(gòu)7Android架構(gòu)7特征9Android應(yīng)用組件9活動(dòng)(Activity)10服務(wù)(Services)11廣播接收者(Broadcastreceivers)12內(nèi)容提供者(Contentproviders)12AndroidNDK工具13FFmpeg流媒體平臺(tái)介紹與研究14FFmpeg簡(jiǎn)介14FFmpeg的編譯與運(yùn)行14流媒體播放器應(yīng)用分析16系統(tǒng)功能需求分析16系統(tǒng)整體結(jié)構(gòu)需求分析17系統(tǒng)業(yè)務(wù)流程分析18媒體播放模塊業(yè)務(wù)流程18媒體文件管理模塊業(yè)務(wù)流程19系統(tǒng)設(shè)置模塊業(yè)務(wù)流程21流媒體播放器應(yīng)用設(shè)計(jì)22系統(tǒng)設(shè)計(jì)模型22系統(tǒng)UI設(shè)計(jì)23媒體播放模塊設(shè)計(jì)23媒體文件管理模塊設(shè)計(jì)25系統(tǒng)設(shè)置模塊設(shè)計(jì)29系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)31SQLite簡(jiǎn)介31播放器庫(kù)表說(shuō)明31Android平臺(tái)的流媒體播放器應(yīng)用實(shí)現(xiàn)33Android應(yīng)用程序開(kāi)發(fā)33Android開(kāi)發(fā)環(huán)境33Android應(yīng)用開(kāi)發(fā)特點(diǎn)34FFmpeg移植36FFmpeg音視頻解碼39流媒體播放功能的開(kāi)發(fā)與實(shí)現(xiàn)41總結(jié)46致謝錯(cuò)誤!未定義書(shū)簽。參考文獻(xiàn)47#圖5-5音頻播放設(shè)計(jì)圖5.2.2.媒體文件管理模塊設(shè)計(jì)媒體文件展示在媒體文件管理模塊界面UI設(shè)計(jì)中主要分三個(gè)布局塊。如圖5-7所示,頂部布局塊,UI元素包括應(yīng)用logo、應(yīng)用標(biāo)題/歌曲標(biāo)題、刷新按鈕、系統(tǒng)設(shè)置按鈕;選項(xiàng)卡布局快,UI元素包括歷史記錄選項(xiàng)卡、視頻列表選項(xiàng)卡、音樂(lè)列表選項(xiàng)卡;內(nèi)容顯示布局塊中分三個(gè)主要內(nèi)容:視頻文件、音頻文件和歷史播放記錄。點(diǎn)擊選項(xiàng)卡可切換到相應(yīng)內(nèi)容的子界面,其中視頻文件內(nèi)容子界面與音頻內(nèi)容子界面頂部有一欄操作布局,視頻子界面的操作欄中只有包括一個(gè)刪除按鈕,音頻子界面的操作欄中包括左側(cè)的音頻播放/暫停按鈕和右側(cè)的刪除按鈕??刂埔纛l播放/暫停按鈕只有在音頻正在播放時(shí)才顯示。<7參沏T@13G?1G驚R13:39仔畳&■|i3GvlG穢k佃:04yintian_473834_mDQPlayer播放器正在播放:wc_Boy0:歷史視頻音樂(lè)歷史視頻音樂(lè)歷史視頻音樂(lè)<7參沏T@13G?1G驚R13:39仔畳&■|i3GvlG穢k佃:04yintian_473834_mDQPlayer播放器正在播放:wc_Boy0:歷史視頻音樂(lè)歷史視頻音樂(lè)歷史視頻音樂(lè)rnfwq_RuGuoA3.mp300:05:01M范瑋琪討fwq_QiCheng3.mp300:04:3811范瑋琪片名:第一季DVD追加時(shí)間:00:10:27片名:[USAVICH.監(jiān)獄...時(shí)間:00:01:32片名:[USAVICH.監(jiān)獄…時(shí)間:00:01:30廠翼私片名:【USAVICH.監(jiān)獄…L如鼻)時(shí)間:00:0130片名:[USAVICH.監(jiān)獄兔]….時(shí)間:00:01:30片名:[USAVICH.監(jiān)獄兔].時(shí)間:00:01:30片名:r(JSAVICH陣漱誹1X刪除片名:[USAVICH>獄兔].時(shí)間:00:01:30toutoudeai_1030291...未知00:03:42wc_Boys.mp3未知00:04:19whenyoubelieve.m...CelticWoman00:04:31yintian_473834_m.m...未知00:04:01yinweixian_390726_...未知00:04:18youexistin_1319052未知00:03:29"暫停播放芙刪除*71jjiipiint1nA圖5-7媒體文件管理模塊設(shè)計(jì)圖2.媒體文件操作長(zhǎng)按視頻或音頻列表項(xiàng)可彈出文件操作對(duì)話框,如5-8所示,對(duì)話框中有三個(gè)操作選項(xiàng),以列表方式布局,分別是“重命名”、“刪除”、“基本信息”選項(xiàng),以列表方式布局,分別是“重命名”、“刪除”、“基本信息”Q著掙罕働3GWG^llE21:26DQPlayer播放器歷史視頻音樂(lè)DQPlayer播放器歷史視頻音樂(lè)片名:[USAVICH>獄兔],…片名:[USAVICH>獄兔],…片名:[USAVICH,監(jiān)獄兔F:1文件操作重命名刪除基本信息LJ時(shí)間:00:01:30時(shí)間:00:01:30圖5-8媒體文件操作設(shè)計(jì)圖點(diǎn)擊“重命名”操作選項(xiàng)后彈出重命名對(duì)話框,如圖5-9所示,對(duì)話框中的UI元素有:標(biāo)題、文件名稱編輯框、格式標(biāo)題、確認(rèn)按鈕和取消按鈕。編輯框中默認(rèn)顯示了當(dāng)前文件名稱,用戶在編輯框中修改了文件名后點(diǎn)擊“確認(rèn)”按鈕將成功修改文件名,點(diǎn)擊“取消”按鈕則取消操作。
歷史視頻音樂(lè)X刪除重命名文件名:[USAVICH.監(jiān)獄兔].|.mp4確定取消T-r-glDQPlayer播放器片名:[USAVICH.監(jiān)獄兔]….片名:[USAVICH.DQPlayer播放器片名:[USAVICH.監(jiān)獄兔]….片名:[USAVICH.監(jiān)獄兔].圖5-9媒體文件重命名設(shè)計(jì)圖點(diǎn)擊“刪除”操作選項(xiàng)彈出確認(rèn)刪除對(duì)話框,如圖5-10所示,對(duì)話框中的UI元素
有:確認(rèn)刪除提示標(biāo)題、確認(rèn)刪除文件復(fù)選框、確認(rèn)按鈕和取消按鈕。對(duì)話框中可勾選
“同時(shí)刪除媒體文件”復(fù)選框,勾選后可在刪除列表項(xiàng)的同時(shí)刪除媒體文件,否則只刪除列表項(xiàng)中數(shù)據(jù)。點(diǎn)擊“確認(rèn)”按鈕執(zhí)行刪除操作,點(diǎn)擊“取消”按鈕則取消刪除操作。存曇為號(hào)戲3G刃G帝R22:mDQPlayer播放器DQPlayer播放器歷史視頻音樂(lè)莢刪除時(shí)間:00:01:30時(shí)間:00:0130片名:[USAVICH,莢刪除時(shí)間:00:01:30時(shí)間:00:0130片名:[USAVICH,監(jiān)獄兔…片名:[U5AVICH.監(jiān)獄兔]…圖5-10媒體文件單個(gè)刪除設(shè)計(jì)圖點(diǎn)擊“基本信息”操作選項(xiàng)彈出媒體文件基本信息展示對(duì)話框,如圖5-11所示,對(duì)話框中顯示了媒體文件的基本信息,信息以列表方式顯示,如“名稱”、“格式”等。點(diǎn)擊“確認(rèn)”按鈕將關(guān)閉對(duì)話框。
圖5-11媒體文件基本信息顯示設(shè)計(jì)圖點(diǎn)擊音視頻內(nèi)容子界面中右上方的“刪除”按鈕,顯示出如圖5-12所示的批量刪除操作界面。標(biāo)題欄中則顯示出幾個(gè)操作UI元素:全選復(fù)選框、取消操作按鈕、確認(rèn)操作按鈕。每個(gè)列表項(xiàng)左側(cè)都會(huì)顯示一個(gè)復(fù)選框進(jìn)行刪除項(xiàng)選擇,若需要?jiǎng)h除所有媒體文件可點(diǎn)擊左上角“全選”復(fù)選框,將選中所有文件。點(diǎn)擊操作欄右上角“確認(rèn)”刪除按鈕將彈出確認(rèn)刪除對(duì)話框,之后的操作與單個(gè)文件刪除操作相同。點(diǎn)擊操作欄右上方“取消”按鈕則取消批量刪除操作。圖5-12媒體文件批量刪除設(shè)計(jì)圖
5.2.3.系統(tǒng)設(shè)置模塊設(shè)計(jì)點(diǎn)擊主界面右上方H“更多”按鈕將彈出系統(tǒng)設(shè)置對(duì)話框,如圖5-13所示。系統(tǒng)設(shè)置模塊以對(duì)話框來(lái)體現(xiàn),對(duì)話框中分別有“版本更新”、“睡眠設(shè)置”、“網(wǎng)絡(luò)設(shè)置”、“關(guān)于軟件”四個(gè)功能選項(xiàng)。?鼻旣3GY'G誓R23:01DQPlayer播放器DQPlayer播放器歷史視頻版本更新睡眠設(shè)置聲購(gòu)近廠網(wǎng)絡(luò)設(shè)置關(guān)于軟件■歷史視頻版本更新睡眠設(shè)置聲購(gòu)近廠網(wǎng)絡(luò)設(shè)置關(guān)于軟件■片名:[USAVICH.監(jiān)獄兔]時(shí)間:00:01:30片名:[USAVICH.監(jiān)獄兔]時(shí)間:00:01:30片名:[USAVICH.監(jiān)獄兔]時(shí)間:00:01:30片名:[USAVICH.監(jiān)獄兔I…片名:[USAVICH.監(jiān)獄兔]….時(shí)間:00:01:30圖5-13系統(tǒng)設(shè)置設(shè)計(jì)圖點(diǎn)擊對(duì)話框中“版本更新”選項(xiàng),當(dāng)有最新更新時(shí)將在系統(tǒng)通知欄中顯示一個(gè)下載列表項(xiàng),如圖5-14所示。列表項(xiàng)中主要體現(xiàn)幾個(gè)UI元素:applogo、應(yīng)用名稱、進(jìn)度
表、已進(jìn)度百分比。下載完畢后將自動(dòng)安裝版本安裝包。若無(wú)最新版本則在界面中顯示一個(gè)提示信息框,如圖5-15所示。片曇片V&3GV,G看E23:22DQPlayer播放器歷史視頻音樂(lè)莢刪除片名:片曇片V&3GV,G看E23:22DQPlayer播放器歷史視頻音樂(lè)莢刪除片名:[USAVICH.監(jiān)獄兔]….時(shí)間:00:0130片名:[USAVICH.監(jiān)獄兔]….時(shí)間:00:01:30片名:[USAVICH.監(jiān)獄兔]….片名:[USAVICH.監(jiān)獄兔]….時(shí)間:00:01:30時(shí)間:00:0130片名:[USAVICH,監(jiān)獄兔]….片名:[USAVICH.監(jiān)獄兔]….圖5-14最新版本下載設(shè)計(jì)圖圖5-14最新版本下載設(shè)計(jì)圖圖5-15最新版本提示設(shè)計(jì)圖點(diǎn)擊對(duì)話框中“睡眠時(shí)間設(shè)置”選項(xiàng)將彈出設(shè)置對(duì)話框,對(duì)話框中主要體現(xiàn)的UI元素:標(biāo)題、時(shí)間設(shè)置滾動(dòng)視圖、確定設(shè)置按鈕,如圖5-16所示。時(shí)間以小時(shí)為單位,選擇了時(shí)間后點(diǎn)擊“設(shè)置”按鈕就成功設(shè)置了睡眠時(shí)間。圖5-16睡眠時(shí)間設(shè)置設(shè)計(jì)圖點(diǎn)擊對(duì)話框中“網(wǎng)絡(luò)設(shè)置”選項(xiàng)將彈出跳轉(zhuǎn)至系統(tǒng)網(wǎng)絡(luò)設(shè)置界面,如圖5-17所示,用戶自行設(shè)置或切換2G/3G或WIFI網(wǎng)絡(luò)環(huán)境。圖5-17系統(tǒng)網(wǎng)絡(luò)設(shè)置界面圖點(diǎn)擊對(duì)話框中“關(guān)于軟件”選項(xiàng)將彈出軟件信息對(duì)話框,如圖5-18所示。對(duì)話框中體現(xiàn)的UI元素:標(biāo)題、applogo、版本信息(包括名稱、版本號(hào)、作者)確定按鈕。版本信息以列表方式布局排列。點(diǎn)擊“確定”按鈕則關(guān)閉對(duì)話框。圖5-18關(guān)于軟件設(shè)計(jì)圖5.3.系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)SQLite簡(jiǎn)介SQLite,是一款輕型的數(shù)據(jù)庫(kù),是遵守ACID的嵌入式的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),許多嵌入式系統(tǒng)產(chǎn)品都使用SQLite,資源占用率十分低,這也是SQLite一個(gè)重要特點(diǎn),實(shí)際設(shè)備中,幾百KB的內(nèi)存就足夠SQLite的存儲(chǔ)了。SQLite的首個(gè)版本誕生于2000年的5月,至今發(fā)展了12年之久,也迎來(lái)SQLite3.0版本的發(fā)布。它能夠在主流操作系統(tǒng)上支持,如Windows、Unix與Linux操作系統(tǒng),同時(shí)也能兼容多種編程語(yǔ)言,還有ODBC接口,比起PostgreSQL、Mysql這兩款世界著名的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng)上來(lái)說(shuō),SQLite的處理效率比兩者都快[16]播放器庫(kù)表說(shuō)明播放器唯一使用數(shù)據(jù)庫(kù)的功能模塊為歷史播放記錄功能,改功能是將用戶播放過(guò)的媒體文件記錄下來(lái),以便日后方便的查閱先前播放過(guò)的媒體文件,是的應(yīng)用更加人性化。在設(shè)計(jì)過(guò)程中,將流媒體播放器應(yīng)用的數(shù)據(jù)庫(kù)名稱命名為“DQPLAY_DB”,數(shù)據(jù)庫(kù)已文件形式存數(shù)在手機(jī)系統(tǒng)內(nèi)存中,系統(tǒng)會(huì)自動(dòng)分配相應(yīng)的目錄給予數(shù)據(jù)庫(kù)文件存數(shù)。下面介紹下媒體基本信息表和媒體播放歷史記錄表的數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)說(shuō)明。
表5-1媒體基本信息表ID字段類型Null默認(rèn)額外注釋1IdintegerunsignedPKauto_increment流水id2mediaidvarchar(20)NO媒體文件在系統(tǒng)中存儲(chǔ)的id3mediatitlevarchar(50)NO媒體文件標(biāo)題4pathvarchar(80)NO文件路徑5artistvarchar(30)NO作者6durationlongNO媒體播放時(shí)長(zhǎng)7albumvarchar(30)NO專輯名8displaynamevarchar(50)NO媒體文件全名9filesizelongNO媒體文件大小10mimetypeVarchar(lO)NO媒體格式表5-2媒體播放歷史記錄表ID字段類型Null默認(rèn)額外注釋1IdintegerunsignedPKauto_increment流水id媒體文件在系統(tǒng)中存儲(chǔ)的2mediaidvarchar(20)NOid根據(jù)此id可查詢出媒體文件的詳細(xì)信息3mediatypeintegerNO媒體文件類型4createtimedatetimeNO記錄創(chuàng)建時(shí)間6.Android平臺(tái)的流媒體播放器應(yīng)用實(shí)現(xiàn)Android應(yīng)用程序開(kāi)發(fā)Android應(yīng)用程序開(kāi)發(fā)是Android開(kāi)發(fā)中最上面的一個(gè)層次,它們構(gòu)建在Android系統(tǒng)提供的API之上。Android應(yīng)用程序的基礎(chǔ)是Android提供的各個(gè)Java類,這些類組成了Android系統(tǒng)級(jí)的API。Android應(yīng)用程序可以基于兩種環(huán)境來(lái)開(kāi)發(fā):AndroidSDK和Android源代碼。Android系統(tǒng)本身內(nèi)置了一部分標(biāo)準(zhǔn)應(yīng)用(也包括內(nèi)容提供者),在仿真器(包括SDK環(huán)境和源代碼環(huán)境)中已經(jīng)包含這些內(nèi)置的程序。用戶自行開(kāi)發(fā)的應(yīng)用程序和Android內(nèi)置的應(yīng)用層程序包位于同一個(gè)層次,都是基于Android框架層的API來(lái)構(gòu)建的,它們的區(qū)別僅僅在于他們是否被包含在默認(rèn)的Android系統(tǒng)中[17]Android開(kāi)發(fā)環(huán)境1?系統(tǒng)和軟件需求使用Androidsdk來(lái)開(kāi)發(fā)Android應(yīng)用程序,就需要適合的操作系統(tǒng)和開(kāi)發(fā)環(huán)境:(1)操作系統(tǒng)WindowsXP或Vista?MacOSX10.4.8或者更高版本(僅支持x86)Linux(LinuxUbuntuDapperDrake版本已測(cè)試)(2)開(kāi)發(fā)環(huán)境EclipseIDEEclipse3.3(Europa),3.4(Ganymede)-EclipseJDT插件(大多數(shù)的EclipseIDE包包含)■WST(可選,包含在mostEclipseIDEpackages中)JDK5或JDK6(只有JRE是不夠的)AndroidDevelopmentTools插件(可選)?不兼容GNUJava編譯器(gcj)?其他IDEJDK5或JDK6(僅有JRE不夠)ApacheAnt1.6.5或者更高層版本(Mac和Linux環(huán)境下),1.7或更高層版本(Windows環(huán)境下)不兼容GNUJava編譯器(gcj)若電腦上已裝有jdk的情況下,確定版本是在5.0以上。有些linux版本可能包含有jdk1.4或者java的gnu編譯器,在Android開(kāi)發(fā)中不支持它們。Android應(yīng)用開(kāi)發(fā)特點(diǎn)系統(tǒng)開(kāi)放性2007年11月5日,在Google的領(lǐng)導(dǎo)下,成立開(kāi)放手持設(shè)備聯(lián)盟(OpenHandsetAlliance),最早的一批成員包括Broadcom公司、HTC、Intel、LG、Marvell等公司。開(kāi)放手持設(shè)備聯(lián)盟的創(chuàng)建目的是為了創(chuàng)建一個(gè)更加開(kāi)放自由的移動(dòng)電話環(huán)境。2008年12月9日,新一批成員加入開(kāi)放手持設(shè)備聯(lián)盟,包括ARM、華為、索尼等公司[18。正是由于Android操作系統(tǒng)是完全開(kāi)源免費(fèi)的,可以讓任何手機(jī)廠商在不經(jīng)Google公司的授權(quán)任意來(lái)使用和修改Android操作系統(tǒng),而且還擁有全球各地開(kāi)發(fā)者組成的開(kāi)源社區(qū)來(lái)專門(mén)負(fù)責(zé)開(kāi)發(fā)Android應(yīng)用程序和第三方Android操作系統(tǒng)來(lái)延長(zhǎng)和擴(kuò)展Android的功能和性能。除了google的logo與應(yīng)用程序不可隨意使用,使用Google的應(yīng)用需要Google公司證明其生產(chǎn)的產(chǎn)品設(shè)備符合Google兼容性定義文件,主要才能在手機(jī)上預(yù)裝GooglePlay、Gmail等。Activity棧式管理(1)Activity棧Android的界面活動(dòng)(Activity)主要是使用Activity棧來(lái)進(jìn)行管理的。當(dāng)一個(gè)Activity被創(chuàng)建時(shí),系統(tǒng)根據(jù)調(diào)用的方式,將這個(gè)Activity存入一個(gè)內(nèi)存棧中。當(dāng)使用者按下手機(jī)的Back鍵或程序調(diào)用finish。方法時(shí),這個(gè)Activity會(huì)退出內(nèi)存棧并被銷毀;當(dāng)有新的Activity入?;蚍祷刂磷烂娉绦驎r(shí),在它之前的所有Activity并未被銷毀,而是它們的狀態(tài)轉(zhuǎn)變?yōu)闀和#≒aused)狀態(tài)。當(dāng)最前的Activity被銷毀時(shí),其之后的activity顯示到屏幕上,變成(Resume)狀態(tài)。(2)TaskTask是Android中與Activity相關(guān)的另一個(gè)重要概念,其與Activity棧有著密切的聯(lián)系。一個(gè)Task可以理解為是Activity的棧,Task是用戶體驗(yàn)期間做造成的邏輯單元結(jié)果,Task可以由不同的應(yīng)用組成,例如長(zhǎng)按“home”按鍵彈出的界面中顯示運(yùn)行的就是Task而不是應(yīng)用。Task的屬性主要由tasked、numActivities、clearOnBackBroud、affinityintent、realActivity、affinity等;它的定義類文件在系統(tǒng)目錄frameworks\base\services\java\com\android\server\am\下。(3)Activity生命周期Activity的生命周期就是它被創(chuàng)建一直到被銷毀的這個(gè)過(guò)程。在它的生命周期中有幾個(gè)狀態(tài)上的變化,下圖就是演示Activity在整個(gè)周期活動(dòng)中的狀態(tài)變化過(guò)程。圖6-1activity活動(dòng)生命周期Activity生命周期中狀態(tài)遷移執(zhí)行的方法如下:protectedvoidonCreate(BundlesavedlnstanceState)protectedvoidonStart()protectedvoidonRestart()protectedvoidonResume()protectedvoidonPause()protectedvoidonStop()protectedvoidonDestroy()在Activity被創(chuàng)建時(shí)第一個(gè)調(diào)用的是onCreate()方法,由于它只在Activity開(kāi)始運(yùn)行的時(shí)候調(diào)用一次,所以主要做一些一次性初始化的工作。隨后調(diào)用的是onStart()和onResume(),onStart()也可做數(shù)據(jù)的初始化工作;當(dāng)進(jìn)入新的界面或系統(tǒng)切換到其他應(yīng)用程序時(shí),Activity并未被銷毀,會(huì)被推入Task棧中,這時(shí)會(huì)調(diào)用onPause()與onStop()方法,這時(shí)可做該Activity的數(shù)據(jù)保存工作,將以后可用的數(shù)據(jù)存入內(nèi)存或固定存儲(chǔ)中;當(dāng)activity再次顯示在屏幕時(shí),onRestart將被調(diào)用,同時(shí)又會(huì)執(zhí)行onResume()方法;當(dāng)程序執(zhí)行了finish。方法,onDestroy()被調(diào)用,activity將被徹底銷毀,結(jié)束生命周期。FFmpeg移植設(shè)定編譯工具鏈?zhǔn)褂檬謩?dòng)指定交叉編譯工具鏈的位置,其中$NDK為NDK的根目錄。以下是手動(dòng)指定gcc,并編譯foo.c:SYSROOT=$NDK/platforms/android-8/arch-arm#API的版本可更改版為對(duì)應(yīng)的版本,如當(dāng)前使用的是API8的版本。exportCC=“$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc--sysroot=$SYSROOT“$CC-ofoo.o-cfoo.c設(shè)定編譯參數(shù)運(yùn)行configure腳本的時(shí)候有很多選項(xiàng),可根據(jù)自己的需求進(jìn)行自定義設(shè)置,運(yùn)行./configure-help可顯示所有選。先編輯configure文件,由于Linux中的回車為'\n',所以將'\r\n'替換成'\n'。而后新建一個(gè)“config.sh”文件,添加以下內(nèi)容:NDK=你的NDK所在目錄SYSROOT=$NDK/platforms/android-9/arch-armPREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86./configure--disable-ffmpeg--disable-ffplay--disable-ffserver\--disable-ffprobe--disable-swscale--disable-postproc\--disable-bsfs--disable-filters\--disable-avdevice--disable-network--disable-devices\
--disable-encoders--disable-muxers\#屏蔽編碼相關(guān)組件--disable-protocols--enable-protocol=file\#只保留本地文件協(xié)議--enable-cross-compile--target-os=linux\--arch=arm--cpu=armv7-a\--enable-shared\#直接用make編譯時(shí)加上--sysroot=$SYSROOT\--cc=$PREBUILT/bin/arm-linux-androideabi-gcc\--enable-memalign-hack\--extra-cflags=“-march=armv7-a-mfloat-abi=softfp-mfpu=neon“#編輯保存后在Cygwin中cdffmpeg到源文件夾,輸入以后命令:$chmod+xconfig.sh/*改變config.sh執(zhí)行權(quán)限*/$./config.sh若配置正確無(wú)誤的情況下則會(huì)答應(yīng)出以下文字:License:nonfreeandunredistributableCreatingconfig.makandconfig.h...1-編譯庫(kù)文件(1)編寫(xiě)Android.mk以libavcodec為例,摘抄以下內(nèi)容:#partsneededformanydifferentcodecsOBJS-$(CONFIG_AANDCT)+=aandcttab.o#意思是如果config.mak中CONFIG_AANDCT=yes,則添加到變量OBJSOBJS-$(CONFIG_AC3DSP)OBJS-$(CONFIG_CRYSTALHD)OBJS-$(CONFIG_ENCODERS)OBJS-$(CONFIG_DCT)OBJS-$(CONFIG_DWT)OBJS-$(CONFIG_AC3DSP)OBJS-$(CONFIG_CRYSTALHD)OBJS-$(CONFIG_ENCODERS)OBJS-$(CONFIG_DCT)OBJS-$(CONFIG_DWT)+=ac3dsp.o+=crystalhd.o+=faandct.ojfdctfst.ojfdctint.o+=dct.odct32_fixed.odct32_float.o+=dwt.oOBJS-$(CONFIG_DXVA2)+=dxva2.o必須將以上內(nèi)容添加到新建的Android.mk文件中,新建在libavcodec/Android.mk下,復(fù)制libavcodec/Makefile有關(guān)OBJS的語(yǔ)句,當(dāng)中所有的*.o替換為*.c,指定需要編譯的源代碼文件。在每個(gè)需要編譯的目錄下都要?jiǎng)?chuàng)建Android.mk。還需要在編譯的頂層目錄寫(xiě)一個(gè)調(diào)用子目錄的Android.mk文件。本論文在開(kāi)發(fā)中編譯其中的三個(gè)解碼必須模塊,1ibavutillibavcodeclibavformat。其中l(wèi)ibavutil依賴libz,libavcodec依賴libavutil,libavformat依賴前兩者[⑼(2)編譯目前為止,使用C/C++編寫(xiě)Android應(yīng)用程序有兩種方式:第一種用C/C++編寫(xiě)主要的邏輯層,再用java編寫(xiě)界面并且調(diào)用C/C++的庫(kù)或再對(duì)調(diào)用C/C++庫(kù)返回的數(shù)據(jù)進(jìn)行處理。這種方法較為通用,主要由于java開(kāi)發(fā)Android應(yīng)用程序的界面相對(duì)簡(jiǎn)單些。另一種用C/C++直接開(kāi)發(fā)完整的應(yīng)用程序,完全不用java,此開(kāi)發(fā)方法在Android2.3系統(tǒng)之后的版本才支持,這種方法較為復(fù)雜并且較少開(kāi)發(fā)者使用。要編譯NDK首先要搭建linux環(huán)境,本論文主要使用的操作系統(tǒng)為windows,所以使用一個(gè)linux模擬環(huán)境cygwin,通過(guò)它,可以在不安裝linux的情況下使用NDK來(lái)編譯C、C++代碼。使用“ndk-build”命令可編譯才C/C++源文件。以下為AndroidNDK的目錄結(jié)構(gòu),在android-ndk目錄中,包含5個(gè)子目錄和2個(gè)文件:?apps目錄是Android工程的保存目錄,子目錄hello-jni和tow-libs為NDK自帶的兩個(gè)范例目錄;?build目錄保存了配置文件、交叉編譯工具和編譯腳本;?docs目錄保存的是幫助文檔;docs目錄中的幫助文件說(shuō)明:?out目錄保存輸出的so文件,是交叉編譯的輸出目錄;?sources目錄保存的是C/C++源代碼文件,包含hello-jni和tow-libs子目錄,分別保存了NDK自帶示例所需要的C/C++源代碼文件;?GNUmakfile文件和README.TXT文件分別是make工具的配置文件和NDK的說(shuō)明文件[20]
FFmpeg音視頻解碼圖6-2FFmpeg解碼過(guò)程上圖清晰地表達(dá)了FFmpeg解碼媒體文件的每一個(gè)步驟,下面詳細(xì)闡述下重點(diǎn)的幾個(gè)步驟:1.利用av_register_all()方法獲取視頻文件中的媒體流,從而初始化libavformat/libavcodec。當(dāng)打開(kāi)注冊(cè)庫(kù)中含有的所有可用的文件格式和編碼器的一個(gè)文件時(shí),它們才能夠自動(dòng)選擇相應(yīng)的文件格式和編碼器。由于av_register_all()只需調(diào)用一次,所以將其放在初始化代碼段中;開(kāi)始打開(kāi)文件,調(diào)用如下代碼:AVFormatContext*pFormatCtx;constchar*filename="myvideo.mpg";av_open_input_file(&pFormatCtx,filename,NULL,0,NULL);//打開(kāi)視頻文件av_open_input_file中的前三個(gè)參數(shù)描述了文件格式、緩沖區(qū)大小與視頻輸出格式參數(shù);通過(guò)賦值null或0告訴libavformat去自動(dòng)探測(cè)文件格式并且使用默認(rèn)的緩沖區(qū)大??;取出包含在文件中的流信息:av_find_stream_info(pFormatCtx);//取出流信息AVFormatContext結(jié)構(gòu)體dump_format(pFormatCtx,0,filename,false);//使用這個(gè)函數(shù)把獲取到得參數(shù)全部輸出。for(i=0;ivpFormatCtx->nb_streams;i++)〃區(qū)分視頻流和音頻流if(pFormatCtx->streams->codec.codec_type==CODEC_TYPE_VIDEO){〃找到視頻流,這里也可以換成音頻videoStream=i;break;}尋找解碼器,解碼媒體文件通過(guò)以下代碼:AVCodec*pCodec;pCodec=avcodec_find_decoder(pCodecCtx->codec_id);avcodec_open(pCodecCtx,pCodec);//打開(kāi)解碼器給視頻幀分配空間以便存儲(chǔ)解碼后的圖片:AVFrame*pFrame;pFrame=avcodec_alloc_frame();執(zhí)行完上述代碼后就可以對(duì)媒體文件進(jìn)行解碼工作。首先讀取數(shù)據(jù),通過(guò)讀取數(shù)據(jù)包來(lái)獲取到整個(gè)媒體流,而后將其解碼成幀,最后轉(zhuǎn)換格式并且保存,通過(guò)以下代碼:while(av_read_frame(pFormatCtx,&packet)>=0){〃讀數(shù)據(jù)if(packet.stream_index=videoStream){〃判斷是否視頻流avcodec_decode_video(pCodecCtx,pFrame,&frameFinished,packet.data,packet.size);〃解碼if(frameFinished){img_convert((AVPicture*)pFrameRGB,PIX_FMT_RGB24,(AVPicture*)pFrame,pCodecCtx->pix_fmt,pCodecCtx->width,pCodecCtx->height);〃轉(zhuǎn)換}SaveFrame(pFrameRGB,pCodecCtx->width,pCodecCtx->height,i);〃保存數(shù)據(jù)av_free_packet(&packet);//釋放}其中av_read_frame()讀取數(shù)據(jù)包后將數(shù)據(jù)保存到AVPacket結(jié)構(gòu)體中。avcodec_decode_video()把包轉(zhuǎn)換成幀;轉(zhuǎn)換時(shí)每當(dāng)?shù)玫较乱粠臅r(shí)候,
avcodec_decode_video()為設(shè)置了幀結(jié)束標(biāo)志frameFinished;接著,使用img_convert()把幀從原始格式轉(zhuǎn)換成為RGB的格式??梢园岩粋€(gè)AVFrame結(jié)構(gòu)體的指針轉(zhuǎn)換為AVPicture結(jié)構(gòu)體的指針。最后,把幀和高寬基本信息傳遞給SaveFrame函數(shù)。這些數(shù)據(jù)最終可以在最后使用av_free_packet()來(lái)釋放掉。流媒體播放功能的開(kāi)發(fā)與實(shí)現(xiàn)1.媒體播放實(shí)現(xiàn)界面效果圖圖6-3媒體文件播放實(shí)現(xiàn)效果圖2.媒體播放模塊類圖ActivityTOC\o"1-5"\h\zonCreate():voidonStart():voidonPause():voidonStop():voidonResume():voidonDestory():voidSufaceHoider-SURFACETYPEPUSHBUFFERS:intSufaceHoider-SURFACETYPEPUSHBUFFERS:int+surfaceDestroyed(SurfaceHolderholder)+surfaceCreated(holderSurfaceHolder)+surfaceChanged(SurfaceHolderholder,intformat,intwidth,intheigl+setTvpe()PlayerActivityTimingThread+TimingThread():void+run():void-mediaPlayerMediaPlayer=null-surfaceViewSurfaceView=null-playBtImageButton-stopBtImageButton-previousBtImageButton-nextBtImageButton-seekBarSeekBar-Attribute8:mt#onCreate():void#onResume():void#onPause():void+onClick():void#onStop():void-play():void-pause():void-reset()+stop():inttintMediaPlayer+MEDIA_ERROR_SERVER_DIED:int+Attribute_2:int+Attribute3:int+setDataSource(Stringpath):String+prepare():void+reset():void+seekTo(intmsec):void+start():void+stop():void+pause():voidHandler-msg:Message+handleMessage():void圖6-4媒體播放模塊類圖媒體播放模塊主要類描述媒體播放模塊主要的功能就是音頻、視頻媒體文件的播放,它主要用到了PlayActivity、MediaPlayer、SurfaceHolder、TimingThread、Handler這幾個(gè)實(shí)體類,它們之間的關(guān)系如圖4-9所示,下面我分別描述下這幾個(gè)類的用途。PlayActivity類:是音視頻媒體文件播放的重要類,主要負(fù)責(zé)音媒體的承載、解碼后的處理、數(shù)據(jù)初始化和播放。MediaPlayer類:主要負(fù)責(zé)音視頻媒體文件的解碼工作,以及媒體在播放過(guò)程中的操作與控制。Surfac田older類:是一個(gè)接口,通過(guò)它來(lái)監(jiān)聽(tīng)Surface中圖片或動(dòng)畫(huà)的創(chuàng)建、改變和銷毀,可以很方便地獲得SurfaceView所對(duì)應(yīng)的Surface所對(duì)應(yīng)的Surfac田older。TimingThread類:繼承自Thread類,用來(lái)訪問(wèn)非本地?cái)?shù)據(jù)或計(jì)算較長(zhǎng)、較復(fù)雜的算法,且不影響主線程正常運(yùn)行的情況,提高客戶端流暢度,提高用戶體驗(yàn)。Handler類:用來(lái)處理Thread類執(zhí)行后的數(shù)據(jù)處理和計(jì)算工作。如界面數(shù)據(jù)的變更就需要在Handler中處理,在Thread中無(wú)法處理。媒體播放模塊關(guān)鍵代碼界面在配置文件中注冊(cè)vactivityandroid:name="com.dqplayer.module.PlayerActivity"android:label="@string/title_activity_player"android:configChanges="orientationlkeyboard"android:theme="@android:style/Theme.NoTitleBar">v/activity>媒體操作功能/***播放*/privatevoidplay(){if(mediaPlayer==null){mediaPlayer=newMediaPlayer。;//設(shè)置多媒體流類型mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//設(shè)置用于展示mediaPlayer的容器mediaPlayer.setDisplay(surfaceHolder);try{mediaPlayer.setDataSource(filePath);mediaPlayer.prepare();訐(fileType==1){mediaPlayer.start();}elseif(fileType==2){Intentintent=newIntent(PlayerActivity.this,AudioService.class);intent.putExtra("filePath",filePath);intent.putExtra("filePath",filePath);startService(intent);}seekBar.setMax(mediaPlayer.getDuration());//設(shè)置進(jìn)度條值seekBar.setEnabled(true);timingThread=newTimingThread();//進(jìn)度條移動(dòng)監(jiān)聽(tīng)線程實(shí)例timingThread.start();訐(videoPlayPosition>0){mediaPlayer.seekTo(videoPlayPosition);videoPlayPosition=0;}}catch(IOExceptionioe){ioe.printStackTrace();訐(fileType==1){Toast.makeText(PlayerActivity.this,R.string.not_play_this_video,Toast.LENGTH_SHORT).show();}else訐(fileType==2){Toast.makeText(PlayerActivity.this,R.string.not_play_this_audio,Toast.LENGTH_SHORT).show();}finish。;}catch(Exceptione){e.printStackTrace();Log.i(“通知","播放過(guò)程中出現(xiàn)了錯(cuò)誤哦“);Toast.makeText(PlayerActivity.this,R.string.play_error,Toast.LENGTH_SHORT).show();finish();}}else{mediaPlayer.start();}isPause=false;/***暫停*/privatevoidpause(){〃點(diǎn)擊了暫停按鈕訐(mediaPlayer!=null){Log.i("isPlaying2",String.valueOf(mediaPlayer.isPlaying()));if(mediaPlayer.isPlaying()){訐(isPause==false){mediaPlayer.pause();isPause=true;}else{mediaPlayer.start();isPause=false;}/***重置*/privatevoidreset(){〃點(diǎn)擊了reset按鈕f(mediaPlayer!=null){Log.i("reset_isPlaying",String.valueOf(mediaPlayer.isPlaying()));f(mediaPlayer.isPlaying()){//跳轉(zhuǎn)到視頻的最初進(jìn)度mediaPlayer.seekTo(O);mediaPlayer.start();}/***停止*/privatevoidstop(){〃點(diǎn)擊了stop按鈕f(mediaPlayer!=null){Log.i("stop_isPlaying",String.valueOf(mediaPlayer.isPlaying()));mediaPlayer.stop();mediaPlayer.release();mediaPlayer=null;playBt.setImageResource(R.drawable.play2);isPause=true;seekBar.setProgress(O);//進(jìn)度條歸0timingThread=null;seekBar.setEnabled(false);//禁用進(jìn)度條}總結(jié)隨著3G通信技術(shù)的日益成熟及4G高速無(wú)線網(wǎng)絡(luò)的快速發(fā)展,移動(dòng)服務(wù)提供商可以在不同的頻帶網(wǎng)絡(luò)和無(wú)線通信平臺(tái)下提供無(wú)線服務(wù),這將極大地滿足用戶對(duì)移動(dòng)通信的各種需求,因此越來(lái)越多的用戶開(kāi)始使用移動(dòng)流媒體業(yè)務(wù)。本論文主要研究的工作有以下幾點(diǎn):(1)研究了Android系統(tǒng)的主體框架,主要應(yīng)用了應(yīng)用程序?qū)?、?yīng)用框架層和程序庫(kù)層。在此基礎(chǔ)上對(duì)Android的四大組件活動(dòng)(Activity)、廣播接收者(Broadcastreceivers)、服務(wù)(Service)、內(nèi)容提供者(contentprovider)進(jìn)行了研究,對(duì)于組件的深入研究對(duì)客戶端的開(kāi)發(fā)發(fā)揮著重要的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 叩啟史門(mén):什么是歷史我們?yōu)楹螌W(xué)習(xí)歷史-統(tǒng)編版七年級(jí)上冊(cè)歷史導(dǎo)言課教學(xué)設(shè)計(jì)
- 弧長(zhǎng)與扇形面積及圓錐側(cè)面積的計(jì)算-人教版數(shù)學(xué)九年級(jí)上冊(cè)單元教學(xué)設(shè)計(jì)
- 基于分層與建構(gòu)的初中化學(xué)復(fù)習(xí)課教學(xué)設(shè)計(jì)-以“物質(zhì)構(gòu)成的奧秘”單元為例
- 電子商務(wù)課程新零售模塊教學(xué)設(shè)計(jì)
- 排球運(yùn)動(dòng)教學(xué)設(shè)計(jì)與課程實(shí)施方案
- 三年級(jí)英語(yǔ)期末復(fù)習(xí)重點(diǎn)句型
- 工程機(jī)械設(shè)備維護(hù)保養(yǎng)操作規(guī)程
- 高職院校課程設(shè)計(jì)樣板案例
- 企業(yè)獵頭服務(wù)流程與模板指南
- 快速消費(fèi)品供應(yīng)鏈管理案例分析
- 2024-2025學(xué)年廣東省實(shí)驗(yàn)中學(xué)高一(上)期中語(yǔ)文試卷
- DB34T 1948-2013 建設(shè)工程造價(jià)咨詢檔案立卷標(biāo)準(zhǔn)
- 鋼鐵制造的工藝流程(內(nèi)部資料)課件
- DB31-T 1448-2023 監(jiān)獄場(chǎng)所消防安全管理規(guī)范
- 公司干部調(diào)研方案
- 無(wú)糾紛自愿離婚協(xié)議書(shū)
- 四川省高等教育自學(xué)考試畢業(yè)生登記表【模板】
- 專題五 以新發(fā)展理念引領(lǐng)高質(zhì)量發(fā)展
- GB/T 22417-2008叉車貨叉叉套和伸縮式貨叉技術(shù)性能和強(qiáng)度要求
- GB/T 1.1-2009標(biāo)準(zhǔn)化工作導(dǎo)則 第1部分:標(biāo)準(zhǔn)的結(jié)構(gòu)和編寫(xiě)
- 長(zhǎng)興中學(xué)提前招生試卷
評(píng)論
0/150
提交評(píng)論