在安逸的知識領(lǐng)域待久了,人就變得迷茫的。接觸了音視頻開發(fā)汰翠,打算一步步學(xué)起。Android預(yù)備的知識有音視頻的基礎(chǔ)知識璃俗、openGl的知識和最主要的Ffmeng知識奴璃。
音視頻的基礎(chǔ)
AndioRecord是Android系統(tǒng)提供的用于實現(xiàn)錄音的功能類
AudioTrack可以完成Android平臺上音頻數(shù)據(jù)的輸出任務(wù)
- MODE_STREAM:在這種模式下,通過write一次次把音頻數(shù)據(jù)寫到AudioTrack中城豁。
- MODE_STATIC:這種模式下苟穆,在play之前只需要把所有數(shù)據(jù)通過一次write調(diào)用傳遞到AudioTrack中的內(nèi)部緩沖區(qū),后續(xù)就不必再傳遞數(shù)據(jù)了唱星。
Camera采集視頻數(shù)據(jù)并保存到文件雳旅,分別使用 SurfaceView、TextureView 來預(yù)覽 Camera 數(shù)據(jù)
MediaExtractor的作用是把音頻和視頻的數(shù)據(jù)進(jìn)行分離间聊。
MediaMuxer的作用是生成音頻或視頻文件攒盈;還可以把音頻與視頻混合成一個音視頻文件
MediaCodec類可以用于使用一些基本的多媒體編解碼器
- 編解碼器能處理的數(shù)據(jù)類型為:壓縮數(shù)據(jù)、原始音頻數(shù)據(jù)和原始視頻數(shù)據(jù)哎榴。你可以通過ByteBuffers能夠處理這三種數(shù)據(jù)型豁,但是需要你提供一個Surface,用于對原始的視頻數(shù)據(jù)進(jìn)行展示尚蝌,這樣也能提高編解碼的性能迎变。Surface使用的是本地的視頻緩沖區(qū),這個緩沖區(qū)不映射或拷貝到ByteBuffers飘言。這樣的機制讓編解碼器的效率更高衣形。通常在使用Surface的時候,無法訪問原始的視頻數(shù)據(jù)姿鸿,但是你可以使用ImageReader訪問解碼后的原始視頻幀谆吴。在使用ByteBuffer的模式下,您可以使用Image類和getInput/OutputImage(int)訪問原始視頻幀
PCM采集:
音頻:模擬信號->采樣->量化->編碼->數(shù)字信號
視頻編碼中H264是目前最主流的視頻編碼標(biāo)準(zhǔn)
在H264中苛预,三種類型的幀數(shù)據(jù)分別為
I幀:幀內(nèi)編碼幀句狼。就是一個完整幀。
P幀:前向預(yù)測編碼幀热某。是一個非完整幀鲜锚,通過參考前面的I幀或P幀生成突诬。
B幀:雙向預(yù)測內(nèi)插編碼幀。參考前后圖像幀編碼生成芜繁。B幀依賴其前最近的一個I幀或P幀及其后最近的一個P幀
音頻編碼以AAC編碼為主
AAC格式主要分為兩種:ADIF旺隙、ADTS。
ADIF:Audio Data Interchange Format骏令。 音頻數(shù)據(jù)交換格式蔬捷。這種格式的特征是可以確定的找到這個音頻數(shù)據(jù)的開始,不需進(jìn)行在音頻數(shù)據(jù)流中間開始的解碼榔袋,即它的解碼必須在明確定義的開始處進(jìn)行周拐。這種格式常用在磁盤文件中。
ADTS:Audio Data Transport Stream凰兑。 音頻數(shù)據(jù)傳輸流妥粟。這種格式的特征是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始吏够。它的特征類似于mp3數(shù)據(jù)流格式勾给。
做個簡單的音視頻播放器
未完待續(xù)~