日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

干货 | 手把手教你iOS自定义视频压缩

發布時間:2024/1/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 干货 | 手把手教你iOS自定义视频压缩 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者簡介

孫龍波,攜程內容信息研發部 Native 開發 leader。目前主要負責攜程攻略,行程,視頻直播等項目的前端開發和團隊管理。

一、前言

隨著抖音,快手等APP的迅猛發展,短視頻在移動端的地位越來越突出。而視頻壓縮是視頻傳輸中很關鍵的一步。

本文會通過一個示例引入視頻的一些基本概念并做稍微深入的介紹,最終給出在iOS上實現自定義碼率和分辨率的視頻壓縮方案。這篇文章同時也是一個大雜燴,對于很多首次接觸視頻領域的同學是一個不錯的入門文章。

二、 傳統視頻壓縮方式的缺陷

1、傳統壓縮的實現

產品需求:不管原視頻的清晰度如何,壓縮后的視頻碼率和分辨率是一樣的。大家首先想到的應該是iOS在AVFoundation中已經提供了簡單的視頻壓縮方法,示例代碼如下:

正常情況下這段代碼不會出現任何問題,但是大家可以用下面的視頻做個測試,鏈接: https://pan.baidu.com/s/1wLVbDFtzROVPo8T1qw6MXA 密碼: ij7d。

結果會發現原視頻分辨率1080x608,大小 90M,經過上面的代碼壓縮后變成了分辨率960x540, 大小147M!分辨率降低但是文件大小增加了! 輸出的日志如下:

2、壓縮參數分析

問題出在哪里?這個視頻有什么特殊的地方?我們嘗試用mediainfo工具查看壓縮前后兩個視頻的詳細參數。

原視頻參數信息

壓縮后的視頻參數:

3、視頻參數詳解

首先我們要清楚截圖中幾個關鍵指標的含義。

1)碼率(bit rate)是指數據傳輸時單位時間傳送的數據位數,單位是bit per second(bps)。簡單的說碼率=視頻文件大小/視頻時長。

2)幀率(frame rate)指每秒鐘有多少個畫面,單位Frame Per Second簡稱FPS。視頻實際是由一組連續的圖片組成的,由于人眼有視覺暫留現象,畫面幀率高于16的時候大腦就會把圖片連貫成動畫,高于24大腦就認為是非常流暢了。所以24FPS是視頻行業的標準。

但這并不是人眼的極限,幀率繼續提高能獲取更好更流暢的體驗,直到人眼無法區別(極限因人而異,美國空軍曾做過一項測試,極限大概是220FPS,正常人遠低于這個數字)。所以游戲行業為了更逼真的效果獲取更好的用戶體驗將標準定為30FPS

3)分辨率:習慣上我們說的分辨率是指圖像的高/寬像素值,嚴格意義上的分辨率是指單位長度內的有效像素值ppi(每英寸像素Pixel per inch)。差別是,圖像的高/寬像素值和尺寸無關,但單位長度內的有效像素值ppi和尺寸就有關了。比如,同樣Width x Height的圖片,尺寸越大ppi越小。

4、視頻編碼標準

解釋完上面幾個概念大家可以得出比較直觀的結論,幀率相同的情況下(壓縮前后都是30FPS),分辨率越高碼率越大,但是截圖的中的參數顯示碼率大的分辨率低。仔細對比兩個視頻的參數會發現唯一有區別的是 Format profile,這個參數才是問題的根源。

在介紹這個參數之前需要了解另一個概念,H264視頻編碼。所謂視頻編碼方式就是指通過特定的壓縮技術,將某個視頻格式的文件轉換成另一種視頻格式文件的方式。

如果視頻不編碼會出現什么后果?我們來計算一下,以原視頻為例,每秒鐘包含了30張1080x600的圖片,那一秒鐘的視頻大小應該是 1080x60030/(102410248) = 2.3 MB. 這個視頻有3分42秒 ,文件大小應該是 2.3222 = 510MB 遠超過95M。既然編碼是必須的那編碼標準有哪些呢?

國際上制定視頻編解碼技術的組織有兩個,一個是“國際電聯(ITU-T)”,它制定的標準有H.261、H.263、H.263+等,另一個是“國際標準化組織(ISO)”它制定的標準有MPEG-1、MPEG-2、MPEG-4等。

而H.264則是由兩個組織聯合組建的聯合視頻組(JVT)共同制定的新數字視頻編碼標準,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高級視頻編碼(Advanced Video Coding,AVC)的第10 部分。所以大家在用不同工具查看同一個視頻時有時候會顯示AVC有時候會顯示H.264實際是同一種編碼方式。

5、H264編碼詳解

而H264最大的優勢就是低碼率情況下提供高質量的視頻圖像。怎么做到的?這個問題比較復雜可以新開一篇文章來專門介紹了。有興趣的大家可以看一下這篇介紹:http://read.pudn.com/downloads147/ebook/635957/新一代視頻壓縮編碼標準H.264.pdf

總的來說編碼流程可以分為五部分:幀間和幀內預測(Estimation)、變換(Transform)和反變換、量化(Quantization)和反量化、環路濾波(Loop Filter)、熵編碼(Entropy Coding)。而H264為了滿足不同設備不同場景的需要(比如直播注重實時性,存儲注重壓縮比)定義了多種編碼層次也就是Profile,官方給Profile的定義是:

The standarddefines a set of capabilities, which are referred to as profiles,targeting specific classes of applications. These are declared as a profilecode (profile_idc) and a set of constraints applied in the encoder. This allowsa decoder to recognize the requirements to decode that specific stream.

