音頻pos機下載

 新聞資訊2  |   2023-07-08 10:08  |  投稿人:pos機之家

網上有很多關于音頻pos機下載,PCM音頻播放器的實現的知識,也有很多人為大家解答關于音頻pos機下載的問題,今天pos機之家(www.shbwcl.net)為大家整理了關于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、音頻pos機下載

音頻pos機下載

前言

今天向大家介紹一下如何通過 SDL 實現一個PCM音頻播放器。這是一個最簡單的播放器,它不涉及到音頻的解復用,解碼等工作。我們只需要將音頻原始數據喂給 SDL 音頻接口就可以聽到悅耳的聲音了。在下面的列子中我將向你演示,使用 SDL 做這樣一個播放器是何等的簡音。

當然這個看似簡單的播放器其實是由許多的理論基礎在底層支持著的。如果在這方面沒有什么基礎的同學可以通過下面的鏈接去自行學習。

SDL 入門

SDL窗口渲染

SDL基本圖形繪制

SDL事件處事

徹底理解SDL紋理

SDL孫悟空與多線程

另外,我在慕課網分享了音視頻免費入門課程,有興趣的同學可以去觀看。

播放音頻的基本原則

如果我們要播放一段聲音,想當然的認為直接將播放的聲音發送給聲卡,這樣揚聲器就會將聲音播放出來。只要我們不斷的送數據,聲音就會不停的輸出。

事實上真的是這樣嗎?當 然 不 是!!!

實際上,所有的音頻播放都遵守著一個原則,就是當聲卡將要播放的聲音輸出到揚聲器時,它首先會通過回調函數,向你要它一部分聲頻數據,然后拿著這部分音頻數據去播放。等播放完了,它會再向你要下一部分。

至于要的數據的多少,什么時候向你要,這些都是由聲卡決定的。對于我們上層應用來說,這些都是由底層 API 決定的。

為什么會出現這種情況呢?為什么播放音頻與我們一般的邏輯相反呢?這是因為聲卡會嚴格按照音頻的播放時間進行播放,不會多一秒,也不會少一秒。正因為它能準確的計算出時間來,而應用層是不知道這個時間的,所以我們必須按照聲卡的要求給它喂數據,而不能依據自己的性子來。

那么有人會問,為什么聲卡可以精準的計算出播放時間來呢?這是因為在播放之前我們給它設置了采樣率、通道數、采樣大小等參數,通過這些參數它就可以計算出時間來。

我們來做個計算,假設采樣率是 48000, 雙通道,采樣大小是 16bit,那么一秒種的數據是多少呢? 48000*2*16=1536000. 反過來,如果我們有一段 8M 的數據,那么聲卡就知道它能播放 5秒多的聲音。

上面的一大段文字描述,實際上只是想說明一個道理,就是要播放的聲音數據,是聲卡主動要的,不能由上層直接設置。這是通過回調函數來實現的。后面會有具體的例子。

SDL如何處理音頻

SDL是一個處理多媒體的開源庫,我們來看看它是如何播放音頻的,具體的操作步驟是啥?

打開音頻設備

設置音頻參數

播放音頻

向聲卡喂數據

關閉音頻設置

詳細API介紹

打開音頻設備

int SDL_OpenAudio(SDL_AudioSpec* desired, SDL_AudioSpec* obtained)

desired: 設置音頻參數。

參數說明freq每秒采頻率SDL_AudioFormat音頻數據存儲格式channels通道數silence靜音值samples采樣個數size音頻緩沖區大小SDL_AudioCallback回調函數userdata回調函數參數指針

obtained: 返回參數。

關閉音頻設備

void SDL_CloseAudio(void)

播放與暫停

void SDL_PauseAudio(int pause_on)

pause_on: 0, 暫停播放;1, 播放;

喂數據

void SDL_MixAudio(Uint8* dst, const Uint8* src, Uint32 len, int volume)

dst: 目的緩沖區

src: 源緩沖區

len: 音頻數據長度

volume: 音量大小,0-128 之間的數。SDL_MIX_MAXVOLUME代表最大音量。

例子

這個例子主要為大家展示了一下如何使用 SDL 的音頻 API 來播放聲音。其基本流程是,從 pcm 文件一塊一塊的讀數據。然后通過 read_audio_data 這個回調函數給聲卡喂數據。如果一次沒用完,SDL會再次調用回調函數讀數據。

如果audio_buf中的數據用完了,則再次從文件中讀一塊數據,直到讀到文件尾。

#include <stdio.h>#include <SDL.h>#define BLOCK_SIZE 4096000static Uint8 *audio_buf = NULL;static Uint8 *audio_pos = NULL;static size_t buffer_len = 0;//callback function for audio devcievoid read_audio_data(void *udata, Uint8 *stream, int len){ if(buffer_len == 0){ return; } SDL_memset(stream, 0, len); len = (len < buffer_len) ? len : buffer_len; SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME); audio_pos += len; buffer_len -= len;}int main(int argc, char *argv[]){ int ret = -1; FILE *audio_fd = NULL; SDL_AudioSpec spec; char *path = "./test.pcm"; //SDL initialize if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)){ fprintf(stderr, "Could not initialize SDL - %s\", SDL_GetError()); return ret; } //open pcm file audio_fd = fopen(path, "r"); if(!audio_fd){ fprintf(stderr, "Failed to open pcm file!\"); goto __FAIL; }//SDL_AudioSpec spec.freq = 44100;; spec.format = AUDIO_S16SYS; spec.channels = 2; spec.silence = 0; spec.samples = 1024;; spec.callback = read_audio_data;; spec.userdata = NULL; //open audio devcie if(SDL_OpenAudio(&spec, NULL)){ fprintf(stderr, "Failed to open audio device, %s\", SDL_GetError()); goto __FAIL; } //play audio SDL_PauseAudio(0); do{ //read data from pcm file buffer_len = fread(audio_buf, 1, BLOCK_SIZE, audio_fd); fprintf(stderr, "block size is %zu\", buffer_len); audio_pos = audio_buf; //the main thread wait for a moment while(audio_pos < (audio_buf + buffer_len)) { SDL_Delay(1); } }while(buffer_len !=0); //close audio device SDL_CloseAudio(); ret = 0;__FAIL: //release some resources if(audio_buf){ free(audio_buf); } if(audio_fd){ fclose(audio_fd); } //quit SDL SDL_Quit(); return ret;}小結

本文向大家講解了一下如何通過SDL庫的音頻處理 API 實現一個最簡單的 PCM 播放器。通過個例子大家可以了解到,SDL的使用是如此簡單。

當然這個播放器還是有點 Low,不過不要緊,隨著后面文章的推出,你會逐漸看到一個完整的播放器是如何被打造出來的。

希望本文能對你有所幫助,謝謝!

隆重推薦

我的免費音視頻入門課(慕課網)

以上就是關于音頻pos機下載,PCM音頻播放器的實現的知識,后面我們會繼續為大家整理關于音頻pos機下載的知識,希望能夠幫助到大家!

轉發請帶上網址:http://www.shbwcl.net/newsone/81773.html

你可能會喜歡:

版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 babsan@163.com 舉報,一經查實,本站將立刻刪除。