2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩47頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  本科畢業(yè)論文(設(shè)計(jì)、創(chuàng)作)</p><p>  題  目: 基于IOS平臺(tái)的實(shí)時(shí)視頻流播放系統(tǒng)  </p><p>  學(xué)生姓名:    學(xué)號(hào): </p><p>  院(系): 計(jì)算機(jī)學(xué)院 專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)</p><p>  入學(xué)時(shí)間:    2008    年   09   月&

2、lt;/p><p>  導(dǎo)師姓名:   職稱/學(xué)位:     </p><p>  導(dǎo)師所在單位:        </p><p>  完成時(shí)間:     2012   年    05  月</p><p>  基于IOS平臺(tái)的實(shí)時(shí)視頻流播放系統(tǒng)</p><p><b>  摘要</b>&l

3、t;/p><p>  2007年1月9日蘋果公司在Macworld展覽會(huì)上公布了最早的iOS,隨后于同年的6月份發(fā)布了第一版的ios操作系統(tǒng),當(dāng)初的名稱為“iPhone runs OS X”,最初,由于沒有人了解它的潛在價(jià)值和發(fā)展前景,沒有一家軟件公司愿意給它提供軟件支持。時(shí)任的蘋果CEO斯蒂夫·喬布斯改變了這一切。2011年iOS設(shè)備已經(jīng)占據(jù)了全球移動(dòng)操作系統(tǒng)的44%份額,如今iOS平臺(tái)的設(shè)備已經(jīng)成為了主

4、流工具。本文是基于iOS平臺(tái)的實(shí)時(shí)視頻流播放系統(tǒng)設(shè)計(jì)。使用Objective-C語言在Xcode下用iPhone SDK實(shí)現(xiàn)視頻播放控制,利用虛擬機(jī)運(yùn)行Mac OS x.最終實(shí)現(xiàn)網(wǎng)絡(luò)實(shí)時(shí)視頻流的播放,使用戶在WINDOWS 7下體驗(yàn)iOS系統(tǒng)。</p><p>  關(guān)鍵詞:iOS;Xcode;iPhone SDK;VMware;Objective-C;視頻播放;</p><p>  Pla

5、y System of Real-time Video Stream on IOS Platform</p><p><b>  Abstract</b></p><p>  Apple's Macworld Expo in January 9, 2007 announced the first iOS, then in June the same year

6、released the first version of ios operating system, the original name for the "iPhone runs OS X" .In initially, in the absence people to understand its potential value and prospects for development, not a softw

7、are company willing to provide software support. Apple CEO Steve Jobs when he changed all that. 2011 iOS equipment has accounted for 44% share of the global mobile operating system, now iOS platfor</p><p>  

8、Keywords: iOS;Xcode;iPhone SDK;VMware;Objective-C; Video player</p><p><b>  目  錄</b></p><p>  1 緒論……………………………………………………………………………………5</p><p>  1.1本課題研究的背景……………………………………………

9、………………5</p><p>  1.2 本課題研究的意義……………………………………………………………5</p><p>  1.3 本論文研究思路和工作安排(開題報(bào)告)……………………………………5</p><p>  2 視頻播放平臺(tái)和技術(shù)…………………………………………………………………6</p><p>  2.1 Objecti

10、ve-C簡介……………………………………………………………6</p><p>  2.2 iOS概述及其系統(tǒng)架構(gòu)………………………………………………………7</p><p>  2.2.1 iOS的系統(tǒng)架構(gòu)……………………………………………………………7</p><p>  2.2.2 Framework-應(yīng)用程序框架………………………………………………9</

11、p><p>  2.3 VMware中安裝虛擬Mac OS X……………………………………………10</p><p>  2.4 Xcode和iPhone SDK的獲取和安裝………………………………………15</p><p>  2.5 網(wǎng)絡(luò)實(shí)時(shí)視頻流及其傳輸(HTTP)…………………………………………16</p><p>  3 iPhone應(yīng)

12、用程序開發(fā)的學(xué)習(xí)和系統(tǒng)的實(shí)現(xiàn)………………………………………22</p><p>  3.1 Hello Apple……………………………………………………………22</p><p>  3.1.1 系統(tǒng)偽裝到10.5.7…………………………………………………………………22</p><p>  3.1.2 Hello Apple……………………………………………

13、…………………………… 25 </p><p>  3.2 MediaPlayer Framework播放視頻影片……………………32</p><p>  4 結(jié)論(結(jié)束語)…………………………………………………………………40</p><p>  主要參考文獻(xiàn)……………………………………………

14、……………………………………43</p><p>  附錄A………………………………………………………………………………………44</p><p>  附錄B……………………………………………………………………………………45</p><p>  致謝……………………………………………………………………………………………47</p><p>

15、<b>  緒論</b></p><p>  本課題研究的是基于ios平臺(tái)的實(shí)時(shí)視頻流播放,在windows 7系統(tǒng)下使用Vmware安裝虛擬的Mac OS,通過Xcode和Iphone SDK在虛擬機(jī)里體驗(yàn)iphone應(yīng)用程序的開發(fā)。同時(shí)熟悉Objective-C的編程優(yōu)點(diǎn)和網(wǎng)絡(luò)實(shí)時(shí)視頻流的傳輸協(xié)議。</p><p>  1.1 本課題研究的背景</p>

16、;<p>  iOS最早于2007年1月9日的蘋果Macworld展覽會(huì)上公布,隨后于同年的6月發(fā)布的第一版iOS操作系統(tǒng),當(dāng)初的名稱為“iPhone runs OS X”?!?  最初,由于沒有人了解“iPhone runs OS X”的潛在價(jià)值和發(fā)展前景,導(dǎo)致沒有一家軟件公司、沒有一個(gè)軟件開發(fā)者給“iPhone runs OS X”開發(fā)軟件或者提供軟件支持。于是,蘋果公司時(shí)任CEO斯蒂夫.喬布斯說服各大軟件公司以及開發(fā)

