簡述
通常,音量調(diào)整可以在音頻流水線的兩個主要階段進行:數(shù)字域和模擬域。當我們在系統(tǒng)設(shè)置中調(diào)整音量時,通常是在模擬域(即音頻設(shè)備)進行調(diào)整。在這種情況下,所有的音頻輸出(包括來自不同應用的音頻)都會受到影響。
如果你只想改變特定音頻的音量,你可以在數(shù)字域進行調(diào)整。這通常在音頻數(shù)據(jù)還在內(nèi)存中,未被發(fā)送到音頻設(shè)備之前。
在這個階段,可以通過調(diào)整音頻數(shù)據(jù)的振幅來改變音量。這種方式只會影響被修改的音頻流,不會影響其他音頻或者系統(tǒng)的音量設(shè)置。這個過程通常在音頻處理軟件或者音頻播放器軟件中進行。
總的來說,你可以通過修改音頻數(shù)據(jù)來只改變特定音頻的音量,而不會影響系統(tǒng)或者其他應用的音量。
音量調(diào)節(jié)是否需要重采樣?
不一定。音量調(diào)節(jié)和重采樣是兩個獨立的過程。
音量調(diào)節(jié)是一個簡單的數(shù)學操作,通過改變音頻數(shù)據(jù)的振幅來實現(xiàn)。這個過程不需要改變音頻的采樣率。換句話說,音量的改變并不涉及到音頻信號的重采樣。
然而,重采樣是將音頻信號從一個采樣率轉(zhuǎn)換到另一個采樣率的過程。這通常在需要匹配設(shè)備或者音頻格式的采樣率,或者進行某種頻率分析時才需要。例如,如果你的音頻設(shè)備只能支持44.1kHz的采樣率,但是你的音頻文件是48kHz的采樣率,那么你可能需要重采樣音頻文件以便在你的設(shè)備上播放。這個過程與音量的改變沒有直接關(guān)系。
總的來說,調(diào)整音頻輸出的音量不需要重采樣。然而,在某些情況下,你可能同時需要調(diào)整音量和進行重采樣,這兩個過程可以分開來進行。
數(shù)字域
"數(shù)字域"這個詞是指在數(shù)字信號處理中,信號或數(shù)據(jù)在數(shù)字形式下被處理的環(huán)境或階段。這通常是在信號或數(shù)據(jù)被轉(zhuǎn)換為模擬形式并送入硬件設(shè)備(如揚聲器或耳機)之前的階段。
在音頻處理中,數(shù)字域中的操作包括但不限于:
-
數(shù)字濾波:使用數(shù)字濾波器來改變信號的頻率響應,例如去噪或者增強特定頻率的音頻信號。
-
重采樣:改變音頻信號的采樣率,以匹配特定的設(shè)備或應用的需求。
-
音量調(diào)節(jié):通過改變音頻數(shù)據(jù)的振幅來改變音量。這不會改變音頻的采樣率。
-
壓縮和編碼:把音頻數(shù)據(jù)壓縮成更小的文件,或者編碼成特定的格式,以便于存儲或傳輸。
這些操作都是在音頻設(shè)備播放信號之前在內(nèi)存中完成的。因此,它們可以獨立地對每個音頻流進行,而不會影響其他音頻流或設(shè)備的全局設(shè)置。這就是為什么你可以在數(shù)字域內(nèi)改變一個音頻的音量,而不會影響系統(tǒng)的音量設(shè)置或其他音頻的音量。
調(diào)節(jié)音頻數(shù)據(jù)
只要你知道音頻數(shù)據(jù)的格式和采樣類型,你可以直接在解碼后的音頻數(shù)據(jù)上進行數(shù)學運算來調(diào)整音量,然后將這些數(shù)據(jù)傳給音頻輸出設(shè)備。
這里需要注意的是,你的運算需要考慮音頻數(shù)據(jù)的采樣類型。例如,如果你的音頻數(shù)據(jù)是16位有符號整數(shù)(int16_t
),你可以簡單地對每個樣本值進行乘法或除法運算來改變音量。但如果你的音頻數(shù)據(jù)是浮點數(shù)(float
或double
),你需要進行相應的浮點數(shù)運算。
另外,你也需要考慮到多通道音頻的情況。如果你的音頻數(shù)據(jù)有多個通道(如立體聲或5.1環(huán)繞聲),你需要對每個通道的樣本值進行同樣的運算。
總的來說,只要你能正確地處理音頻數(shù)據(jù),你可以直接在解碼后的音頻數(shù)據(jù)上進行運算來調(diào)整音量,無需依賴FFmpeg庫的其他功能。但是,請注意,這種方法需要你對音頻數(shù)據(jù)的格式和處理有足夠的理解。
下面提供一個基本的C++示例,當然前提時獲取到解碼后的音頻數(shù)據(jù)
假設(shè)你的音頻數(shù)據(jù)格式為32位浮點數(shù),你可以寫一個如下的C++函數(shù)來調(diào)整音頻音量:
#include <vector>
// 音頻樣本數(shù)據(jù)類型假設(shè)為浮點數(shù)
typedef float SampleType;
// 調(diào)整音頻音量的函數(shù)
// audioData: 音頻數(shù)據(jù),左右通道交錯存儲,例如: L1 R1 L2 R2 ...
// volumePercent: 音量的百分比,1.0 表示 100%
void adjustVolume(std::vector<SampleType>& audioData, float volumePercent) {
// 遍歷所有的音頻樣本
for (size_t i = 0; i < audioData.size(); ++i) {
// 將每個樣本值乘以音量的百分比
audioData[i] *= volumePercent;
}
}
這個函數(shù)接收一個存儲音頻數(shù)據(jù)的向量(假設(shè)左右通道樣本交錯存儲)和音量的百分比(1.0表示100%),然后通過乘以音量的百分比來調(diào)整每個音頻樣本的值。
注意,如果音量的百分比大于1.0,那么音量將被提高;如果音量的百分比小于1.0,那么音量將被降低。如果音量的百分比是0.0,那么音頻將被靜音。
這個函數(shù)假設(shè)音頻數(shù)據(jù)的格式為32位浮點數(shù),所以我們可以直接使用浮點數(shù)乘法來調(diào)整音量。如果你的音頻數(shù)據(jù)的格式不同,你可能需要修改這個函數(shù)以適應你的數(shù)據(jù)格式。
ffmpeg 中調(diào)節(jié)解碼后的音頻數(shù)據(jù)音量
直接操作音頻數(shù)據(jù)
在FFmpeg庫中,你可以對解碼后的音頻樣本進行處理以調(diào)整音量。
以下是一個基本的示例:
// 假設(shè) frame 是你解碼后的音頻幀
AVFrame *frame;
// 解碼器輸出的數(shù)據(jù)類型為 int16,每個樣本的最大值為 32767
// 想要將音量減半,你可以遍歷所有的樣本并將它們除以2
for (int i = 0; i < frame->nb_samples; ++i) {
for (int ch = 0; ch < frame->channels; ++ch) {
((int16_t*)frame->data[ch])[i] /= 2;
}
}
在這個示例中,我們假設(shè)解碼器輸出的數(shù)據(jù)類型為int16_t
,每個樣本的最大值為 32767(這是16位有符號整數(shù)的最大值)。為了將音量減半,我們遍歷了每個音頻樣本,并將其值除以2。
請注意,你需要根據(jù)你的音頻數(shù)據(jù)的具體格式和采樣類型來修改這段代碼。在實際應用中,你可能還需要考慮更復雜的情況,例如溢出處理、不同的采樣類型、多通道音頻等。
此外,雖然這個示例將所有的樣本都除以2來減半音量,但你也可以使用其他的數(shù)學操作來改變音量。例如,你可以乘以一個因子來調(diào)整音量,或者使用更復雜的算法來實現(xiàn)更復雜的音頻效果。
音頻濾鏡
實際上,你也可以使用FFmpeg的音頻濾鏡來調(diào)整音量。FFmpeg有一個名為"volume"的音頻濾鏡,它可以在音頻濾鏡鏈中調(diào)整音量。下面是一個示例:
AVFilterContext* vol_ctx;
AVFilterGraph* graph;
AVFilterInOut* inputs;
AVFilterInOut* outputs;
// 初始化濾鏡圖
graph = avfilter_graph_alloc();
// 創(chuàng)建 "volume" 濾鏡并設(shè)置為減半音量
AVFilter* vol = avfilter_get_by_name("volume");
avfilter_graph_create_filter(&vol_ctx, vol, "volume", "0.5", NULL, graph);
// 將解碼器的輸出鏈接到 "volume" 濾鏡
inputs = avfilter_inout_alloc();
inputs->filter_ctx = dec_ctx; // 解碼器的濾鏡上下文
inputs->pad_idx = 0;
inputs->next = NULL;
// 將 "volume" 濾鏡的輸出鏈接到編碼器
outputs = avfilter_inout_alloc();
outputs->filter_ctx = vol_ctx; // "volume" 濾鏡的上下文
outputs->pad_idx = 0;
outputs->next = NULL;
// 將輸入和輸出鏈接到濾鏡圖
avfilter_graph_parse_ptr(graph, "volume", &inputs, &outputs, NULL);
在這個示例中,我們創(chuàng)建了一個音頻濾鏡圖,并在其中添加了一個"volume"濾鏡,用于將音量減半。然后我們將解碼器的輸出鏈接到"volume"濾鏡,最后將"volume"濾鏡的輸出鏈接到編碼器。
通過這種方式,你可以使用FFmpeg的音頻濾鏡來調(diào)整音量。這可能更加方便和強大,因為FFmpeg的音頻濾鏡提供了許多預定義的音頻處理功能,并且可以方便地在濾鏡鏈中組合使用。
模擬域
在音頻處理中,模擬域通常指的是聲音信號已經(jīng)被轉(zhuǎn)換為模擬信號,用于驅(qū)動揚聲器或耳機等物理設(shè)備的階段。
我們知道,計算機內(nèi)部處理的是數(shù)字信號,也就是以0和1為基礎(chǔ)的二進制數(shù)據(jù)。然而,我們的耳朵聽到的是連續(xù)的、模擬的聲音信號。因此,在音頻從計算機輸出到我們的耳朵之間,必須有一個將數(shù)字信號轉(zhuǎn)換為模擬信號的過程。這個過程由一個叫做DAC(數(shù)字-模擬轉(zhuǎn)換器)的設(shè)備完成。
在DAC之后的階段,我們通常將其稱為模擬域。在這個階段,信號是連續(xù)的電壓或電流,而不再是二進制數(shù)字。這個信號可以被音頻設(shè)備(如揚聲器或耳機)接收并轉(zhuǎn)換為聲音。
當我們在操作系統(tǒng)設(shè)置中調(diào)整音量時,我們通常是在改變模擬域中的信號振幅。這種方式的好處是可以很直接地改變所有音頻輸出的音量。然而,它也有一個缺點,那就是它會影響所有的音頻輸出,而不僅僅是一個特定的音頻流。
與此相反,如果我們在數(shù)字域(即音頻還在計算機內(nèi)存中,還沒有被DAC轉(zhuǎn)換為模擬信號)中改變音量,我們可以更精細地控制哪個音頻流的音量被改變。
在模擬域,音頻信號已經(jīng)變成了模擬電信號,無法再用軟件直接操作。在這個階段,可以通過調(diào)整設(shè)備(如音頻接口或揚聲器)的音量控制來改變音量。
而FFmpeg是一個用于處理數(shù)字音頻和視頻的軟件庫。它在音頻還在數(shù)字域,也就是在音頻信號還沒有被轉(zhuǎn)換為模擬信號之前進行操作。你可以用FFmpeg來改變音頻數(shù)據(jù)的音量,進行重采樣,編解碼,等等。
所以,模擬域和FFmpeg庫涉及到的是兩個不同的階段。FFmpeg主要處理數(shù)字域中的音頻和視頻數(shù)據(jù),而在模擬域中,主要是通過操作硬件設(shè)備來改變音量。
SDL庫中調(diào)節(jié)音頻設(shè)備音量
首先,我會告訴你如何使用SDL庫來改變音頻流的音量。在SDL中,你可以使用SDL_MixAudioFormat
函數(shù)來調(diào)整音頻的音量。這個函數(shù)的第四個參數(shù)就是音量。音量的范圍是從0(靜音)到SDL_MIX_MAXVOLUME(最大音量)。如果你想用百分比來表示音量,那么你可以先將百分比轉(zhuǎn)換成SDL_MIX_MAXVOLUME的比例。
以下是一個簡單的函數(shù),它接受一個音頻緩沖區(qū)(buffer)和一個音量百分比,然后將緩沖區(qū)的音量調(diào)整為指定的百分比:
#include <SDL2/SDL.h>
void adjustVolume(Uint8 *buffer, int length, int volumePercent) {
// Ensure volumePercent is between 0 and 100
if(volumePercent < 0) volumePercent = 0;
if(volumePercent > 100) volumePercent = 100;
// Convert volumePercent to SDL volume range
int volume = (volumePercent * SDL_MIX_MAXVOLUME) / 100;
// Adjust the volume
SDL_MixAudioFormat(buffer, buffer, AUDIO_S16LSB, length, volume);
}
在這個函數(shù)中,buffer
是需要調(diào)整音量的音頻數(shù)據(jù),length
是數(shù)據(jù)的長度,volumePercent
是音量的百分比。我們首先確保volumePercent
在0到100之間,然后將它轉(zhuǎn)換成SDL的音量范圍。然后,我們使用SDL_MixAudioFormat
函數(shù)來調(diào)整音頻數(shù)據(jù)的音量。
注意這個函數(shù)假設(shè)音頻數(shù)據(jù)是16位有符號整數(shù),以小端格式存儲(AUDIO_S16LSB
)。如果你的音頻數(shù)據(jù)有不同的格式,你需要相應地修改這個函數(shù)。
最后要注意的是,這個函數(shù)僅改變提供的音頻數(shù)據(jù)的音量,而不會影響SDL音頻設(shè)備的總體音量設(shè)置。如果你需要改變音頻設(shè)備的音量,你需要通過操作系統(tǒng)或者硬件設(shè)備來實現(xiàn)。
Qt框架 中調(diào)節(jié)音頻設(shè)備音量
在Qt中,你可以使用QMediaPlayer
類的setVolume
方法來調(diào)整音頻的音量。該方法接受一個范圍為0到100的參數(shù),代表音量的百分比。下面是一個示例函數(shù),它接受一個QMediaPlayer
對象和一個音量百分比,然后將播放器的音量調(diào)整為指定的百分比:
#include <QMediaPlayer>
void adjustVolume(QMediaPlayer* player, int volumePercent) {
// Ensure volumePercent is between 0 and 100
if(volumePercent < 0) volumePercent = 0;
if(volumePercent > 100) volumePercent = 100;
// Adjust the volume
player->setVolume(volumePercent);
}
在這個函數(shù)中,player
是你希望調(diào)整音量的QMediaPlayer
對象,volumePercent
是音量的百分比。我們首先確保volumePercent
在0到100之間,然后使用setVolume
方法來調(diào)整播放器的音量。
這個函數(shù)會改變提供的QMediaPlayer
對象的音量,但是不會影響其他QMediaPlayer
對象的音量或者系統(tǒng)的總體音量設(shè)置。
注意,QMediaPlayer
類是Qt的多媒體框架的一部分,你需要在你的項目中添加對應的模塊。如果你正在使用qmake,你可以在你的.pro文件中添加以下代碼:
QT += multimedia
如果你正在使用CMake,你可以使用以下代碼:
find_package(Qt6 COMPONENTS Multimedia REQUIRED)
target_link_libraries(your_project_name PRIVATE Qt6::Multimedia)
音頻調(diào)節(jié)的上限
無論是在數(shù)字域還是在模擬域,音量控制都有一個上限。在數(shù)字域,音量通常被表示為一個范圍內(nèi)的數(shù)值。例如,在SDL中,音量的范圍是從0(靜音)到SDL_MIX_MAXVOLUME(最大音量)。如果你嘗試設(shè)置一個超過這個范圍的音量,它通常會被限制在這個范圍內(nèi)。
在模擬域,音量的上限通常是由硬件設(shè)備的物理限制決定的。例如,揚聲器和耳機的音量不能超過它們的最大輸出電平。如果你嘗試設(shè)置一個超過這個電平的音量,音頻設(shè)備可能會削減信號的幅度,或者在極端情況下可能會產(chǎn)生失真。
另外,還要注意的是,在數(shù)字域和模擬域之間,還有一個DAC(數(shù)字-模擬轉(zhuǎn)換器)。DAC也有它自己的動態(tài)范圍,超過這個范圍的信號也可能會被限制或者失真。
總的來說,音量控制有一個上限,超過這個上限的部分可能會被限制或者失真,這個上限可能是由數(shù)字信號處理的范圍、DAC的動態(tài)范圍、或者音頻設(shè)備的物理限制決定的。
系統(tǒng)級音量
SDL庫和Qt庫提供的是音頻數(shù)據(jù)的處理和播放功能,它們并不直接控制操作系統(tǒng)級別的音頻設(shè)備音量。這些庫可以修改音頻數(shù)據(jù)的音量,但不能直接改變系統(tǒng)音量設(shè)定或音頻設(shè)備的音量。
如果你需要改變系統(tǒng)的音量,或者特定音頻設(shè)備的音量,你通常需要使用操作系統(tǒng)提供的API,或者使用專門的庫。例如,在Windows中,你可能需要使用Windows Core Audio API;在Linux中,你可能需要使用ALSA或者PulseAudio API;在macOS中,你可能需要使用Core Audio API。
這些API通??梢宰屇阒苯硬僮飨到y(tǒng)音量或音頻設(shè)備音量,但也請注意,操作這些API可能需要特殊的權(quán)限,因為這涉及到對系統(tǒng)資源的控制。
系統(tǒng)級的音量控制可以在數(shù)字域和模擬域都進行。這取決于具體的系統(tǒng)和硬件。
在數(shù)字域,系統(tǒng)級音量控制可以通過操作系統(tǒng)的音頻服務(wù)來實現(xiàn)。例如,在Windows中,可以通過Windows Audio Session API(WASAPI)來控制音量。在這種情況下,音量控制實際上是在數(shù)字信號處理階段完成的,改變的是數(shù)字音頻數(shù)據(jù)的振幅。
然后,這些數(shù)字音頻數(shù)據(jù)會被送到DAC(數(shù)字-模擬轉(zhuǎn)換器)轉(zhuǎn)換為模擬信號。在模擬域,也有音量控制的方法。例如,許多音頻設(shè)備(如揚聲器和耳機)都有硬件音量控制。在這種情況下,音量控制是通過改變模擬電信號的強度來實現(xiàn)的。
總的來說,系統(tǒng)級的音量控制可以在數(shù)字域和模擬域都進行,具體取決于你的系統(tǒng)和硬件。在數(shù)字域中,它通常是通過操作系統(tǒng)的音頻服務(wù)來實現(xiàn)的。而在模擬域中,它通常是通過操作音頻設(shè)備的硬件音量控制來實現(xiàn)的。
Windows 中調(diào)節(jié)系統(tǒng)音量
在Windows系統(tǒng)中,可以通過Windows Audio Session API (WASAPI)來控制系統(tǒng)級的音量。以下是一個簡單的例子,展示了如何使用C++和WASAPI來調(diào)整系統(tǒng)音量:
#include <Windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
// Function to adjust system volume
void setSystemVolume(int volumePercent) {
// Ensure volumePercent is between 0 and 100
if (volumePercent < 0) volumePercent = 0;
if (volumePercent > 100) volumePercent = 100;
// Convert volumePercent to float scale (0.0 to 1.0)
float volume = volumePercent / 100.0f;
// Initialize COM
CoInitialize(NULL);
// Get default audio device
IMMDeviceEnumerator *deviceEnumerator = NULL;
CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
IMMDevice *defaultDevice = NULL;
deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
// Get volume control
IAudioEndpointVolume *endpointVolume = NULL;
defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
// Set volume
endpointVolume->SetMasterVolumeLevelScalar(volume, NULL);
// Clean up
endpointVolume->Release();
defaultDevice->Release();
deviceEnumerator->Release();
CoUninitialize();
}
在這個函數(shù)中,我們首先確保volumePercent
在0到100之間,然后將它轉(zhuǎn)換成0.0到1.0的浮點數(shù)范圍。接下來,我們使用WASAPI來獲取默認音頻設(shè)備,并獲取該設(shè)備的音量控制。然后,我們使用IAudioEndpointVolume::SetMasterVolumeLevelScalar
函數(shù)來設(shè)置音量。最后,我們釋放所有的COM對象,并反初始化COM。
請注意,為了能編譯和運行這個代碼,你需要在你的項目中包含Windows SDK,并且鏈接到mmdevapi.lib
。
另外,這個函數(shù)會改變整個系統(tǒng)的音量,會影響所有的音頻流。如果你只想改變特定的音頻流的音量,你需要使用不同的方法,比如我之前提到的在數(shù)字域修改音頻數(shù)據(jù)的振幅。
通過Windows Audio Session API (WASAPI)設(shè)置的音量會影響整個系統(tǒng)的音量,所以你在任務(wù)欄里的音量圖標上看到的音量也會相應地改變。
這是因為WASAPI操作的是系統(tǒng)級的音量控制,它影響的是所有輸出到音頻設(shè)備的音頻流。這包括所有應用程序和系統(tǒng)聲音。因此,當你通過WASAPI來改變音量時,任務(wù)欄的音量圖標會反映出這個改變。
然而,請注意如果你在特定的應用程序內(nèi)部改變音頻數(shù)據(jù)的音量(例如通過SDL或其他音頻庫),這種改變通常不會反映到任務(wù)欄的音量圖標上。這是因為這種方法只改變特定的音頻流,而不影響系統(tǒng)級的音量設(shè)置。
Linux中調(diào)節(jié)系統(tǒng)音量
在Linux系統(tǒng)中,常用的音頻設(shè)備控制程序是ALSA或PulseAudio。以下是一個示例,使用ALSA來調(diào)整系統(tǒng)音量。這需要安裝ALSA的開發(fā)庫(在大多數(shù)Linux發(fā)行版中,包名通常是libasound2-dev
或alsa-lib-devel
)。
#include <alsa/asoundlib.h>
#include <math.h>
// Function to adjust system volume
void setSystemVolume(int volumePercent) {
// Ensure volumePercent is between 0 and 100
if (volumePercent < 0) volumePercent = 0;
if (volumePercent > 100) volumePercent = 100;
// Open mixer
snd_mixer_t *handle;
snd_mixer_open(&handle, 0);
snd_mixer_attach(handle, "default");
snd_mixer_selem_register(handle, NULL, NULL);
snd_mixer_load(handle);
// Get mixer element
snd_mixer_selem_id_t *sid;
snd_mixer_selem_id_alloca(&sid);
snd_mixer_selem_id_set_index(sid, 0);
snd_mixer_selem_id_set_name(sid, "Master");
snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);
// Convert volumePercent to ALSA volume range
long minv, maxv;
snd_mixer_selem_get_playback_volume_range(elem, &minv, &maxv);
long volume = (volumePercent * (maxv - minv) / 100) + minv;
// Set volume
snd_mixer_selem_set_playback_volume_all(elem, volume);
// Clean up
snd_mixer_close(handle);
}
在這個函數(shù)中,我們首先確保volumePercent
在0到100之間,然后我們打開ALSA的混音器,并獲取名為"Master"的混音元素。然后,我們獲取該元素的音量范圍,并將volumePercent
轉(zhuǎn)換為這個范圍的值。最后,我們使用snd_mixer_selem_set_playback_volume_all
函數(shù)來設(shè)置音量,然后關(guān)閉混音器。
請注意,這個函數(shù)會改變整個系統(tǒng)的音量,會影響所有的音頻流。如果你只想改變特定的音頻流的音量,你需要使用不同的方法,比如在數(shù)字域修改音頻數(shù)據(jù)的振幅。文章來源:http://www.zghlxwxcb.cn/news/detail-745814.html
另外,這個函數(shù)假設(shè)你的系統(tǒng)使用的是ALSA來管理音頻設(shè)備,且"Master"是控制主音量的混音元素。在不同的系統(tǒng)或配置中,這可能會有所不同。你可能需要根據(jù)你的系統(tǒng)配置來修改這個函數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-745814.html
到了這里,關(guān)于解析音頻輸出調(diào)節(jié)音量的原理以及調(diào)節(jié)的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!