Profiles可以細分為十幾種,實際使用的主要有以下四種,

1)BaslineProfile:支持I/P 幀,只支持無交錯(Progressive)和CAVLC

Extended Profile:支持I/P/B/SP/SI 幀,只支持無交錯(Progressive)和CAVLC

2)MainProfile:提供I/P/B 幀,支持無交錯(Progressive)和交錯(Interlaced),也支持CAVLC 和CABAC

3)High Profile:在mainProfile 的基礎上增加了8x8內部預測、自定義量化、 無損視頻編碼和更多的YUV 格式;

大家對里面的術語可能不太理解,簡單介紹下。

視頻壓縮很重要的一個就是幀間預測,也就是視頻相鄰的幾幀有很大的相關性,變化不會太大,所以存在很多冗余信息,壓縮要做的就是去除這些冗余信息。幀類型主要有以下幾種

1)I幀表示關鍵幀,這一幀保留完整的畫面數據,解碼時只需要本幀數據就可以完成

2)P幀,前向預測幀,表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前的畫面疊加上本幀定義的差別,生成最終畫面。

3)B幀是雙向預測幀,也就是B幀記錄的是本幀與前后幀的差別,要解碼B幀,不僅要取得之前的畫面,還要解碼之后的畫面,通過前后畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時比較耗費CPU 。

總結起來就是Profile 越高,壓縮比就越高,但是編碼、解碼時要求的設備性能也就越高,編碼、解碼的效率也就越低。

6、Profile與Level詳解

回到之前的兩個視頻信息,profile分別是main@L3.1,high@L3.1, 現在我們搞清楚了main和high是profile,L3.1是什么?這個是profile的碼流級別,同樣給出官方的定義:

As the term is used in the standard, a “level” is aspecified set of constraints that indicate a degree of required decoderperformance for a profile. For example, a level of support within a profilespecifies the maximum picture resolution, frame rate, and bit rate that adecoder may use. A decoder that conforms to a given level must be able todecode all bitstreams encoded for that level and all lower levels.

簡單的說level就是對每個profile的能力細分。

而3.1規定的最高標準如下:

Level

Max. decoding speed

Max. frame size

Max. video bit rate for
video coding layer (VCL)
kbit/s (Baseline, Extended and
Main Profiles)

Examples for high resolution
@ highest frame rate

Toggle additional details

Luma samples/s

Macroblocks/s

Luma samples

Macroblocks

3.1

27,648,000

108,000

921,600

3,600

14,000

352x288@172
352x576@130
640x480@90
720×576@60

1,280×720@30

7、iOS設備對Profile和level的支持情況

了解完視頻的profile和level之后,大家會有疑問,既然每種profile對設備性能的要求不同,蘋果的不同機型對各種profile支持程度是怎樣的?可以參照下面的列表:

iPhone 3GS 和更早的設備支持 Baseline Profile level 3.0 及更低的級別

iPhone 4S 支持 High Profile level 4.1 及更低的級別

iPhone 5C 支持 High Profile level 4.1 及更低的級別

iPhone 5S 支持 High Profile level 4.1 及更低的級別

iPad 1 支持 Main Profile level 3.1 及更低的級別

iPad 2 支持 Main Profile level 3.1 及更低的級別

iPad with Retina display 支持 High Profile level 4.1 及更低的級別

iPad mini 支持 High Profile level 4.1 及更低的級別

三、 自定義視頻壓縮方案

1、實現思路

基本概念都搞清楚了,而我們只需要支持iphone 5C以上機型的背景下,要想獲得最大的視頻壓縮率采取的最好辦法就是:

(1)指定highprofile

(2)降低幀率

(3)適當降低分辨率

最終來獲取更低的碼率。 問題來了,文章最開始的壓縮方式不支持指定profile,幀率和碼率。所以只有通過其他方式來實現。參照了括蘋果官網的一個錄像時自定義碼率的實現

https://developer.apple.com/library/archive/samplecode/RosyWriter/Introduction/Intro.html

在錄像時需要將拍攝的每一幀sampleBuffer(音頻或者視頻)傳給assetWriter,并制定壓縮參數。

而我們要實現的是視頻壓縮,不是錄像,怎么辦?思路很簡單,先通過assetReader取出每一幀sampleBuffer(音頻或視頻),然后指定壓縮參數后將每一幀傳給assetWriter最終實現自定義壓縮的目的。具體的流程如下:

2、代碼實現

1)初始化 reader,writer,video/audio track, video/audio input, video/audio output

2)指定音視頻的壓縮碼率,profile,幀率等關鍵參數信息

3)開始讀寫

4)視頻逐幀寫入

5)音頻逐幀寫入

6)完成壓縮

壓縮效果如下:

最終自定義的視頻壓縮方案有了,其實逐幀寫入還可以做添加水印,濾鏡等動作,之后可以在后續的文章里進一步介紹。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MjM5MDI3MjA5MQ%3D%3D&mid=2697267472&idx=2&sn=8260857e7fc9201bad8decaf04b0ebe9&chksm=8376f624b4017f32c18186ac4c30ce3e0a22b2ca3d82089c857d5d7ed4c26e6e433f0ac44e5c&mpshare=1&scene=23&srcid=0904cbU12nkK96nGMZwKCHVf%23rd

服務推薦

  • 蜻蜓代理
  • 代理ip
  • 微信域名攔截檢測
  • 微信域名檢測api

總結

以上是生活随笔為你收集整理的干货 | 手把手教你iOS自定义视频压缩的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。