17、者可以先搭建低成本的網(wǎng)絡(luò)應(yīng)用程序(WEB APP)來使得它們能像iPhone的本地化程序一樣來測試“iPhone runs OS X”平臺(tái)。</p><p>  北京時(shí)間6月7日凌晨,蘋果2011年度的WWDC大會(huì),scott Forstall正式公布了iOS設(shè)備至今已經(jīng)銷售了2億臺(tái),占全球移動(dòng)操作系統(tǒng)44%份額.隨著ios 5的到來,世界范圍內(nèi)迎來了全新的移動(dòng)操作系統(tǒng),ios 5越來越被人所熟知。[1]<

18、/p><p><b>  本課題研究的意義</b></p><p>  隨著ios的流行,越來越多的人體驗(yàn)到了其所帶來的科技魅力,但是對(duì)一部分人來說一件時(shí)尚的ios設(shè)備略顯奢侈。也給研究者帶來了一定的不方便。本課題主要研究在低端的PC上通過VMware來實(shí)現(xiàn)ios的視頻播放體驗(yàn)。同時(shí)對(duì)于初學(xué)者來說也是踏入iphone程序開發(fā)的必要準(zhǔn)備,讓研究者在學(xué)習(xí)的同時(shí)慢慢體會(huì)到ios

19、的精髓,打好未來成為ios程序員的根基。</p><p>  本論文的研究思路和工作安排</p><p>  首先在自己的PC上面安裝VMware Workstation 7.0,通過網(wǎng)絡(luò)下載Mac OS X leopard 10.5.7。其次自學(xué)Objective-C,熟悉該語言的特點(diǎn)和編程方法,初步學(xué)習(xí)iphone程序開發(fā)基礎(chǔ)教程。最后一步步實(shí)現(xiàn)系統(tǒng)的完成。</p>&l

20、t;p>  第一階段:2011年12月09日——2011年12月20日;選題,撰寫開題,報(bào)告;</p><p>  第二階段:2012年03月01日——2012年04月20日;收集、查閱相關(guān)文獻(xiàn)資料,與指導(dǎo)老師取得聯(lián)系,開發(fā)環(huán)境的搭建,撰寫初稿;</p><p>  第三階段:2012年04月21日——2012年05月15日;收集資料,修改初稿,總結(jié)經(jīng)驗(yàn),與指導(dǎo)老師交流解決疑難,撰寫

21、二稿;</p><p>  第四階段:2011年05月16日——2012年05月30日;修改二稿,撰寫三稿,將上一階段存在的問題進(jìn)一步修改、總結(jié)、完善,增加論文的科學(xué)性;</p><p><b>  視頻播放平臺(tái)和技術(shù)</b></p><p>  2.1 Objective-C簡介</p><p>  1980年代初,布

22、萊德·確斯(Brad Cox)在其公司Stepstone發(fā)明Objective-C,它以一種叫做SmallTalk-80的語言為基礎(chǔ)。Objective-C建立在C語言之上,意味著它是在C語言基礎(chǔ)上添加了擴(kuò)展而創(chuàng)造出來的能夠創(chuàng)建和操作對(duì)象的一門新的程序設(shè)計(jì)語言。</p><p>  Objective-C,通常寫作ObjC和較少用的Objective C或Obj-C,是在C的基礎(chǔ)上,加入面向?qū)ο筇匦詳U(kuò)充

23、而成的編程語言。</p><p>  目前,Objective-C主要應(yīng)用于Mac OS X和iOS這兩個(gè)NeXTSTEP的衍生系統(tǒng),而在NeXTSTEP和OpenStep中它更是基本語言。Objective-C可以在任何gcc支持的平臺(tái)上進(jìn)行編譯,因?yàn)間cc原生支持Objective-C</p><p>  Objective-C是C語言的嚴(yán)格母集合,意指任何原始的C語言程式都可以通過O

24、bjective-C編譯器而不需修改,也允許 Objective-C 使用任何原始的C語言代碼。Objective-C 形容自己為覆蓋于C語言上的一層薄紗,這是因?yàn)镺bjective-C的原意就是在原始C語言主體上加入面向?qū)ο蟮奶匦?。Objective-C的面向?qū)ο笳Z法源于Smalltalk訊息傳遞風(fēng)格。所有其他非面向?qū)ο蟮恼Z法,包括變量型別,前處理器(preprocessing),流程控制,函數(shù)聲明與調(diào)用皆與C語言完全一致。</

25、p><p>  Objective-C 面向?qū)ο笞畲蟮奶厣堑挠嵪鬟f(message passing)模型。Objective-C里,物件不呼叫方法,而是互相傳遞訊息,這與今日的主流C++式面向?qū)ο箫L(fēng)格差異甚大。此二種風(fēng)格的差異主要在于程序如何看待呼叫方法/傳送訊息這個(gè)動(dòng)作。C++里類與方法的關(guān)系非常嚴(yán)格清楚,一個(gè)方法必定屬于一個(gè)類,且于編譯期(compile time)就已經(jīng)緊密綁在一起,你不可能呼叫一個(gè)不存在類

26、里的方法。但在Objective-C,類與訊息的關(guān)系較為松散,所有方法都被視為對(duì)訊息的回應(yīng),而呼叫方法則視為對(duì)類發(fā)送訊息。所有訊息處理直到執(zhí)行期(runtime)才會(huì)動(dòng)態(tài)決定,并交由類自行決定如何處理收到的訊息。也就是說,一個(gè)類不保證一定會(huì)回應(yīng)收到的訊息,如果類收到了一個(gè)無法處理的訊息,程式并不會(huì)出錯(cuò)或當(dāng)?shù)?,它只?huì)拋出一個(gè)Exception。</p><p>  在2006年蘋果全球開發(fā)者會(huì)議中,Apple宣布了

