音頻pos機下載

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

網(wǎng)上有很多關(guān)于音頻pos機下載,PCM音頻播放器的實現(xiàn)的知識,也有很多人為大家解答關(guān)于音頻pos機下載的問題,今天pos機之家(m.nxzs9ef.cn)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、音頻pos機下載

音頻pos機下載

前言

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

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

SDL 入門

SDL窗口渲染

SDL基本圖形繪制

SDL事件處事

徹底理解SDL紋理

SDL孫悟空與多線程

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

播放音頻的基本原則

如果我們要播放一段聲音,想當(dāng)然的認(rèn)為直接將播放的聲音發(fā)送給聲卡,這樣揚聲器就會將聲音播放出來。只要我們不斷的送數(shù)據(jù),聲音就會不停的輸出。

事實上真的是這樣嗎?當(dāng) 然 不 是!!!

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

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

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

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

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

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

SDL如何處理音頻

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

打開音頻設(shè)備

設(shè)置音頻參數(shù)

播放音頻

向聲卡喂數(shù)據(jù)

關(guān)閉音頻設(shè)置

詳細(xì)API介紹

打開音頻設(shè)備

int SDL_OpenAudio(SDL_AudioSpec* desired, SDL_AudioSpec* obtained)

desired: 設(shè)置音頻參數(shù)。

參數(shù)說明freq每秒采頻率SDL_AudioFormat音頻數(shù)據(jù)存儲格式channels通道數(shù)silence靜音值samples采樣個數(shù)size音頻緩沖區(qū)大小SDL_AudioCallback回調(diào)函數(shù)userdata回調(diào)函數(shù)參數(shù)指針

obtained: 返回參數(shù)。

關(guān)閉音頻設(shè)備

void SDL_CloseAudio(void)

播放與暫停

void SDL_PauseAudio(int pause_on)

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

喂數(shù)據(jù)

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

dst: 目的緩沖區(qū)

src: 源緩沖區(qū)

len: 音頻數(shù)據(jù)長度

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

例子

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

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

#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;}小結(jié)

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

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

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

隆重推薦

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

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

轉(zhuǎn)發(fā)請帶上網(wǎng)址:http://m.nxzs9ef.cn/newsone/81773.html

你可能會喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。