音視頻開發之旅 (一) --- 基礎音視頻知識和ffmpeg編譯

1.常用概念

音視頻相關名詞、術語、概念

1.1幀率

用於測量顯示幀數的量度,測量單位爲每秒顯示幀數(fps)或 赫茲(Hz)。每秒顯示幀數(fps)或者圖形處理場時每秒能夠更新的次數。
一般來說30fps是可以接接受的,如果能將性能提升至60fps則可以明顯提升交互感和逼真感,但是超過75fps就不容易察覺有明顯的的流暢度提升。如果幀數超過屏幕刷新率,則會浪費圖像處理能力,因爲監視器不能以這麼快的速度更新,這樣超過的部分就浪費了。

1.2分辨率

視頻成像產品所形成的圖像大小或尺寸

1.3刷新率

刷新率是指屏幕每秒畫面被刷新的次數,刷新率分爲垂直刷新率和水平刷新率,一般提到的刷新率通常指垂直刷新率。垂直刷新率表示屏幕的圖象每秒鐘重繪多少次,也就是每秒鐘屏幕刷新的次數,以Hz(赫茲)爲單位。刷新率越高越好,圖象就越穩定,圖像顯示就越自然清晰,對眼睛的影響也越小。刷新頻率越低,圖像閃爍和抖動的就越厲害,眼睛疲勞得就越快。一般來說,如能達到80Hz以上的刷新頻率就可完全消除圖像閃爍和抖動感,眼睛也不會太容易疲勞。

1.4編碼格式

編碼的目的是壓縮數據量,採用編碼算法壓縮冗餘數據。常用的編碼格式有如下這兩種。

  • MPEG(MPEG-2,MPEG-4)
  • H.26X(H.263,H.264/AVC,H.265/HEVC)

1.5封裝格式

把編碼後的音視頻數據以一定格式封裝到一個容器,封裝格式有MKV、AVI、TS等

1.6 碼率

碼率也就是比特率,比特率是單位時間播放連續的媒體的比特數量。比特率越高,帶寬消耗的越多。

1.7 畫質與碼率

視頻質量和碼率、編碼算法都有關係

1.8DTS與PTS

  • DTS:decode Time Stamp,主要用於標示讀入內存中的比特流在什麼時候開始送入解碼器中進行解碼
  • PTS:decode Time Stamp,主要用於度量解碼後的視頻幀什麼時候被顯示出來

1.9 YUV與RGB

  • YUV
    YUV是編譯true-color顏色空間(color space)的種類,Y’UV, YUV, YCbCr,YPbPr等專有名詞都可以稱爲YUV,彼此有重疊。“Y”表示明亮度(Luminance、Luma),“U”和“V”則是色度、濃度(Chrominance、Chroma)

  • RGB
    也是一種顏色空間模型,三原色光模式(RGB color model),又稱RGB顏色模型或紅綠藍顏色模型,是一種加色模型,將紅(Red)、綠(Green)、藍(Blue)三原色的色光以不同的比例相加,以合成產生各種色彩光。

1.10視頻幀及音頻幀

常見的視頻幀有 I、P、B幀等

  • I幀表示關鍵幀,可以理解爲這一幀畫面的完成保留,解碼時只需要本幀數據就可以完成,這裏其實可以把I幀的壓縮等同於單獨壓縮一幅圖片
  • P幀又稱前向預測編碼幀,也有幀間預測編碼幀,P幀需要依賴前面的I幀或者P幀才能進行編解碼,因爲一般來說,P幀存儲的是當前幀畫面與前一幀(前一幀可能是I幀也可能是P幀)的差別,較專業的說法是壓縮了時間冗餘信息,或者說提取了運動特性。(也就是差別幀,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據)
  • B幀時雙向差別幀,B幀非常特殊,它存儲的是本幀與前後幀的差別,因此帶有B幀的視頻在解碼時的邏輯會更復雜些,CPU開銷會更大。(要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面數據與本幀數據的疊加取得最終的畫面)

音視頻概念沒有視頻幀那麼清晰,幾乎所有視頻編碼格式都可以簡單地認爲I幀就是編碼後的一幅圖像。但音頻幀跟編碼格式相關,它是各個編碼標準自己實現的。

  • 對PCM(未經編碼的音頻數據)來說,它根本就不需要幀的概念,根據採樣率和採樣精度就可以播放,比如比如採樣率爲44.1HZ,採樣精度爲16位的音頻,你可以算出bitrate(比特率)是44100* 16kbps,每秒的音頻數據是固定的44100*16/8 字節。
  • AMR幀比較簡單,它規定每20ms的音頻是 1 幀,每一幀音頻都是獨立的,有肯能採用不同的編碼算法
  • MP3幀較複雜些,包含了更多的信息,比如採樣率、比特率等各種參數。具體如下:音頻數據幀個數由文件大小和幀長決定,每一幀的長度可能不固定,也肯能固定,由比特率決定,每一幀又分爲幀頭和數據實體兩部分,幀頭記錄了MP3的比特率、採樣率、版本等信息,每一幀之間相互獨立。

1.11量化精度

量化精度表示可以將模擬信號分成多少個等級,量化精度越高,音樂的聲壓振幅越接近原音樂。採樣頻率,它是針對每秒鐘所採樣的數量,而量化精度則是對於聲波的振幅進行切割,形成類似階梯的度量單位。所以,如果說採樣頻率是對聲波水平進行的X軸切割,那麼量化精度則是對Y軸的切割,切割的數量是以最大振幅切成2的n次方計算,n就是bit數。如果是8bit,那麼在振幅方面的採樣就有256階,若是16bit,則振幅的計量單位便會成爲65536階,越多的階數就越能精確描述每個採樣的振幅高度。如此,也就越接近原始聲波的“能量”,在還原的過程序也就越接近原始的聲音了。

1.12採樣率

採樣率指每秒音頻採樣點個數(8000/44100Hz),採樣率單位用Hz表示。像是CD音樂的標準採樣頻率爲44.1KHz(指的就是在1s中對聲音採樣44100次,也就是對聲音1秒的聲音記錄44100個點,用44100個點來表示1秒鐘的聲音),這也是目前聲卡與計算機作業間最常用的採樣頻率。

2.在Mac下編譯 FFmpeg

2.1 下載FFmepg源碼

ffmepg官網直通車

2.2 獲取動態庫.so

在根目錄新建 build_android.sh

#!/bin/bash
NDK=/Users/xxx/Library/Android/sdk/ndk/21.1.6352462
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
#ADDI_CFLAGS="-marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

提示:一般腳本書寫不規範容易導致報錯
腳本中的NDK=/Users/xxx/Library/Android/sdk/ndk/21.1.6352462 NDK路徑需要修改。

執行 ./build_android.sh 出現以下信息

在這裏插入圖片描述

最後在當前文件夾下生成android 文件,裏面有我們需要的.so

參考 《Android音視頻開發》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章