27、“Objective-C 2.0”的發(fā)布,其增加了“現(xiàn)代的垃圾收集,語法改進(jìn),運(yùn)行時(shí)性能改進(jìn),以及64位支持”。2007年10月發(fā)布的Mac OS X v10.5中包含了Objective-C 2.0的編譯器。</p><p>  Objective-C是非?!皩?shí)際”的語言。它用一個(gè)很小的、用C寫成的運(yùn)行庫,使得應(yīng)用程式的大小增加很少,與此相比,大部分OO系統(tǒng)需要極大的運(yùn)行時(shí)虛擬機(jī)來執(zhí)行。ObjC寫成的程式通常不

28、會(huì)比其源代碼和函式庫(通常無需包含在軟件發(fā)行版本中)大太多,不會(huì)像Smalltalk系統(tǒng),即使只是打開一個(gè)窗口也需要大量的容量。由于Obj-C的動(dòng)態(tài)類型特征,Obj-C不能對(duì)方法進(jìn)行內(nèi)聯(lián)(inline)一類的優(yōu)化,使得Obj-C的應(yīng)用程序一般比類似的C或C++程序更小。</p><p>  目前, Objective-C是Mac OS X的首要開發(fā)語言,也是GNUstep 在Linux 和其它平臺(tái)上的開發(fā)

29、語言。 </p><p>  Objective-C是ANSI C的超集,擴(kuò)展了C語言使它具備面向?qū)ο笤O(shè)計(jì)的能力,如類,消息和繼承。Objective-C程序中可以利用現(xiàn)有的C語言代碼,使其利用現(xiàn)有的軟件架構(gòu)。這也是為甚莫Objective-C過去多年間能夠成為一種流行的用戶界面開發(fā)語言而且至今沒有消亡,因?yàn)橐环矫嬗盟梢詫?shí)現(xiàn)底層系統(tǒng)編程,另一方面可以支持利用動(dòng)態(tài)架構(gòu)進(jìn)行開發(fā)。</p>&l

30、t;p>  Objective-C 和C++的比較 </p><p>  單一繼承: </p><p>  Objective-C不支持多重繼承,(同Java和Smalltalk),而C++語言支持多重繼承。 </p><p><b>  動(dòng)態(tài): </b></p><p>  O

31、bjective-C是動(dòng)態(tài)定型(dynamicaly typed)所以它的類庫比C++要容易操作。Objective-C 在運(yùn)行時(shí)可以允許根據(jù)字符串名字來訪問方法和類,還可以動(dòng)態(tài)連接和添加類。 </p><p>  C++跟從面向?qū)ο缶幊汤锏腟imula 67(一種早期OO語言)學(xué)派,而Objecive-C屬于Smalltalk學(xué)派。</p><p>  在C++里,對(duì)象的靜態(tài)

32、類型決定你是否可以發(fā)送消息給它,而對(duì)Objecive-C來說,由動(dòng)態(tài)類型來決定。[2]</p><p>  ios系統(tǒng)概述及其架構(gòu)</p><p><b>  ios的系統(tǒng)架構(gòu)</b></p><p>  iOS的系統(tǒng)架構(gòu)分為四個(gè)層次:核心操作系統(tǒng)層(Core OS layer)、核心服務(wù)層(Core Services layer)、媒體層(M

33、edia layer)和可觸摸層(Cocoa Touch layer)。下圖1展示了Mac OS X和iOS系統(tǒng)架構(gòu)層次的一個(gè)對(duì)比。</p><p>  圖1:Mac OS X和iOS系統(tǒng)架構(gòu)</p><p>  從上圖中我們可以發(fā)現(xiàn)Mac OS X與iOS的系統(tǒng)架構(gòu)層次只有最上面一層不同,由Cocoa框架換成了Cocoa Touch,因此開發(fā)iOS應(yīng)用程序與開發(fā)Mac OS X程序是相似

34、的,現(xiàn)在就讓我們來具體看看每層所包含的內(nèi)容。</p><p>  其實(shí)iOS是基于UNIX的,所以我們完全可以相信這個(gè)操作系統(tǒng),要知道從系統(tǒng)的穩(wěn)定性上來說它要比其他操作系統(tǒng)的產(chǎn)品好很多。</p><p>  位于iOS系統(tǒng)架構(gòu)最下面的一層是核心操作系統(tǒng)層,它包括內(nèi)存管理、文件系統(tǒng)、電源管理以及一些其他的操作系統(tǒng)任務(wù)。它可以直接和硬件設(shè)備進(jìn)行交互。核心操作系統(tǒng)層包括以下這些組件:</p

35、><p>  表1:核心操作系統(tǒng)層組件</p><p>  第二層是核心服務(wù)層,我們可以通過它來訪問iOS的一些服務(wù)。它包括以下這些組件:表2:核心服務(wù)層組件</p><p>  第三層是媒體層,通過它我們可以在應(yīng)用程序中使用各種媒體文件,進(jìn)行音頻與視頻的錄制,圖形的繪制,以及制作基礎(chǔ)的動(dòng)畫效果。它包括以下這些組件:</p><p>  表3:媒

36、體層核心組件</p><p>  最上面一層是可觸摸層,這一層為我們的應(yīng)用程序開發(fā)提供了各種有用的框架,并且大部分與用戶界面有關(guān),本質(zhì)上來說它負(fù)責(zé)用戶在iOS設(shè)備上的觸摸交互操作。它包括以下這些組件:</p><p>  表4:可觸摸層核心組件</p><p>  在Cocoa Touch層中的很多技術(shù)都是基于Objective-C語言的。Objective-C語言

