編碼就是按照一定的格式記錄采樣和量化后的數(shù)據(jù).
編碼中軟編碼和硬編碼的區(qū)別?
硬編碼,就是使用GPU計(jì)算,獲取數(shù)據(jù)結(jié)果,優(yōu)點(diǎn)速度快,效率高.
軟編碼,就是通過CPU來(lái)計(jì)算,獲取數(shù)據(jù)結(jié)果.
壓縮算法分為2種,有損壓縮與無(wú)損壓縮.
解碼:將壓縮的數(shù)據(jù)還原
二. 直播APP需求剖析
2.1 直播項(xiàng)目流程
在直播項(xiàng)目中,一般常見有8個(gè)步驟.
- 音視頻采集
- 視頻濾鏡
- 音視頻編碼
- 推流
- 流媒體服務(wù)器處理
- 拉流
- 音視頻解碼
- 音視頻播放
采集視頻,音頻
使用iOS原生框架 AVFoundation.framework
視頻濾鏡處理
使用iOS原生框架 CoreImage.framework
使用第三方框架 GPUImage.framework
CoreImage 與 GPUImage 框架比較: 在實(shí)際項(xiàng)目開發(fā)中,開發(fā)者更加傾向使用于GPUImage框架. 首先它在使用性能上與iOS提供的原生框架,并沒有差別;其次它的使用便利性高于iOS原生框架,最后也是最重要的GPUImage框架是開源的.而大家如果想要學(xué)習(xí)GPUImage框架,建議學(xué)習(xí)OpenGL ES,其實(shí)GPUImage的封裝和思維都是基于OpenGL ES.
視頻和音頻分開編碼的
視頻**音頻編碼壓縮
硬編碼
視頻: VideoToolBox框架
音頻: AudioToolBox 框架
軟編碼
視頻: 使用FFmpeg,X264算法把視頻原數(shù)據(jù)YUV/RGB編碼成H264
音頻: 使用fdk_aac 將音頻數(shù)據(jù)PCM轉(zhuǎn)換成AAC
推流
推流: 將采集的音頻.視頻數(shù)據(jù)通過流媒體協(xié)議發(fā)送到流媒體服務(wù)器
推流技術(shù)
流媒體協(xié)議: RTMP\RTSP\HLS\FLV
視頻封裝格式: TS\FLV
音頻封裝格式: Mp3\AAC
流媒體服務(wù)器
- 數(shù)據(jù)分發(fā)
- 截屏
- 實(shí)時(shí)轉(zhuǎn)碼
- 內(nèi)容檢測(cè)
拉流
- 拉流: 從流媒體服務(wù)器中獲取音頻\視頻數(shù)據(jù)
- 流媒體協(xié)議: RTMP\RTSP\HLS\FLV
音視頻解碼
硬解碼
視頻: VideoToolBox框架
音頻: AudioToolBox 框架
軟解碼
視頻: 使用FFmpeg,X264算法解碼
音頻: 使用fdk_aac 解碼
播放
- ijkplayer 播放框架
- kxmovie 播放框架
ijkplayer,kxmovie 都是基于FFmpeg框架封裝的
H264壓縮的視頻文件。vlc可以播放、先解碼再播放
視頻、和音頻怎么同步的?
根據(jù)時(shí)間戳來(lái)實(shí)現(xiàn)同步
1秒播放16張圖片 fps 播放速度
視頻壓縮的原理:IPB幀
- I幀: 保留了一張完整視頻幀. 解碼關(guān)鍵!(幀內(nèi)預(yù)測(cè)壓縮)
- P幀: 先前參考幀.差異數(shù)據(jù).解碼需要依賴于I幀
- B幀: 雙向參考幀,解碼時(shí)既需要I幀,也需要P幀!
花屏:解碼出現(xiàn)錯(cuò)誤就是花屏問題、解決:當(dāng)出現(xiàn)錯(cuò)誤就不去顯示、等待下一段視頻出來(lái)接顯示、出來(lái)的問題是卡頓;
幀:圖片
幀間預(yù)測(cè)壓縮:一組圖片壓縮
幀內(nèi)預(yù)測(cè)壓縮:一張圖片壓縮
H.264碼流在網(wǎng)絡(luò)中傳輸時(shí)實(shí)際是以NALU的形式進(jìn)行傳輸?shù)?
1、SPS :序列參數(shù)集、PPS:圖像參數(shù)集
2、寫入文件
3、NSLU
大端:讀取內(nèi)存的方式、
小端:
大端 轉(zhuǎn)小端 CFSwapInt32HostToBig
iOS 系統(tǒng)默認(rèn)的是小端模式
參考與:老師