音視頻相關問題

視頻相關的問與答:

一、YUV的內存存儲格式
YUV格式有很多種,比如YUV420,YUV422,YUV444等。比較常用的就是YUV420。下面是說下YUV420的存儲格式:
1、交叉的(調系統攝像頭采集到的是交叉的)
Y(wh)+交叉的U(wh/4)、V(w*h/4)數據
2、非交叉的(ffmpeg的AVFrame中的是非交叉的)
同上,只是UV不是交叉的

二、在ffmpeg中的YUV420的格式
AVFrame
AVFrame->data[0]:Y
AVFrame->data[1]:U
AVFrame->data[2]:V

分別對應一個linesize,這個linesize不是每一個data的大小,而是對應data中沒一行的大小,這個值可能比圖片的width要大。但我們取的時候,是通過height來遍歷,每一行取width的大小

三、談談H264與H265的區別
H265編碼效率更高。同樣質量的一張圖片,編碼后,H265的大小基本為H264的一半。所以H265的出現,為2K實時傳輸奠定了基礎。
H265編碼效率高,那么編碼和解碼時候都會比較耗CPU和內存。H264基本全部手機都兼容,H265不兼容一些配置較差的手機,對應iphone,也要IOS11才可使用系統對應的H265的api。

四、簡單談談OpenCL es
簡單說就是直接操作GPU進行圖片的渲染。OpenGL有自己的渲染管線,提供給外部修改的有頂點處理和片元處理。
頂點處理:我們可以為OpenGL提供頂點,相當于構建了圖片的外部框架
片元處理:提供圖片紋理填充剛才構建的外部框架的內容
然后OpenGL就幫我們寫入到幀緩沖區。

所以我們在代碼中主要做了:
1、創建一個渲染緩沖區,主要是關聯幀緩沖區,最終展示OpenGL渲染的效果
2、提供頂點數據
3、提供圖片紋理,這里可以通過紋理坐標操作圖片的方向
4、進行OpenGL渲染glDrawArrays

五、簡單講下ffmpeg解碼流程
1、創建解碼器,AVCodec
2、構建解碼上下文AVCodecContext
3、封裝AVPacket
4、avcodec_send_packet與avcodec_receive_frame

流程不是特別難。主要得注意幾點:
解碼的視頻幀編碼格式,比如H264。就有Annex-B與AVCC
Annex-B通過00000001分割nal,所以解碼器可以拆出來sps,pps,和幀內容
AVCC是通過長度進行分割,因為我們不知道它存儲長度的字節等信息。所以還得要一個extraData,這里包含了解碼的一些信息

六、ffmpeg的編碼流程
過程與解碼的差不多。就是在構建編碼上下文AVCodecContext需要傳更多的參數
//得到編碼器
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
//得到編碼上下文
c = avcodec_alloc_context3(codec);
//設置碼流
c->bit_rate = 900000;
//設置分辨率
c->width = frame->width;
c->height = frame->height;
//設置timebase
c->time_base = (AVRational){1, 15};
//設置編碼前的格式
c->pix_fmt = frame->format;
//打開編碼器
ret = avcodec_open2(c, codec, NULL);

其中同時配置了bit_rate與time_base,你才可以準確控制編碼后的大小

七、硬解與軟件的區別
假如視頻流格式為H264
硬解需要自己去配置sps,pps信息
ffmpeg軟解不需要

硬解占用的cpu和內存比軟解低
硬解如果發現一個gop里面一幀有問題,可能gop剩下的幀都不會去解析,等待下一個gop到來。軟解發現gop里面其中一幀有問題,還是會去嘗試解析gop剩下的幀,有可能會導致花屏

八、說說做視頻實時播放遇到什么難點

我覺得做視頻播放,開發功能可能不是特別難。
難點在于解決Bug與優化
bug,比如說花屏,藍屏,音視頻不同步,串流
就拿花屏來說,怎么解決呢?
1、p2p過來的包,一個比較大的視頻幀可能會分幾包過來。這時候就需要拼包成完整的一幀
2、等主幀過來了再開始解碼,進行了丟幀操作,需要等下一個主幀過來。
3、用硬解,可以減少花屏
4、通過唯一標志位,避免串流
如果上面都做了,還是花屏,這時候就得分析下源視頻流是否就有問題
可以把視頻流采集下來。然后通過ffmpeg指令轉為mp4格式,如果你實時播放的時間點的花屏與ffmpeg轉的mp4對應的點都是花屏的,那很有可能流本來就有問題。

優化部分,比如說要減少卡頓,減少延遲
1、方法,需要大量實驗,才能得出如何動態變碼流,如何動態變幀率才是最優的。
2、如何去衡量結果
你統計的方法有說服力,那么你上報的相關視頻播放數據才能讓老板信服。

音頻相關的問與答:

一、簡單談談AudioUnit的原理
與其他音頻播放控件不同的是,audioUnit中的每一個unit可以代表獨立的一個功能,比如輸入輸出功能,轉換音頻功能,混合音頻功能等。然后把它們connect起來,所以自由度很高。

剛才說的輸入輸出audioUnit。又可以分出兩個模塊,輸入(element1)與輸出(element0)。每一個element又包含inScope outScope

二、aac音頻解碼你用過多少種方法
1、直接用ffmpeg封裝
2、直接調用aac SDK api進行操作
3、用系統api AudioConverterRef

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容