37、為iOS提供了像集合、文件管理、網(wǎng)絡(luò)操作等支持。像UIKit框架,它為應(yīng)用程序提供了各種可視化組件,比如像窗口(Window)、視圖(View)和按鈕組件(UIButton)。Cocoa Touch層中的其他框架,對(duì)我們在應(yīng)用程序中的開發(fā)來說也是非常有用的,如訪問用戶通信錄功能框架、獲取照片信息功能的框架、負(fù)責(zé)加速感應(yīng)器和三維陀螺儀等硬件支持的框架。</p><p>  FrameWork-應(yīng)用程序框架</

38、p><p>  什么是框架?本質(zhì)上來說它是幫助我們完成各種特定功能的軟件庫。</p><p>  我們編寫的應(yīng)用程序項(xiàng)目,都是從Cocoa Touch層開始的,具體來說就是從UIKit Framework開始的。當(dāng)在編寫程序的過程中需要用到一些特殊功能的時(shí)候,我們應(yīng)該從框架的最頂端技術(shù)開始尋找相應(yīng)的框架,只有在上層結(jié)構(gòu)無法解決時(shí),才能使用其下層的技術(shù)。其實(shí),頂層的框架已經(jīng)涵蓋了我們絕大多數(shù)需要

39、的功能。[3]</p><p>  表5:一些常用的ios SDK 框架</p><p>  VMware中安裝虛擬的Mac OS X</p><p><b>  圖2:我的電腦配置</b></p><p>  因?yàn)槲业碾娔X(windows 7系統(tǒng))CPU是core2的T6400無法支持硬件VT技術(shù),不能安裝Mac OS

40、 X 10.6 雪豹操作系統(tǒng)和10.7 lion系統(tǒng),只能采用10.5.5leopard。虛擬機(jī)的版本是VMware 7.0漢化破解版。</p><p>  使用步奏:windows 7+VMware 7.0+Mac OS X Leopard On VMware.[支持Intel和AMD的CPU].</p><p>  解壓下載的壓縮包(8G)到指定的文件夾</p><

41、p>  圖3:解壓后的文件夾</p><p>  2.打開VMware 打開開已存在的虛擬機(jī)或分組 選擇 打開后就進(jìn)入歡迎頁面</p><p>  圖4:打開虛擬機(jī)的界面</p><p>  圖5:打開解壓后的文件(已經(jīng)存在的虛擬機(jī))</p><p>  圖6:打開下載的虛擬機(jī)</p><p>  圖7:打

42、開已存在的虛擬機(jī)</p><p>  圖8:虛擬機(jī)的設(shè)置(下載時(shí)已經(jīng)設(shè)置好)</p><p>  為了使用PC下載的Xcode和SDK,所以還要設(shè)置一個(gè)共享文件夾與主機(jī)共享文件</p><p>  圖9:共享文件夾的設(shè)置</p><p>  此時(shí)注意:共享的文件夾路徑中必須全是英文!</p><p>  進(jìn)入虛擬的Ma

43、c OS X 10.5.5</p><p>  圖10:打開虛擬機(jī)電源后的登陸界面</p><p>  圖11:系統(tǒng)版本10.5.5(后面要偽裝10.5.7)</p><p><b>  特別提醒:</b></p><p>  1.虛擬機(jī)里無法直接升級(jí)系統(tǒng)所以選擇軟件升級(jí)下載完畢后也無法升級(jí)</p><

44、;p>  2.安裝VMware Tools 后才可以看見共享文件夾圖樣,WMware Tools 可以點(diǎn)擊右上角的圖樣進(jìn)行下載和安裝,按照提示下載后重啟即可看見共享的文件夾圖樣,雙擊該圖樣可以找到自己設(shè)定的共享文件夾,來共享主機(jī)的文件夾。當(dāng)然在此之前也要設(shè)置主機(jī)的文件夾屬性改為共享。右擊文件夾--屬性—共享—共享(s)--選擇共享用戶為vmware user</p><p>  圖12:主機(jī)文件夾共享設(shè)置過

45、程</p><p>  圖13:打開虛擬機(jī)里的共享文件夾</p><p>  2.4 Xcode和iphone SDK的獲取和安裝</p><p>  想要進(jìn)行iphone的程序設(shè)計(jì),注冊Apple ID當(dāng)然是必須的。</p><p>  圖14:打開蘋果開發(fā)者網(wǎng)頁</p><p>  圖15:注冊賬號(hào)后登陸界面&l

46、t;/p><p>  登陸蘋果開發(fā)者聯(lián)盟后從網(wǎng)上(建議去迅雷搜索種子或者CSDN上下載)下載iphone_sdk_3.0__leopard__9m2736__final.dmg后將該鏡像文件放到共享的文件夾里面并在虛擬機(jī)里的共享文件夾打開</p><p>  圖16:打開共享文件里的SDK 打開Packges</p><p><b>  提醒:</b&g

47、t;</p><p>  iphone sdk 3需要安裝在leopard 10.5.7版本上才可以,而我們的虛擬Mac 是10.5.5所以需要偽裝一下系統(tǒng)到10.5.7(偽裝過程見3.1)</p><p>  網(wǎng)絡(luò)實(shí)時(shí)視頻流及其傳輸(HTTP)</p><p>  常用的流媒體協(xié)議主要有 HTTP 漸進(jìn)下載和基于 RTSP/RTP 的實(shí)時(shí)流媒體協(xié)議,這二種基本是完

48、全不同的東西,目前比較方便又好用的我建議使用 HTTP 漸進(jìn)下載的方法。在這個(gè)中 apple 公司的 HTTP Live Streaming 是這個(gè)方面的代表。它最初是蘋果公司針對(duì)iPhone、iPod、iTouch和iPad等移動(dòng)設(shè)備而開發(fā)的流.現(xiàn)在見到在桌面也有很多應(yīng)用了, HTML5 是直接支持這個(gè)。</p><p>  我們可以看看 HTTP Live Streaming 是怎么樣工作的。平時(shí)的直播技術(shù)中

