音頻pos機(jī)下載

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

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

本文目錄一覽:

1、音頻pos機(jī)下載

音頻pos機(jī)下載

前言

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

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

SDL 入門(mén)

SDL窗口渲染

SDL基本圖形繪制

SDL事件處事

徹底理解SDL紋理

SDL孫悟空與多線程

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

播放音頻的基本原則

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

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

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

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

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

那么有人會(huì)問(wèn),為什么聲卡可以精準(zhǔn)的計(jì)算出播放時(shí)間來(lái)呢?這是因?yàn)樵诓シ胖拔覀兘o它設(shè)置了采樣率、通道數(shù)、采樣大小等參數(shù),通過(guò)這些參數(shù)它就可以計(jì)算出時(shí)間來(lái)。

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

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

SDL如何處理音頻

SDL是一個(gè)處理多媒體的開(kāi)源庫(kù),我們來(lái)看看它是如何播放音頻的,具體的操作步驟是啥?

打開(kāi)音頻設(shè)備

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

播放音頻

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

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

詳細(xì)API介紹

打開(kāi)音頻設(shè)備

int SDL_OpenAudio(SDL_AudioSpec* desired, SDL_AudioSpec* obtained)

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

參數(shù)說(shuō)明freq每秒采頻率SDL_AudioFormat音頻數(shù)據(jù)存儲(chǔ)格式channels通道數(shù)silence靜音值samples采樣個(gè)數(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ù)長(zhǎng)度

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

例子

這個(gè)例子主要為大家展示了一下如何使用 SDL 的音頻 API 來(lái)播放聲音。其基本流程是,從 pcm 文件一塊一塊的讀數(shù)據(jù)。然后通過(guò) read_audio_data 這個(gè)回調(diào)函數(shù)給聲卡喂數(shù)據(jù)。如果一次沒(méi)用完,SDL會(huì)再次調(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é)

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

當(dāng)然這個(gè)播放器還是有點(diǎn) Low,不過(guò)不要緊,隨著后面文章的推出,你會(huì)逐漸看到一個(gè)完整的播放器是如何被打造出來(lái)的。

希望本文能對(duì)你有所幫助,謝謝!

隆重推薦

我的免費(fèi)音視頻入門(mén)課(慕課網(wǎng))

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

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://m.51zrwd.com/newsone/81773.html

你可能會(huì)喜歡:

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