封裝格式
指的是.avi .mkv .mp4這些后綴的文件, 可以把它理解為視頻文件和音頻文件的容器.
編碼格式
itu 國(guó)際電信聯(lián)盟 推出的 h263
iso 國(guó)際標(biāo)準(zhǔn)化組織 推出的 mpeg
為統(tǒng)一標(biāo)準(zhǔn), itu和iso合作開發(fā)了h264和h265.
h264, h265 叫做編碼格式
h264 mpeg4-avc是一回事, 只是2個(gè)組織的叫法不同.
h265 hevc 也是一回事.
google推出的是vp8和vp9, 但不是主流編碼格式.
使用ffmpeg的命令行, 就可以把一個(gè).mp4文件拆分成一個(gè).h264文件和一個(gè).aac文件.
原始的視頻數(shù)據(jù)是 yuv -> 編碼后就是 h264格式的文件.
音頻的視頻數(shù)據(jù)是 pcm -> 編碼后生成 aac格式的文件.
android mediacodec 創(chuàng)建解碼器, 傳參 video/avc就是對(duì)應(yīng)h264, video/hevc對(duì)應(yīng)h265.
h264和h265的區(qū)別
h264的宏塊大小是44到1616之間, h265是44到6464之間, 因此生成的文件h265一般只是h264的一半大小.
I幀, P幀和B幀的概念
宏塊 = 網(wǎng)格, 就是把一張圖分割成很多的小網(wǎng)格.
對(duì)宏塊的數(shù)據(jù)保存, 只保存宏塊的上邊像素?cái)?shù)據(jù)和左邊的像素?cái)?shù)據(jù). 其他的數(shù)據(jù)不保存, 而是使用一個(gè)方向預(yù)測(cè)值來保存. 這樣就可以減少很多的數(shù)據(jù)保存量. 因此宏塊越大, 數(shù)據(jù)節(jié)省的越多.
I幀: 對(duì)所有宏塊的數(shù)據(jù)進(jìn)行保存.
P幀: 只保留I幀中同樣存在宏塊的位置變化的適量數(shù)據(jù), 還有上一個(gè)I幀中不存在的宏塊數(shù)據(jù).
B幀: 對(duì)比前后的I幀和P幀, 只保留一個(gè)變化的百分比, 因此B幀是非常小的.
視頻文件中第一幀是I幀, 當(dāng)算法判斷下一幀圖像的相似度小于5%時(shí), 創(chuàng)建B幀, 下一幀圖像的相似度在5%和30%之間時(shí), 創(chuàng)建P幀.
視頻文件中, 第一幀一定是I幀, 第二幀一定是P幀, 后面跟著幾個(gè)B幀.
視頻播放的本質(zhì)是宏塊的運(yùn)動(dòng).
在接收端, 判斷I幀的起始位置是用分隔符00 00 00 01來判斷的, 如果后面是65, 那么代表是I幀.
如果小概率發(fā)現(xiàn)圖像宏塊的數(shù)據(jù)中也正好是00 00 00 01的話, 那就轉(zhuǎn)義一下中間再插個(gè)值, 比如00 00 03 00 01, 避免在視頻解碼時(shí)把它看做是視頻幀的分隔符.
視頻硬編碼和軟編碼的主要區(qū)別
硬編碼就是使用android原生的MediaCodec使用GPU編碼, 軟編碼就是使用ffmpeg+openH264編碼器使用CPU編碼.
- 軟編碼需要引入額外的庫(kù), 硬編碼不需要.
- 軟編碼速度慢, 但是對(duì)數(shù)據(jù)的壓縮率高, 但是占用CPU資源高, 還會(huì)影響電池耗電情況. 硬編碼正好相反.
- 軟編碼兼容性好, android機(jī)型碎片化問題和系統(tǒng)版本眾多, 因此使用MediaCodec會(huì)有機(jī)型適配的問題需要額外處理.