49、,播放模式中必須等待整個(gè)文件下載完才行,在 HLS 技術(shù)中 Web 服務(wù)器向客戶端提供接近實(shí)時(shí)的音視頻流。但在使用的過程中是使用的標(biāo)準(zhǔn)的 HTTP 協(xié)議,所以這時(shí),只要使用 HLS 的技術(shù),就能在普通的 HTTP 的應(yīng)用上直接提供點(diǎn)播和直播。</p><p>  要詳細(xì)了解原理,我們先看看這個(gè)所需要的步驟。視頻采集 ->編碼器 -> 流分割 -> 普通 web 服務(wù)(索引文件和視頻文件) -&g

50、t; 客戶端</p><p>  內(nèi)容準(zhǔn)備的過程大約二種,一是視頻采集,編碼器首先將攝像機(jī)實(shí)時(shí)采集的音視頻數(shù)據(jù)壓縮編碼為符合特定標(biāo)準(zhǔn)的音視頻基本流,也可以拿編碼完了的文件,有一點(diǎn)必須保證,就是一定要使用H.264視頻和AAC音頻,因?yàn)榘l(fā)明這個(gè)的是蘋果公司,只支持這個(gè)。然后給這些封裝成成為符合MPEG-2(MPEG 2 TS、MPEG2 PS之所以使用這個(gè),主要是因?yàn)槁曇艉鸵曨l會(huì)交織在一起,也會(huì)有關(guān)鍵幀來讓視頻可以

51、直接播放).</p><p>  流分割部分在這個(gè)中,比起 RTSP 之類和普通點(diǎn)播的最大不同,就是他會(huì)給 MPEG-2 分割成很多個(gè) ts 的文件。分割過程大多是按時(shí)間來切,根據(jù)國外的資料,建議切 10s 一個(gè)的文件,如果碼流高可以 5 秒一次。在分割還有一點(diǎn)不同,就是這時(shí)流分割器會(huì)生成一個(gè)含有指向這些小TS文件指針的索引文件</p><p>  所以這個(gè)文件也必須在 web 服務(wù)器上,

52、不能少。每多 10s 時(shí),就會(huì)多一個(gè) ts 文件,所以索引也會(huì)根著修改成最新的幾段視頻。</p><p>  最后,這些切分了的小的一系列的 ts 文件,放到普通的 web 服務(wù)器中就行了。這時(shí)在 CDN 中也是一樣,因?yàn)檎埱筮@些文件會(huì)使用標(biāo)準(zhǔn)的 HTTP 協(xié)議。索引文件后綴是.m3u8 ,索引文件采用擴(kuò)展的M3U播放列表格式,其實(shí)就一文本。</p><p>  內(nèi)部的視頻的地址會(huì)是如下:

53、</p><p>  http://media.example.com/s_96ksegment1.ts</p><p>  http://media.example.com/s_96ksegment2.ts</p><p>  http://media.example.com/s_96ksegment3.ts</p><p>  所以這時(shí)可

54、以直接做 Cache 和直接放到 Web 服務(wù)器中,簡單方便。</p><p>  如果 MIME 的信息輸出不對(duì)的話,記的要修改這加入 ts 和 m3u8 的后綴支持</p><p>  .m3u8 application/x-mpegURL</p><p>  .ts video/MP2T</p><p>  最后就是客戶端,如果是 HT

55、ML 直接在 HTML5 中直接支持這種視頻可以使用如下標(biāo)簽<video tabindex="0" height="480" width="640"></p><p>  <source src="/content1/content1.m3u8"> </p><p><b> 

56、 </video></b></p><p>  如果是應(yīng)用客戶端(Safari QuickTime之類),就得裝軟件來支持,客戶端會(huì)根據(jù)選擇的流的索引來下載文件,當(dāng)下載了最少二段后開始播放。直接 m3u8 的索引結(jié)束。另外,HTTP可以設(shè)計(jì)成的自適應(yīng)比特率流,在不同網(wǎng)絡(luò)環(huán)境,選擇下載不同碼流的視頻。</p><p>  所以整個(gè) HTTP Live Streamin

57、g 無論是直播還是點(diǎn)播,都能做到近似實(shí)時(shí)的方式來進(jìn)行流播放。理論的最小時(shí)延是每個(gè)切片的長.</p><p>  apple http live streaming.基于http的視頻流播放,筆者稱它為視頻切片技術(shù),先是將視頻文件通過mpegts編碼,然后通過apple提供的小工具segmenter將視頻文件切割成很多小文件并維護(hù)一個(gè)時(shí)間列表.這些文件可以直接放在網(wǎng)站目錄下面通過http協(xié)議被下載播放.不幸的是蘋果

58、提供的segmenter只能工作在mac下,我們需要一個(gè)基于linux的開源解決方案.</p><p>  幾經(jīng)搜索和嘗試最后找到Carson McDonald的<<iPhone HTTP Streaming with FFMpeg and an Open Source Segmenter>>雖然文中給出了幾乎"完美"的解決方案,但是由于時(shí)代的發(fā)展和實(shí)際環(huán)境的不同,筆者

59、著實(shí)將這篇文章細(xì)細(xì)研究了N久,于是也便有了這篇文章的出現(xiàn).接下筆者會(huì)給出在ubuntu 10.04服務(wù)器編譯安裝ffmpeg和segmenter技術(shù)細(xì)節(jié),并匯報(bào)一些心得.ok,go on. </p><p>  1.編譯安裝ffmpeg </p><p>  刪除不用的已安裝文件,升級(jí)apt-get緩存,安裝必要的開發(fā)工具及庫文件</p><p>  apt-get

