iOS視頻開發經驗
手機比PC的優點除了便攜外,我認爲最重要的就是能夠快速方便的創做多媒體做品。照片分享,語音輸入,視頻錄製,地理位置。一個成功的手機APP從產品形態上都有這其中的一項或多項,好比instagram,微信。若是把Web2.0的交互體驗照搬到手機上就是死路一條。 當智能手機趕上視頻就像潘金蓮趕上西門慶,各取所需一拍即合,想不發生點事情都難。他們的結晶就是微視頻。微視頻能夠說把手機的視頻錄製和碎片時間兩個特色發揮到了極致,視頻相關的APP如今無溫不火的緣由我認爲跟坑爹的運營商有關。雖然如今移動網絡流量小速度慢,可是不妨礙咱們先把技術積累作起來。ios
這篇文章主要介紹本人在iOS視頻開發中的一點經驗。瀏覽器
視頻實質:
純粹的視頻(不包括音頻)實質上就是一組幀圖片,通過視頻編碼成爲視頻(video)文件再把音頻(audio)文件有些還有字幕文件組裝在一塊兒成爲咱們看到的視頻(movie)文件。1秒內出現的圖片數就是幀率,圖片間隔越小畫面就越流暢,因此幀率越高效果就越好,須要的存儲空間也就越多。緩存
視頻編碼:
由於不進行編碼的視頻數據量很是大,會形成存儲和傳輸上的困難,因此視頻文件都須要在錄製完成後進行編碼。視頻編碼主要從兩個維度壓縮數據。服務器
- 一、單張圖像某一區域相鄰像素類似,好比一片紅色只記錄紅色色值和區域,不用記錄這個區域的每個像素點。
- 二、相鄰圖像之間內容類似,由於相鄰兩幀要製造連續的效果,因此兩幀之間的內容通常很是接近。目前主流的視頻編碼技術都是用圖像編碼方法對第一幀進行編碼,而後用某種方式描述接下來的幀相對於附近的幀有什麼區別。
視頻格式:
MP四、MOV、AVI、RMVB這些播放格式其實都是封裝格式,除了RMVB比較特殊外,其餘格式內封裝的視頻編碼格式都是H264,H264以高壓縮率聞名於世,壓縮效率比MEPG-2提高一倍多,可是世上沒有一箭雙鵰的事,H264的解碼難度提升了3倍多。微信
視頻碼率:
視頻文件的大小除以是視頻的時長定義爲碼率。網絡
碼率和分辨率跟視頻質量的關係:session
- 碼率能夠理解爲取樣率,單位時間內取樣率越大,精度就越高,同時體積也越大。
- 當視頻沒有通過編碼時,若是分辨率越高,那麼視頻圖像的細節越清晰。
- 但若是視頻通過編碼,被限制在必定碼率內,編碼器就必須捨棄掉一部分細節。
- 因此分辨率和碼率都同清晰度有關。
軟解碼和硬解碼:
對H264的視頻解碼給CPU形成了很大負擔,因此手機工程師把這部分工做交給了更善於進行處理簡單工做可是數據量較大的GPU。框架
- GPU解碼就是所謂的硬解碼
- CPU解碼就是軟解碼。
- iOS提供的播放器類使用的是硬解碼,因此視頻播放對CPU不會有很大的壓力,可是支持的播放格式比較單一,通常就是MP四、MOV、M4V這幾個。
HTTP Live Streaming
HLS簡介
HTTP Live Streaming(縮寫是 HLS)是一個由蘋果公司提出的基於HTTP的流媒體網絡傳輸協議。它的工做原理是把整個流分紅一個個小的基於HTTP的文件來下載,每次只下載一些。
當媒體流正在播放時,客戶端能夠選擇從許多不一樣的備用源中以不一樣的速率下載一樣的資源,容許流媒體會話適應不一樣的數據速率。支持的視頻流編碼爲H.264。咱們在視頻網站上看到的M3U8後綴的播放連接就是使用HLS協議的視頻。ide
HLS優勢
- 一、看完一段緩存一段,防止只看一段視頻可是把整個視頻文件都緩存下來的用戶,減小服務器壓力和節省流量。
- 二、根據用戶網速切換不一樣的碼率,兼顧流程性和清晰度。
HLS支持狀況
- iOS 3.0及以後的版本
- Android 3.0及以後的版本
- HTML5。
終端播放格式的選取
- Android因爲3.0以後才支持HLS,因此Android2.3只能用MP4。
- Android3.0及以後支持HLS。能夠用m3u八、mp4格式
- iOS支持HLS,但不支持flash。能夠用m3u八、mp4格式
- 支持HTML5的瀏覽器 能夠用m3u8。
- 不支持HTML5的瀏覽器只能用flash播放swf。
因爲以上緣由,目前沒法實現一個播放地址在全部的平臺都通用。網站
iOS視頻播放:
iOS提供MPMoviePlayerController類進行播放,支持流媒體和文件播放。視頻內容會渲染到他的View上,能夠放在你想放的任何地方,用起來比較方便。這個類設計上不合理的是視頻播放狀態和視頻加載狀態都是經過Notification通知的,而不是經過block或者delegate。
iOS視頻錄製:
同拍照同樣視頻錄製功能有兩種實現方式
- 一、UIImagePickerViewController
- 二、AVFoundation。
這裏只討論AVFoundation框架,這個框架是蘋果提供的底層多媒體框架,用於音視頻採集、音視頻解碼、視頻編輯等,多媒體基本上都依賴AVFoundation框架。
視頻錄製和拍照須要作的工做差很少,主要有如下5步:
- 一、建立會話AVCaptureSession,用於控制input到output的流向。
- 二、獲取設備AVCaptureDevice,攝像頭用於視頻採集,話筒用於音頻採集。
- 三、建立輸入設備AVCaptureDeviceInput,將設備綁定到input口中,並添加到session上
- 四、建立輸出AVCaptureOutput,能夠輸出到文件和屏幕上。 AVCaptureMovieFileOutput 輸出一個電影文件 AVCaptureVideoDataOutput 輸出處理視頻幀,用於顯示正在錄製的視頻 AVCaptureAudioDataOutput 輸出音頻數據
- 五、音視頻合成到一個文件中
iOS對視頻實時處理:
若是須要對視頻進行實時處理(固然須要不然看不到正在錄製的內容),則須要直接對相機緩衝區(camera buffer)中的視頻流進行處理。
- 一、定義一個視頻數據輸出(AVCaptureVideoDataOutput), 並將其添加到session上。
- 二、設置接受的controller做爲視頻數據輸出緩衝區(sample buffer)的代理。
- 三、實現代理方法
-(void)captureOutput:(AVCaptureOutput )captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection )connection 當數據緩衝區(data buffer)一有數據時,AVFoundation就調用該方法。在該代理方法中,咱們能夠獲取視頻幀、處理視頻幀、顯示視頻幀。實時濾鏡就是在這裏進行處理的。在這個方法中將緩衝區中的視頻數據(就是幀圖片)輸出到要顯示的layer上。