轉(zhuǎn)自 http://www.cnblogs.com/zy1987/p/4520118.html
這段時間要做視頻開發(fā)了梦碗,零基礎(chǔ)開始好憂傷??空凸,先開始基礎(chǔ)掃盲吧~看到這篇文章很不錯冈止,轉(zhuǎn)啦~
視頻實質(zhì):
純粹的視頻(不包括音頻)實質(zhì)上就是一組幀圖片锯茄,經(jīng)過視頻編碼成為視頻(video)文件再把音頻(audio)文件有些還有字幕文件組裝在一起成為我們看到的視頻(movie)文件细卧。1秒內(nèi)出現(xiàn)的圖片數(shù)就是幀率鹃彻,圖片間隔越小畫面就越流暢郊闯,所以幀率越高效果就越好,需要的存儲空間也就越多蛛株。
視頻編碼:
因為不進行編碼的視頻數(shù)據(jù)量非常大团赁,會造成存儲和傳輸上的困難,所以視頻文件都需要在錄制完成后進行編碼谨履。視頻編碼主要從兩個維度壓縮數(shù)據(jù)欢摄。
1、單張圖像某一區(qū)域相鄰像素相似笋粟,比如一片紅色只記錄紅色色值和區(qū)域怀挠,不用記錄這個區(qū)域的每一個像素點。
2害捕、相鄰圖像之間內(nèi)容相似绿淋,因為相鄰兩幀要制造連續(xù)的效果,所以兩幀之間的內(nèi)容一般非常接近尝盼。目前主流的視頻編碼技術(shù)都是用圖像編碼方法對第一幀進行編碼吞滞,然后用某種方式描述接下來的幀相對于附近的幀有什么區(qū)別。
視頻格式:
MP4盾沫、MOV裁赠、AVI、RMVB這些播放格式其實都是封裝格式疮跑,除了RMVB比較特殊外组贺,其他格式內(nèi)封裝的視頻編碼格式都是H264,H264以高壓縮率聞名于世祖娘,壓縮效率比MEPG-2提升一倍多失尖,但是世上沒有兩全其美的事,H264的解碼難度提高了3倍多渐苏。
視頻碼率:
視頻文件的大小除以是視頻的時長定義為碼率掀潮。
碼率和分辨率跟視頻質(zhì)量的關(guān)系:
碼率可以理解為取樣率,單位時間內(nèi)取樣率越大琼富,精度就越高仪吧,同時體積也越大。
當視頻沒有經(jīng)過編碼時鞠眉,如果分辨率越高薯鼠,那么視頻圖像的細節(jié)越清晰择诈。
但如果視頻經(jīng)過編碼,被限制在一定碼率內(nèi)出皇,編碼器就必須舍棄掉一部分細節(jié)羞芍。
所以分辨率和碼率都同清晰度有關(guān)。
軟解碼和硬解碼:
對H264的視頻解碼給CPU造成了很大負擔郊艘,所以手機工程師把這部分工作交給了更善于進行處理簡單工作但是數(shù)據(jù)量較大的GPU荷科。
GPU解碼就是所謂的硬解碼
CPU解碼就是軟解碼。
iOS提供的播放器類使用的是硬解碼纱注,所以視頻播放對CPU不會有很大的壓力畏浆,但是支持的播放格式比較單一,一般就是MP4狞贱、MOV刻获、M4V這幾個。
HTTP Live Streaming (HLS簡介)
HTTP Live Streaming(縮寫是 HLS)是一個由蘋果公司提出的基于HTTP的流媒體網(wǎng)絡(luò)傳輸協(xié)議斥滤。它的工作原理是把整個流分成一個個小的基于HTTP的文件來下載将鸵,每次只下載一些。
當媒體流正在播放時佑颇,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源腮出,允許流媒體會話適應(yīng)不同的數(shù)據(jù)速率就轧。支持的視頻流編碼為H.264。我們在視頻網(wǎng)站上看到的M3U8后綴的播放鏈接就是使用HLS協(xié)議的視頻。
HLS優(yōu)點
1惨篱、看完一段緩存一段辛块,防止只看一段視頻但是把整個視頻文件都緩存下來的用戶摘完,減少服務(wù)器壓力和節(jié)省流量沼头。
2、根據(jù)用戶網(wǎng)速切換不同的碼率解藻,兼顧流程性和清晰度老充。
HLS支持情況
iOS 3.0及之后的版本
Android 3.0及之后的版本
HTML5。
終端播放格式的選取
Android由于3.0之后才支持HLS螟左,所以Android2.3只能用MP4啡浊。
Android3.0及之后支持HLS〗罕常可以用m3u8巷嚣、mp4格式
iOS支持HLS,但不支持flash钳吟⊥⒘#可以用m3u8、mp4格式
支持HTML5的瀏覽器 可以用m3u8。
不支持HTML5的瀏覽器只能用flash播放swf坝茎。
由于以上原因涤姊,目前無法實現(xiàn)一個播放地址在所有的平臺都通用。
iOS視頻播放:
iOS提供MPMoviePlayerController類進行播放嗤放,支持流媒體和文件播放砂轻。視頻內(nèi)容會渲染到他的View上,可以放在你想放的任何地方斤吐,用起來比較方便。這個類設(shè)計上不合理的是視頻播放狀態(tài)和視頻加載狀態(tài)都是通過Notification通知的厨喂,而不是通過block或者delegate和措。
iOS視頻錄制:
同拍照一樣視頻錄制功能有兩種實現(xiàn)方式
1、UIImagePickerViewController
2蜕煌、AVFoundation派阱。
這里只討論AVFoundation框架,這個框架是蘋果提供的底層多媒體框架斜纪,用于音視頻采集贫母、音視頻解碼、視頻編輯等盒刚,多媒體基本上都依賴AVFoundation框架腺劣。
視頻錄制和拍照需要做的工作差不多,主要有以下5步:
1因块、創(chuàng)建會話AVCaptureSession橘原,用于控制input到output的流向。
2涡上、獲取設(shè)備AVCaptureDevice趾断,攝像頭用于視頻采集,話筒用于音頻采集吩愧。
3芋酌、創(chuàng)建輸入設(shè)備AVCaptureDeviceInput,將設(shè)備綁定到input口中雁佳,并添加到session上
4脐帝、創(chuàng)建輸出AVCaptureOutput,可以輸出到文件和屏幕上甘穿。 AVCaptureMovieFileOutput 輸出一個電影文件 AVCaptureVideoDataOutput 輸出處理視頻幀腮恩,用于顯示正在錄制的視頻 AVCaptureAudioDataOutput 輸出音頻數(shù)據(jù)
5、音視頻合成到一個文件中
iOS對視頻實時處理:
如果需要對視頻進行實時處理(當然需要否則看不到正在錄制的內(nèi)容)温兼,則需要直接對相機緩沖區(qū)(camera buffer)中的視頻流進行處理秸滴。
1、定義一個視頻數(shù)據(jù)輸出(AVCaptureVideoDataOutput), 并將其添加到session上募判。
2荡含、設(shè)置接受的controller作為視頻數(shù)據(jù)輸出緩沖區(qū)(sample buffer)的代理咒唆。
3、實現(xiàn)代理方法
-(void)captureOutput:(AVCaptureOutput)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection)connection
當數(shù)據(jù)緩沖區(qū)(data buffer)一有數(shù)據(jù)時释液,AVFoundation就調(diào)用該方法全释。在該代理方法中,我們可以獲取視頻幀误债、處理視頻幀浸船、顯示視頻幀。實時濾鏡就是在這里進行處理的寝蹈。在這個方法中將緩沖區(qū)中的視頻數(shù)據(jù)(就是幀圖片)輸出到要顯示的layer上李命。