60、 remove ffmpeg x264 libx264-dev libmp3lame-dev</p><p>  apt-get update </p><p>  apt-get install build-essential subversion git-core checkinstall yasm texi2html\</p><p>  libopencor

61、e-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev \</p><p>  libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev nasm yasm libbz2-dev </p><p>  需要用到的庫及下載地址</p>

62、<p>  faad2-2.7.tar.gz </p><p>  faac-1.28.tar.gz </p><p>  lame-3.98.4.tar.gz </p><p>  ffmpeg-0.6.1.tar.gz </p><p>  1).faad2的安裝最簡單,直接解壓然后</p><p>  

63、./configure &&make&&make install就ok了. </p><p>  2).faac需要修改一個(gè)文件 </p><p>  vi +123 ./common/mp4v2/mpeg4ip.h </p><p>  從123行開始修改此文件mpeg4ip.h,到129行結(jié)束。</p><p&

64、gt;<b>  修改前:</b></p><p>  #ifdef __cplusplus</p><p>  extern "C" {</p><p><b>  #endif</b></p><p>  char *strcasestr(const char *haysta

65、ck, const char *needle);</p><p>  #ifdef __cplusplus</p><p><b>  }</b></p><p><b>  #endif </b></p><p><b>  修改后:</b></p><p

66、>  #ifdef __cplusplus</p><p>  extern "C++" {</p><p><b>  #endif</b></p><p>  const char *strcasestr(const char *haystack, const char *needle);</p>&

67、lt;p>  #ifdef __cplusplus</p><p><b>  }</b></p><p><b>  #endif </b></p><p><b>  然后默認(rèn)安裝:</b></p><p>  ./configure &&make&a

68、mp;&make install </p><p>  3).lame這樣編譯:</p><p>  ./configure --enable-nasm --disable-shared&&make&&make install </p><p>  4).x264則是取的最新的代碼,然后默認(rèn)安裝</p><

69、p>  git clone git://git.videolan.org/x264.git</p><p>  ./configure &&make &&make install&&cd .. </p><p>  5).ffmpeg的編譯參數(shù)</p><p>  ./configure --enable-gpl

70、 --enable-nonfree --enable-pthreads \</p><p>  --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libx264 </p><p>  為什么要選擇ffmpeg-0.6.1呢?因?yàn)檩^早的版本編譯完以后不能正常使用而從svn取的最新的代碼則會(huì)好端端的出現(xiàn)Unknown

71、 option "--enable-libfaad"錯(cuò)誤. </p><p>  2.安裝segmenter </p><p>  如果您有一定的linux使用經(jīng)驗(yàn),ffmpeg編譯自然不在話下,也比較簡單的,最難的就是這部分的segmenter的編譯安裝了. </p><p><b>  先取出源代碼:</b></

72、p><p>  svn checkout http://svn.assembla.com/svn/legend/segmenter/ segmenter </p><p><b>  修改一個(gè)小地方: </b></p><p>  vi +242 segmenter.c </p><p>  把guess_format修改成

73、av_guess_format </p><p>  不然segmenter會(huì)在編譯的時(shí)候提示:</p><p>  segmenter.c:242: warning: ‘guess_format’ is deprecated (declared at /usr/local/include/libavformat/avformat.h:764)</p><p>  

74、接下來選擇一種編譯方式:</p><p>  gcc -Wall -g segmenter.c -o segmenter -L/usr/include/ffmpeg/libavformat -lavformat -L/usr/include/ffmpeg/libavcodec -lavcodec -L/usr/include/ffmpeg/libavutil -lavutil -I/usr/include/ffm

75、peg/ -lbz2 -lm -lmp3lame -lxvidcore -lx264 -lfaad -lfaac -lpthread -lz</p><p><b>  或者</b></p><p>  gcc -Wall -g segmenter.c -o segmenter -L/usr/local/src/ffmpeg/ffmpeg-0.6.1/libavfor

76、mat -lavformat -L/usr/local/src/ffmpeg/ffmpeg-0.6.1/libavcodec -lavcodec -L/usr/local/src/ffmpeg/ffmpeg-0.6.1/libavutil -lavutil -I/usr/local/src/ffmpeg/ffmpeg-0.6.1/ -lbz2 -lm -lmp3lame -lxvidcore -lx264 -lfaad -lfaac -

77、lpthread -lz </p><p>  其實(shí)無論哪種編譯方式都是手動(dòng)指定了庫文件的位置,不然的話編譯不過,這個(gè)地方最坑人,費(fèi)了很多很多時(shí)間! </p><p>  3.編碼視頻文件并切割 </p><p>  這之前的地方如果你遵循筆者的安裝文檔和提示應(yīng)該很容易就通過了(雖然筆者花費(fèi)了大量的時(shí)間摸索).但是正確編譯以后,你并不知道正確切割文件以后的效果是什么

78、樣的,所以筆者在這里花費(fèi)了超級(jí)大量的時(shí)間,這也是筆者為什么堅(jiān)持要寫出這篇文章的原因.</p><p>  先列出筆者犯的幾個(gè)致命錯(cuò)誤吧: </p><p>  1).不按apple文檔格式轉(zhuǎn)碼</p><p>  因?yàn)楣P者使用的輸入文件在編碼的時(shí)候是針對(duì)apple的設(shè)備優(yōu)化過的,可以直接在apple設(shè)備上播放并獲得良好的觀看效果.而在使用原作者的編碼參數(shù):</

79、p><p>  ffmpeg -i <in file> -f mpegts -acodec libmp3lame -ar 48000 -ab 64k -s 320×240 -vcodec libx264 -b 96k -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs

80、 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate 96k -bufsize 96k -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -async

