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