FFMpeg編譯
- Step1
先下載文件:https://github.com/libav/gas-preprocessor,
復(fù)制gas-preprocessor.pl到/usr/bin下,
Q1 無權(quán)限
A1 屏蔽方法:重啟Mac,按住command+R,進(jìn)入recovery模式。選擇打開Utilities下的終端,輸入:csrutil disable并回車,然后正常重啟Mac即可 - Step2
修改權(quán)限,需要終端在user/bin目錄下
sudo chmod a+rwx gas-preprocessor.pl - Step3
安裝Yasm http://www.tortall.net/projects/yasm/releases/
解壓之后,在命令行中
cd yasm-1.2.0
./configure
make
sudo make install - Step4 下載
**FFmpeg-iOS-build-script **https://github.com/kewlbear/FFmpeg-iOS-build-script - Step4.2 下載ffmpeg的源碼
放入ffmpeg-ios-build-script目錄中 - Step5 編譯
FFmpeg-iOS-build-script-master runo$ ./build-ffmpeg.sh - Step6
編譯完成后取出相關(guān)的靜態(tài)包和頭文件導(dǎo)入工程中 - Step7 修改appdelegate.m為 .mm
導(dǎo)入系統(tǒng)庫
libz.dylib,libbz2.dylib,libiconv.dylib - Step8 在viewcontroller導(dǎo)入#include “avformat.h”,添加一句av_register_all();
Q 編譯的時候報錯: 'libavcodec/avcodec.h' file not found ,
A 修改Header search paths 里的路徑: $(PROJECT_DIR)/FFmpeg-iOS/include
注意文件存放的位置
Q 出現(xiàn)
Undefined symbols for architecture x86_64:
"_CMBlockBufferCreateWithMemoryBlock", referenced from:
_videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
A 接著導(dǎo)入coreVideo.framework coreMdedia.framework VideoToolbox.framework
FFmpeg
- ffmpeg是一個編解碼框架,能夠支持各種不同的編解碼器,并采用統(tǒng)一的 api 去調(diào)用。但其默認(rèn)只提供了針對各種媒體格式的解碼器(基本上涵蓋得比較全了),而編碼器默認(rèn)提供很少的幾個開源的格式(或者已經(jīng)無需專利保護(hù)的格式)。所以,如果你需要 FFmpeg 具備支持多種媒體格式的編碼能力,你需要額外下載并安裝那些編碼器(主要是通過安裝這些編碼器獲得它們的頭文件、動態(tài)庫及靜態(tài)庫用于 FFmpeg 編譯),才能保證在 FFmpeg 編譯時載入這些編碼器的二進(jìn)制代碼,使 FFmpeg 具備這些編碼功能。
- 流媒體:在網(wǎng)絡(luò)上基于流式傳輸,可以立即解碼播放流式傳輸定義很廣泛,主要指通過網(wǎng)絡(luò)傳送媒體(如視頻、音頻)的技術(shù)總稱。其特定含義為通過Internet 將影視節(jié)目傳送到PC機(jī)。實(shí)現(xiàn)流式傳輸有兩種方法
- 實(shí)時流式傳輸(Real time streaming)實(shí)時流式傳輸指保證媒體信號帶寬與網(wǎng)絡(luò)連接匹配,使媒體可被實(shí)時觀看到。實(shí)時流式傳輸根據(jù)網(wǎng)絡(luò)情況調(diào)整輸出音視頻的質(zhì)量從而實(shí)現(xiàn)媒體的持續(xù)的實(shí)時傳送,用戶可快進(jìn)或后退以觀看前面或后面的內(nèi)容。RTSP,需要專門的流媒體服務(wù)器,和傳輸協(xié)議
- 順序流式傳輸(progressive streaming)順序流式傳輸是順序下載,在下載文件的同時用戶可觀看在線媒體,在給定時刻,用戶只能觀看已下載的那部分,而不能跳到還未下載的前頭部分,在傳輸期間不根據(jù)用戶連接的速度對下載順序做調(diào)整。
- RTSP :命令和數(shù)據(jù)分離管道
- RTMP:命令和數(shù)據(jù)公用同一管道
- MPEG:一種編碼標(biāo)準(zhǔn),mpeg并不是對每格視頻進(jìn)行壓縮,而是以秒為單位,將時段內(nèi)的每一格視頻做比較,由于一般視頻內(nèi)容都是背景變化小,主體變化大,mpeg技術(shù)就是應(yīng)用于這個特點(diǎn),以一幅視頻為主圖,其余視頻格只是記錄參考資料及變化數(shù)據(jù),更有效記錄動態(tài)視頻。
MPEG只規(guī)定比特流的格式與解碼精確度(即規(guī)定解碼的方法),而任何人可依照MPEG標(biāo)準(zhǔn)以不同方式實(shí)現(xiàn)編碼器(程序)。除了可減少因編碼專利造成的商業(yè)利益糾紛外,MPEG標(biāo)準(zhǔn)的主要目的在于確保不同的編碼器所產(chǎn)生的比特流可被其他解碼器正確的解碼,只要此比特流匹配標(biāo)準(zhǔn)。 -
編碼格式表
image.png - 像素(pixel):視頻顯示的最小單位
- 分辨率:是屏幕圖像的精密度,是指顯示器所能顯示的所有像素有多少。
- 顯示分辨率:顯示屏能顯示的像素,顯示分辨率一定的情況下,顯示屏越小圖像越清晰,反之,顯示屏大小固定時,顯示分辨率越高圖像越清晰。
- 視頻分辨率:視頻的像素
例如:1080P,意思是1920 x 1080的視頻
- 轉(zhuǎn)碼率:完整視頻通過壓縮算法壓縮時,壓縮比例越大,還原后的失真越大,因?yàn)閴嚎s過程中不可避免的丟失了視頻中原來的圖像數(shù)據(jù)信息,碼率(bps(bit per second))就是在壓縮視頻的時候指定一個參數(shù),告訴壓縮軟件,期望壓縮后的視頻的大小,平均每秒多少個比特位。
- 例如:100分鐘 1GB的視頻,
100min = 100 * 60 = 6000s
1GB=1024MB=10241024KB = 102410241024Byte = 1024102410248bit = 8589934592bit
那么這個視頻的碼率就是 1.4Mbit/s (8589934593/6000) = 1431655 bit/s
- 例如:100分鐘 1GB的視頻,
-
視頻格式:是指用什么樣的方式把視頻和音頻數(shù)據(jù)打包成一個文件。
image.png -
視頻播放流程:
image.png- 解協(xié)議:是指播放網(wǎng)絡(luò)視頻的時候協(xié)議網(wǎng)絡(luò)協(xié)議:如HTTP,RTMP等,就是將流媒體協(xié)議的數(shù)據(jù),解析為標(biāo)準(zhǔn)的相應(yīng)的封裝格式數(shù)據(jù)。
- 解封裝:就是將輸入的封裝格式的數(shù)據(jù)分離成音頻流壓縮編碼數(shù)據(jù)和視頻流壓縮編碼數(shù)據(jù)。demux
- 解碼:將音/視頻壓縮編碼數(shù)據(jù),解碼成非壓縮的原始數(shù)據(jù),decode
- 視頻音頻同步:接封裝中得到的參數(shù)信息,同步解碼出來的音/視頻數(shù)據(jù),getframe
- 幀率:就是fps(frame per second)每秒更新的次數(shù)
- YUV:是圖像的編碼格式,Y是亮度 UV是色彩飽和度
- YUV444: 每四個Y采樣就采樣四個UV 總字節(jié)大?。篽eightwidth3
- YUV420:每四個Y采樣就采樣一個UV 總字節(jié)大?。篽eightwidth(1/4+1/4+2/2)相當(dāng)于(u:v:y)
- YUV422:每兩個Y采樣就采樣一個UV 總字節(jié)大小:heightwidth(1/2+1/2+2/2)
image.png