81、 2 <output file></p><p>  時(shí)報(bào)錯(cuò),在這種情況下,考慮到前一個(gè)原因,筆者自己摸索了一個(gè)編碼代碼:</p><p>  ffmpeg -y -i <in file> -vcodec copy -acodec copy -vbsf h264_mp4toannexb <output file> </p><p>

82、;  是可以正常編碼和分割視頻文件的.但是將應(yīng)用提交給蘋果審核后,蘋果依舊給出了9.2的提示并拒絕了應(yīng)用.這才想起來源視頻在進(jìn)行編碼的過程中音頻并沒有使用64k的編碼也沒有單獨(dú)增加一路音頻流. </p><p>  2).浪費(fèi)時(shí)間解決可以忽略的錯(cuò)誤提示 </p><p>  無論直接正常編譯成功還是編譯失敗從別的機(jī)器上拷貝segmenter過來,在分割視頻的時(shí)候都出現(xiàn)了:</p>

83、;<p>  [mpegts @ 0x2942160]max_analyze_duration reached</p><p>  Output #0, mpegts, to 'a/index':</p><p>  Stream #0.0: Video: libx264, yuv420p, 536x402, q=2-31, 90k tbn, 25 tbc&l

84、t;/p><p>  Stream #0.1: Audio: libmp3lame, 48000 Hz, 2 channels, 64 kb/s</p><p>  [mpegts @ 0x2a08430]muxrate 1 bps, pcr every 5 pkts, sdt every 200, pat/pmt every 40 pkts</p><p>  [NU

85、LL @ 0x2956900]missing picture in access unit </p><p>  "max_analyze_duration reached"和"missing picture in access unit"的提示.最初這兩個(gè)提示困擾了筆者很久,不斷的在網(wǎng)上搜索尋找解決辦法;不斷的重新編譯ffmpeg和segmenter;不斷的更換視頻輸入源

86、,重新編碼;直到最后發(fā)現(xiàn)即便有這兩個(gè)提示存在并不影響視頻的正常播放的時(shí)候,筆者決定接受現(xiàn)實(shí):這兩個(gè)提示可以存在. </p><p>  3).解決視頻長度問題</p><p>  即使上面走過了那么多的艱難,但是你還是會(huì)發(fā)現(xiàn)這個(gè)世界是不完美的.畢竟segmenter是蘋果開發(fā)了以后用在mac上的.不知道是移值到linux還是什么原因,這個(gè)工具的表現(xiàn)有點(diǎn)讓人理解不了.它的參數(shù)是這樣的:<

87、;/p><p>  segmenter <input MPEG-TS file> <segment duration in seconds> <output MPEG-TS file prefix> <output m3u8 index file> <http prefix> </p><p>  第二個(gè)參數(shù),你指定視頻分割間隔的時(shí)

88、候,比如說指定了15秒.如果你的視頻時(shí)長是32秒的話,你的視頻文件會(huì)被分割成3段(每15秒一段,最后的2秒一段),而最后一段的播放時(shí)長,它竟然會(huì)寫成15秒!明明就2秒干嘛要寫成15秒!!!用quicktime還好說,它似乎會(huì)自動(dòng)檢查視頻的時(shí)長糾正時(shí)間和進(jìn)度條,而在iphone上,顯示時(shí)長是取的視頻文件里的時(shí)長(15x3=45s),而下載進(jìn)度條顯示的是實(shí)際文件的視頻時(shí)長(32s),這樣的話,你會(huì)發(fā)現(xiàn),當(dāng)一個(gè)視頻被播放完的時(shí)候,時(shí)間還差13

89、秒!怎么辦呢?沒辦法了,我是看不懂c程序,但是哥會(huì)php啊,不就是時(shí)間不對(duì)嘛,哥給你重新計(jì)算一下時(shí)間重寫一下文件,搞定! </p><p>  4).測試時(shí)的網(wǎng)速問題 </p><p>  為了"大規(guī)模"的隨機(jī)測試視頻,筆者是在服務(wù)器上直接編碼測試的.無論在quicktime還是iphone上,正常的表現(xiàn)應(yīng)該是視頻會(huì)被提前下載兩到三個(gè)小段.結(jié)果筆者測試的時(shí)候,發(fā)現(xiàn)視頻總

90、是播一條下一段,筆者郁悶了很久發(fā)現(xiàn):原來是公司網(wǎng)速太慢了.直接在iphone上用3G測試,很給力! </p><p>  5).轉(zhuǎn)碼耗用cpu問題</p><p>  視頻轉(zhuǎn)碼是最費(fèi)cpu的東東,如果想提高轉(zhuǎn)碼速度還是買兩顆8核的cpu一塊干活吧,速度哇哇的,你懂的.</p><p><b>  筆者用的轉(zhuǎn)碼指令.</b></p>

91、<p>  ffmpeg -y -i a.mp4 -f mpegts -acodec libmp3lame -ar 48000 -ab 64k -vcodec libx264 -b 250k \</p><p>  -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 \

92、</p><p>  -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 \ </p><p>  -bt 250k -maxrate 250k -bufsize 250k -rc_eq 'blurCplx^(1-qComp)' \</p><p>  -qcom

93、p 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -async 2 a.ts</p><p>  segmenter a.ts 15 a a/index.m3u8 http://vod.rainbird.cc/</p><p>  rm -rf a.ts </p><p>  這個(gè)時(shí)候測

94、試時(shí)訪問的url為:http://vod.rainbird.cc/a/index.m3u8</p><p>  4.nginx配置 </p><p>  vi mime.types</p><p>  添加以下兩條兒,重啟nginx</p><p>  application/x-mpegURL m3u8;&l

