將學習到的內容和自己的理解整理如下。
初次接觸音視頻領域時的小伙伴,可能大多數都像我一樣并不太了解整體的流程。音視頻領域細分的話,還可以分出很多分支sdi編碼器轉網絡視頻流,例如:嵌入式設備中的運用(例如設備有攝像頭和麥克風,需要進行錄制視頻和音頻)、客戶端程序的研發中的運用(例如:QQ的1V1通話和視頻,QQ群的nVn通話和視頻,還有共享屏幕等,還有某音,某手,某寶中的直播功能),還有軟件的截圖、屏幕的錄制,麥克風的錄制等等,都滲透著音視頻領域相關的技術。
在嵌入式設備中的音視頻的應用無非就是錄像,直播等。如果是錄像的話,視頻的來源可能來自于攝像頭,或者輸入的信號源,或者屏幕。音頻源可能來自麥克風等設備。
我現在的公司正在做的項目大概是這樣子的:
設備支持的音頻:內置和外置麥克風,也支持SDI和HDMI中內嵌的音頻,還支持靜音。
設備支持的視頻源:有HDMI接口、SDI接口、VGA、CVBS等接口,這些接口可以連接攝像頭、或者一些其他視頻源(像小米盒子,像電腦主機的HDMI輸出接口等)。
功能就是可以對這些視頻源和音頻源進行錄制,而且還支持畫中畫等功能。
1、錄制視頻
無論你是需要錄制音頻還是視頻,都需要源(音頻源和視頻源),我們的視頻源就是攝像頭。
step0:準備攝像頭;
包括
step1:從攝像頭采集視頻數據;(圖像幀)
這個地方設計的知識點和技術還是挺多的,例如:采集的原始數據格式是什么類型的,是YUV還是RGB,YUV和RGB細分的話還包括YUV 4:4:4、YUV 4:2:2、YUV 4:2:0等,RGB細分的話還包括RGB565、RGB555、RGB24、RGB32、ARGB32等格式。
1幀可以看作為1張圖;
那么1秒可以采集多少幀(即1秒采集多少張圖),就會設計到幀率
step2:圖像處理階段;
我們采集完數據之后,就可以對采集到的數據進行處理了。
例如:曝光、色度、溫和度、色差等等。都可以在這個階段做。
step3:暫存到圖像幀隊列;
處理后的圖像幀,會暫存放到圖像幀隊列中,等待視頻編碼器來對數據進行編碼;
為什么要先存放到圖像隊列中呢?
因為我們設備(指:計算機、開發版等)并沒有這么強的處理能力,如果一擁而上的話,也就涼涼了,所以先存放著,視頻編碼階段邊處理邊拿數據。
小編整理了一些學習資料、教學視頻和學習路線圖共享在群文件,資料包括《Andoird音視頻開發必備手冊+音視頻最新學習視頻+大廠面試真題+2022最新學習路線圖+項目實戰源碼》等等(C/C++,Linux,FFmpeg ,webRTC, rtmp, hls, rtsp, ffplay, srs),免費分享,有需要的可以搜索加群自取~希望對大家有幫助!
step4:視頻編碼階段;
如果圖像幀隊列中有數據的話,視頻編碼器就會進行處理。
如果不做編碼的話,視頻的體積是非常大的,而此階段的技術也是非常多的,還可以稱之為壓縮。
例如常見的:H.264,H.265等壓縮技術,也常叫視頻編碼算法。
我做過一個測試,將一段3 分鐘 46 秒的1920*1080的視頻的每一幀都轉換成圖片。
可以看到視頻使用的是H.264編碼的,如果將這個視頻的每一幀轉換成圖片的話,會轉換成6788張圖片。
也可以簡單計算一下:
1、一共3分46秒;
2、每秒30幀;
3分46秒等于226秒;
226秒*30幀=6780幀。
如果按照每張圖1M的話,就將近7個G,而且也不可能每個圖都是1M,圖片的大小比較還是根據色彩的鮮艷程度來決定的。
可以看到,我這個就12GB;
可想而之,一個4分鐘的視頻就12個G。
如果不壓縮的話你存幾個片到你電腦里,你能存幾個?
所以此階段主要就是對視頻幀進行壓縮。
然后把壓縮的數據放入到視頻包隊列中。
step5:將壓縮完的數據,暫存到視頻包隊列;
step6:復用器進行音視頻封裝(例如:封裝成mp4等);
step7:寫入到文件。
2、錄制音頻
整個步驟和采集視頻的步驟差不多。
從麥克風中或者其他設備中采集到的音頻數據我們常稱之為PCM數據。
3、音視頻同步
音視頻同步是比較困難的。
我們可以在采集數據的時候,給每一幀都加上時間戳。等復用器在封裝音視頻的時候sdi編碼器轉網絡視頻流,就可以按時間來處理了,這樣就可以對音視頻數據保證同步了。