音頻處理基礎

一、基礎概念

  • 採樣頻率(Sampling Rate),單位時間內採集的樣本數,是採樣週期的倒數,指兩個採樣之間的時間間隔。

採樣頻率必須至少是信號中最大頻率分量頻率的兩倍,否則就不能從信號採樣中恢復原始信號,這其實就是著名的香農採樣定理。
CD音質(一般的音頻)採樣率爲 44.1 kHz,人耳只能聽到20Hz到20khz範圍的聲音。

  • 量化深度,表示一個樣本的二進制的位數,即樣本的比特數。

  • 聲道數,記錄聲音時,如果每次生成一個聲波數據,稱爲單聲道;每次生成兩個聲波數據,稱爲雙聲道(立體聲)。

  • 文件大小(B)=採樣頻率(Hz)×錄音時間(S)×(量化深度/8)× 聲道數

如:錄製1分鐘採樣頻率爲44.1KHz,量化深度爲16位,立體聲的聲音(CD音質),文件大小爲:
44.1×1000×60×(16/8)×2=10584000B≈10.09M

  • 單位

    • dBSPL,通常所說的dB,使用聲壓作爲被測量,選擇20μPa作爲基準值。
    • dBm,使用功率作爲被測量,選擇1mW作爲基準值。
    • dBu,使用電壓作爲被測量,選擇0.775V作爲基準值。
    • dBV,和dBu一樣,使用電壓作爲被測量,選擇1V作爲基準值。
    • dBFS,和上面的量都不相同,上面的量都是測量模擬值的,dBFS是測量數字音頻的,其選擇的基準值爲sample的最大值爲0dBFS,其他的值都爲負值。
  • PCM(Pulse Code Modulation)編碼,即通過脈衝編碼調製方法生成數字音頻數據的技術或格式,是一種無損編碼格式,是音頻模擬信號數字化的一種方法,需要經過採樣、量化和編碼過程,以實現音頻模擬信號數字化。

  • 參考

http://blog.jianchihu.net/pcm-volume-control.html

二、FFmpeg

  • 參考

https://trac.ffmpeg.org/wiki/Concatenate
https://blog.csdn.net/leixiaohua1020/article/details/15811977

2.1、基礎說明

  • ffmpeg 輸入文件由 -i 參數指定,可以指定多個。

2.2、Filters

官網: http://www.ffmpeg.org/ffmpeg-filters.html
命令參數爲: -filter_complex

  • Filter中需要使用到輸入文件時則需要用到 [] 來指定流操作。
  1. 輸入文件中的某個流
[{輸入文件編號}:{音頻流a或視頻流v}:{多個流中的第幾個流}]
如: [0:a:0]
  1. 流名稱,一般爲組合命令過程中的輸出流。
[{流名稱}]
如: [czb]
  • 操作格式

一個 Filter 操作包含3個部分:

  1. 輸入流
  2. 指令
  3. 輸出流

指令中的參數以冒號 ( : ) 隔開。

如: “[in] amix=inputs=2:duration=first [out]”

多個 Filter 可以組合使用。以分號 ( ; ) 隔開。

音頻混合: amix

inputs: 一共有多少個輸入,默認爲2
duration: 輸出的時長定義枚舉
    longest 等於最長的輸入的長度 (默認值)
    shortest 等於最短的輸入的長度
    first 等於第一個輸入的長度
dropout_transition: 結束時淡出的持續時間(秒) 默認爲 2 秒

音頻循環: aloop

loop: 循環次數, -1 表示無限循環, 默認 爲 0
size: 樣本的最大的大小, 默認爲 0
start: 循環的第一個樣本, 默認爲0

一般來說循環時 size 要足夠大, 否則沒有辦法循環, 一般直接設爲 2e+9

拼接: concat

n: 輸入的個數
v: 輸出視頻流的數量
a: 輸入音頻流的數量

音量調節

[in] volume=X [out]

X值爲調節的倍數
如原始音量爲1, 增大一倍爲2, 縮小一倍爲0.5

2.3 其他

  • 獲取音頻文件信息
ffprobe -v quiet -print_format json -show_format -show_streams {file_name}
  • 獲取ffmpeg支持的音視頻格式
ffmpeg -formats
  • 按照長度分割音頻
ffmpeg -i {輸入音頻} -f segment -segment_time {每一段的長度} -ac 1 -ar 16000 {輸出音頻 如:audio%02d.wav}
  • 音頻拼接
ffmpeg -i {輸入文件0} ... -i {輸入文件n} -filter_complex "[{輸入文件編號}:{音頻流a或視頻流v}:{第幾個流}] ...  concat=n={一共多少個輸入}:v={每個輸入有多少個視頻流輸出}:a={每個輸入有多少個音頻流輸出} {輸出流的名稱}" -map "{輸出流的名稱}" {輸出文件}
如: ffmpeg -i part1.m4a -i part2.m4a -i part3.m4a -filter_complex "[0:a:0] [1:a:0] [2:a:0] concat=n=3:v=0:a=1 [czb]" -map "[czb]" output.m4a

三、pydub

3.1、安裝

https://github.com/jiaaro/pydub
pip install pydub

3.2、基礎使用

  • 主要使用的是SegmentAudio
from pydub import AudioSegment
  • 引入文件
ogg_version = AudioSegment.from_ogg("never_gonna_give_you_up.ogg")
flv_version = AudioSegment.from_flv("never_gonna_give_you_up.flv")
mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4")
wma_version = AudioSegment.from_file("never_gonna_give_you_up.wma", "wma")
aac_version = AudioSegment.from_file("never_gonna_give_you_up.aiff", "aac")
  • 音量調節可以直接使用+/-來操作增減db

  • 導出音頻

{AudioSegment Object}.export("{filename}.mp3", format="mp3", bitrate="{bitrate}")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章