95、t;/p><p>  video/MP2T ts; </p><p>  一切順利的話,這時(shí)候可以通過測試url觀看視頻了.[4]</p><p>  iPhone應(yīng)用程序開發(fā)的學(xué)習(xí)和系統(tǒng)的實(shí)現(xiàn)</p><p>  3.1 Hello Apple</p><p>  

96、3.1.1 前面已經(jīng)介紹了平臺(tái)的搭建但是由于系統(tǒng)的版本10.5.5過低,現(xiàn)在需要將系統(tǒng)偽裝成10.5.7。步奏如下:</p><p>  第1步:打開虛擬機(jī)的硬盤選擇資源庫文件夾里面的CoreServices文件夾右鍵選擇顯示簡介</p><p>  圖17: CoreServices文件夾的右鍵“顯示簡介”</p><p>  第2步:找到簡介界面的右下角的鎖型

97、雙擊打開輸入密碼(memac.cn)</p><p>  圖18:“顯示簡介”的共享與權(quán)限修改</p><p>  第3步:修改所有的權(quán)限為讀與寫</p><p>  圖19:修改權(quán)限為讀與寫</p><p>  第4步:打開CoreServices找到SystemVersion.plist文件,同樣的方法修改它的權(quán)限 為讀與寫</p&

98、gt;<p>  圖20:找到SystemVersion.plist后修改權(quán)限</p><p>  第5步:打開SystemVersion.plist后修改系統(tǒng)版本為10.5.7</p><p>  圖21:修改系統(tǒng)版本并保存</p><p>  第6步:查看修改后的系統(tǒng)版本信息</p><p>  圖22:系統(tǒng)版本信息修改為1

99、0.5.7</p><p>  3.1.2 下面開始我們的第一個(gè)程序HelloApple,步奏如下:</p><p>  第1步:打開硬盤后選擇Developer文件夾后打開Applications文件夾</p><p>  圖23:打開Applications文件夾</p><p>  第2步:選擇Xcode打開</p>&l

100、t;p>  圖24:打開Xcode</p><p>  第3步:選擇File—New Project</p><p><b>  圖25:新建工程</b></p><p>  第4步:在彈出的對(duì)話框中輸入HelloApple后Save</p><p>  圖26:新建HelloApple保存</p>

101、<p>  第5步:在Xcode中雙擊HelloAppleViewController.xib文件,Interface Builder自動(dòng)執(zhí)行打開該文件,通過Tools選項(xiàng)添加對(duì)象的屬性,關(guān)聯(lián),特征的集成窗口(Library和Attributes Inspector)</p><p>  圖27:打開HelloAppleViewController.xib文件</p><p> 

102、 第6步:從Library中選擇Input & Values,在列表中選擇Lable,將其拖拽到View窗口中</p><p>  圖28:在View中添加Lable</p><p>  第7步:在Lable的屬性里面Text輸入:HelloApple</p><p>  圖29:在Lable中輸入HelloApple</p><p>

103、;<b>  第8步:設(shè)置字體</b></p><p><b>  圖30:字體設(shè)置</b></p><p>  第9步:同樣的方法添加Text Field和UIButton調(diào)整位置</p><p>  圖31:添加Text Field和UIButton</p><p><b>  第10

104、步:保存</b></p><p><b>  圖32:保存</b></p><p>  第11步:點(diǎn)擊Build and Go</p><p><b>  圖33:執(zhí)行</b></p><p>  第12步:點(diǎn)擊Home鍵設(shè)置設(shè)置模擬器</p><p>  圖34

105、:點(diǎn)擊Home鍵返回</p><p>  第13步:設(shè)置模擬器的鍵盤輸入法</p><p><b>  圖35:輸入法設(shè)置</b></p><p>  第14步:設(shè)置輸入法完畢后重新運(yùn)行程序并輸入</p><p>  圖36:重新執(zhí)行程序</p><p>  MediaPlayer Framewo

106、rk播放視頻影片,步奏如下:</p><p>  第1步:圖37——圖43新建一個(gè)Project</p><p><b>  圖37</b></p><p><b>  圖38</b></p><p><b>  圖39</b></p><p><

107、b>  圖40</b></p><p><b>  圖41</b></p><p><b>  圖42</b></p><p><b>  圖43</b></p><p>  圖37—圖43為新建一個(gè)基于View Based的MediaPlayer proje

108、ct</p><p>  第2步:保存以后顯示該P(yáng)roject,選擇Framework右鍵單擊,選擇Add-Existing Framework命令,添加MediaPlayer.Framework</p><p>  圖44:添加MediaPlayer.Framework到Framework文件夾</p><p>  第3步:查看Resources文件夾</p

109、><p>  圖45:Resourse文件夾</p><p>  第四步:打開MoviePlayerViewController.m文件添加如下代碼:</p><p>  - (void)loadView {</p><p>  moviePlayer = [ [ MPMoviePlayerController alloc ] initWithC

110、ontentURL: </p><p>  [NSURL URLWithString: @"http://nctr.pmel.noaa.gov/animations/kuril_2_small.mov" ] ];</p><p>  NSNotificationCenter *notificationCenter = [ NSNotificationCenter def

111、aultCenter ];</p><p>  [ notificationCenter addObserver: self </p><p>  selector:@selector(moviePlayerPlaybackDidFinish:) </p><p>  name: MPMoviePlayerPlaybackDidFinishNotification

112、object: moviePlayer ];</p><p>  moviePlayer.play;</p><p><b>  }</b></p><p>  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

113、{</p><p>  return (interfaceOrientation == UIInterfaceOrientationPortrait);</p><p><b>  }</b></p><p>  - (void)didReceiveMemoryWarning {</p><p>  [super did

114、ReceiveMemoryWarning];}</p><p>  - (void)dealloc {</p><p>  [ super dealloc ];</p><p><b>  }</b></p><p>  -(void)moviePlayerPlaybackDidFinish:(NSNotificatio

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論