freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于rtp的linux實(shí)時(shí)語音通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文(參考版)

2025-03-02 10:16本頁面
  

【正文】 mixer, 0)) 0) { std::cerr snd_mi。 int result。 snd_mixer_elem_t *elem。 exit(1)。 snd_pcm_prepare(handle)。 if (rc == EPIPE) { usleep(202100)。 snd_pcm_uframes_t period_size = ()。 } } } ,我們再添加一個(gè)播放函數(shù),當(dāng)接收到音頻數(shù)據(jù)時(shí),向音頻設(shè)備寫入數(shù)據(jù),這個(gè)函數(shù)在 class COrtpClient 中: void COrtpClient::play_wav(char *pBuffer) { int rc = 0。 count = r。 exit(1)。 } else if (r == ESTRPIPE) { std::cout Need suspend /n。 } else if (r == EPIPE) { std::cerr overrun occurred: std::endl。 (size_t)r count)) { std::cerr Buffer Underrun std::endl。 //把采集到的音頻數(shù)據(jù)放到 sendBuffer 緩沖區(qū)里,通過 RTP 封裝然后發(fā)送 if (r == EAGAIN || (r = 0 amp。 size_t result = 0。 void CWavPlayer::alsa_record(char *sendBuffer) 嘉應(yīng)學(xué)院畢業(yè)論文 (設(shè)計(jì) ) 19 { int r = 0。 //計(jì)算周期長度 snd_pcm_hw_params_free(hw_params)。 //獲取采樣位數(shù) bit_per_frame = bit_per_sample * channels。format)。 snd_pcm_format_t format。period_size, amp。 } snd_pcm_hw_params(handle, hw_params)。period_time, 0) 0) { std::cerr Error snd_pcm_hw_params_set_period_time_near/n。 exit(1)。 if (snd_pcm_hw_params_set_buffer_time_near(handle, hw_params, amp。 } if (buffer_time 500000) buffer_time = 500000。buffer_time, 0) 0) { 嘉應(yīng)學(xué)院畢業(yè)論文 (設(shè)計(jì) ) 18 std::cerr Error snd_pcm_hw_params_get_buffer_time_max/n。 //設(shè)置采樣率 uint32_t buffer_time, period_time。sample_rate, amp。 //設(shè)置通道數(shù) int dir = 0。 break 。 break 。 break 。 //設(shè)備初始化 snd_pcm_hw_params_set_access(handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)。hw_params)。 明白了各參數(shù)含義及關(guān)系后,我們開始設(shè)置參數(shù): void CWavPlayer::set_pcm_params() { snd_pcm_hw_params_t *hw_params。而在非交錯(cuò)模式下,首先記錄的是一個(gè)周期內(nèi)所有楨的左聲道樣本,再記錄右聲道樣本,數(shù)據(jù)是以連續(xù)通道的方式存儲(chǔ)。 ( 5)周期 (period):音頻設(shè)備一次處理所需要的楨數(shù),對于音頻設(shè)備的數(shù)據(jù)訪問以及音頻數(shù)據(jù)的存儲(chǔ),都是以此為單位。 ( 3)楨 (frame):楨記錄了一個(gè)聲音單元,其長度為樣本長度與通道數(shù)的乘積 。 ( 1)樣本長度 (sample):樣本是記錄音頻數(shù)據(jù)最基本的單位,常見的有 8 位和 16 位。 ,參數(shù)設(shè)置不當(dāng)將會(huì)導(dǎo)致音頻設(shè)備無法正常工作。 } } snd_pcm_open 是 Alsa 庫提供的打開設(shè)備調(diào)用函數(shù),這里我們指定打開缺省的音頻設(shè)備,并根據(jù)參數(shù) mode 將設(shè)備置為錄音或是播放狀態(tài),如果參數(shù) mode 是 SND_PCM_STREAM_ PLAYBACK,則為打開播 放設(shè)備;如果參數(shù) mode 是 SND_PCM_STREAM_CAPTURE,則為打開錄音設(shè)備。handle, default, mode, 0)) 0) { std::cerr snd_pcm_open: std::endl。 : void CWavPlayer::open_pcm_devices(snd_pcm_stream_t mode) { int rc。 //the point of struct }。 //設(shè)備句柄 snd_pcm_uframes_t period_size。 //周期長度( bytes) 嘉應(yīng)學(xué)院畢業(yè)論文 (設(shè)計(jì) ) 16 uint32_t bit_per_frame。 //采樣位數(shù) uint16_t channels。} private: uint32_t sample_rate。} snd_pcm_t *get_handle() const { return handle。other)。 //設(shè)置混音器 CWavPlayer amp。 //設(shè)置設(shè)備參數(shù) void alsa_record(char *sendBuffer)。 void print_wav() const。 //打開音頻設(shè)備 void wav_record(uint16_t dtimes, int fd)。 uint32_t snd_read_pcm(uint32_t rcount, char *wave_buf)。 //音頻播放 void read_wav_header(int fd)。 ~CWavPlayer()。 //構(gòu)造函數(shù) CWavPlayer(CWavPlayer amp。 ALSA 還提供一組命令行工具包括 mixer, sound file player 和工具控制一些特別的聲卡的特別的作用。為提供向后兼容, ALSA 提供內(nèi)核模塊模仿 OSS/Free 驅(qū)動(dòng),所以大多數(shù)的程序不需要改動(dòng)。用這些進(jìn)行寫程序不需要打開設(shè)備等操作,所以編程人員在寫程序的時(shí)候不會(huì)被底層的東西困擾。它包含內(nèi)核驅(qū)動(dòng)集合, API 庫和工具對Linux 聲音進(jìn)行支持。作為一個(gè)商業(yè)軟件,你雖然可以使用它,但是你得不到它的源代碼,并且你必須為此而付錢。它可以驅(qū)動(dòng)很多聲卡并且可以用在很多 UNIX 系統(tǒng)中。 OSS/Lite 從 開始并入內(nèi)核,嘉應(yīng)學(xué)院畢業(yè)論文 (設(shè)計(jì) ) 14 現(xiàn)在大家使用的聲卡驅(qū)程默認(rèn)都是 OSS/Lite 中的。由于 Hannu 的“逃跑”, RH 資助 Alan Cox 增強(qiáng) Hannu 開發(fā)的驅(qū)動(dòng)程序,并使它們完全模塊化。 OSS/Lite 是現(xiàn)在 linux 內(nèi)核中自帶的聲卡驅(qū)動(dòng)程序集,最初由 Hannu Savolainen 開發(fā)。在 Linux 上進(jìn)行音頻編程的本質(zhì)就是要借助于驅(qū)動(dòng)程序,來完成對聲卡的各種操作。雙聲道又稱為立體聲,在硬件中有兩條線路,音質(zhì)和音色都要優(yōu)于單聲道,但數(shù)字化后占據(jù)的存儲(chǔ)空間的大小要比單聲道多 一倍。采樣位數(shù)越高,信號(hào)的動(dòng)態(tài)范圍越大,數(shù)字化后的音頻信號(hào)就越可能接近原始信號(hào),但所需要的存貯空間也越大。比較一下,一段相同的音樂信息, 16位聲卡能把它分為 64K 個(gè)精度單位進(jìn)行處理,而 8位聲卡只能處理 256個(gè)精度單位, 造成了較大的信號(hào)損失,最終的采樣效果自然是無法相提并論的。采集卡的位客觀地反映了數(shù)字聲音信號(hào)對輸入聲音信號(hào)描述的準(zhǔn)確程度。反之,在播放時(shí)則是把數(shù)字信號(hào)還原成模擬聲音信號(hào)輸出。我們首先要知道:電腦中的聲音文件是用數(shù)字 0和 1來 表示的。 ( 2) .采樣的位數(shù) 采樣位數(shù)可以理解為采 集卡處理聲音的解析度。正常人聽覺的頻率范圍大約在20Hz~20kHz 之間,根據(jù)奈奎斯特采樣理論,為了保證聲音不失真,采樣頻率應(yīng)該在 40kHz左右。下面介紹幾個(gè)在進(jìn)行音頻編程時(shí)經(jīng)常需要用到的技術(shù)指標(biāo): ( 1) .采樣頻率 采樣頻率是指將模擬聲音波形進(jìn)行數(shù)字化時(shí),每秒鐘抽取聲波幅度 樣本的次數(shù)。 數(shù)字音頻涉及到的概念非常多,對于在 Linux 下進(jìn)行音頻編程的程序員來說,最重要的是理解聲音數(shù)字化的兩個(gè)關(guān)鍵步驟:采樣和量化。 A/D 轉(zhuǎn)換器以每秒鐘上萬次的速率對聲波進(jìn)行采樣,每個(gè)采樣點(diǎn)都記錄下了原始模擬聲波在某一時(shí)刻的狀態(tài),通常稱之為樣本sample),而每一秒鐘所采樣的數(shù)目則稱為采樣頻率,通過將一串連續(xù)的樣本連接起來,就可以在計(jì)算機(jī)中描述一段聲音了。 下面圖 : 實(shí)時(shí)語音通信模塊實(shí)現(xiàn)過程 見下圖 : 圖 基本框架流程圖 本系統(tǒng)核心模塊是語音通話模塊的實(shí)現(xiàn),下面是語音通話模塊的流程圖: 嘉應(yīng)學(xué)院畢業(yè)論文 (設(shè)計(jì) ) 12 語音通話模塊的流程圖 第四章 linux 音頻編程 音頻編程簡介 音頻信號(hào)是一種連續(xù)變化的模擬信號(hào),但計(jì)算機(jī)只能處理和記錄二 進(jìn)制的數(shù)字信號(hào),由自然音源得到的音頻信號(hào)必須經(jīng)過一定的變換,成為數(shù)字音頻信號(hào)之后,才能送到計(jì)算機(jī)中作進(jìn)一步的處理。具體的過程是:上層通過麥克風(fēng)采集音頻數(shù)據(jù),然后采用 G729a 進(jìn)行音頻壓縮,發(fā)送方 RTP 協(xié)議從上層接收音頻數(shù)據(jù)(這里采用 PCM 編碼),封裝成 RTP 數(shù)據(jù)包發(fā)送給下層協(xié)議 UDP, UDP 提供 RTP 和 RTCP 的分流, RTP 使 用一個(gè)偶數(shù)號(hào)端口,相應(yīng)的 RTCP 使用其后的奇數(shù)號(hào)端口。 系統(tǒng)實(shí)現(xiàn)的基本原理和框架結(jié)構(gòu) 本系統(tǒng)主要實(shí)現(xiàn)音頻數(shù)據(jù)的實(shí)時(shí)傳輸通話。非常重要的一點(diǎn), Linux 還是一種開放、免費(fèi)的操作系統(tǒng),還具有可移植性和自由代碼等特性,這是其它操作系統(tǒng)所無法比擬的。在 linux 平臺(tái)上,音頻采集采用 ALSA( Advanced Linux Sound Architecture )的 lib 庫,利用網(wǎng)上現(xiàn)有的 oRTP 庫實(shí)現(xiàn)基于 RTP 的實(shí)時(shí)語音傳輸。此域不用來復(fù)用不同的媒體流 . ( 7)序列號(hào)( sequence number) :16 比特 每發(fā)送一個(gè) RTP 數(shù)據(jù)包 ,序列號(hào)加一 ,接收機(jī)可以據(jù)此檢測包損和重建包序列 .序列號(hào)的初始值是隨機(jī)的 (不可預(yù)測 ),以使即便在源本身不加密時(shí) (有時(shí)包要通過翻譯器 ,它會(huì)這樣做 ),對加密算法泛知的普通文本攻擊也會(huì)更加困難 . ( 8)時(shí)間標(biāo)志( timestamp) :32 比特 時(shí)間標(biāo)志反映了 RTP 數(shù)據(jù)包中第一個(gè)比特的抽樣瞬間 .抽樣瞬間必須由隨時(shí)間單調(diào)和線形增長的時(shí)鐘得到 ,以進(jìn)行同步和抖動(dòng)計(jì)算 .時(shí)鐘的分辨率必須滿足要求的同步準(zhǔn)確度 ,足以進(jìn)行包到達(dá)抖動(dòng)測量 .時(shí)鐘頻率與作為負(fù)載傳輸?shù)臄?shù)據(jù)格式獨(dú)立 ,在協(xié)議中或定義此 格式的負(fù)載類型說明中靜態(tài)定義 ,也可以在通過非 RTP 方法定義的負(fù)載格式中動(dòng)態(tài)說明 .若 RTP 包周期性生成 ,可以使用由抽樣時(shí)鐘確定的額定抽樣瞬間 ,而不是讀系統(tǒng)時(shí)鐘 .例如 ,對于固定速率語音 ,時(shí)間標(biāo)志鐘可以每個(gè)抽樣周期加 語音設(shè)備從輸入設(shè)備讀取覆蓋 160 個(gè)抽樣周期的數(shù)據(jù)塊 ,對于每個(gè)這樣的數(shù)據(jù)塊 ,時(shí)間標(biāo)志增加 160,無論此塊被發(fā)送還是被靜音壓縮 . 時(shí)間標(biāo)志的起始值是隨機(jī)的 ,如同序列號(hào) .多個(gè)連續(xù)的 RTP 包可能由同樣的時(shí)間標(biāo)志 ,若他們在邏輯上同時(shí)產(chǎn)生 .如屬于同一個(gè)圖象幀 .若數(shù)據(jù)沒有按照抽樣的 順序發(fā)送 ,連續(xù)的 RTP 包可以包含不單調(diào)的時(shí)間標(biāo)志 ,如 MPEG 交織圖象幀 . ( 9)同步源( SSRC) :32 比特 SSRC 域用以識(shí)別同步源 .標(biāo)識(shí)符被隨機(jī)生成 ,以使在同一個(gè)RTP會(huì)話期中沒有任何兩個(gè)同步源有相同的 SSRC識(shí)別符 .盡管多個(gè)源選擇同一個(gè) SSRC識(shí)別符的概率很低 ,所有 RTP 實(shí)現(xiàn)工具都必須準(zhǔn)備檢測和解決沖突 .若一個(gè)源改變本身的源傳輸?shù)刂?,必須選擇新的 SSRC 識(shí)別符 ,以避免被當(dāng)作一個(gè)環(huán)路源 . ( 10)有貢獻(xiàn)源( CSRC)列表 :0 到 15項(xiàng) ,每項(xiàng) 32 比特 CSRC 列表識(shí)別在此包中負(fù)載的有貢獻(xiàn)源 .識(shí)別符的數(shù)目在 CC 域中給定 .若 有貢獻(xiàn)源多于 15個(gè) ,僅識(shí)別 15個(gè) .CSRC 識(shí)別符由混合器插入 ,用有貢獻(xiàn)源的 SSRC 識(shí)別符 .例如語音包 ,混合產(chǎn)生新包的所有源的 SSRC 標(biāo)識(shí)符都被陳列 ,以期在接收機(jī)處正確指示交談?wù)?. 注意: 前 12個(gè)字節(jié)出現(xiàn)在每個(gè) RTP包中 ,僅僅在被混合器插入時(shí) ,才出現(xiàn) CSRC 識(shí)別符列表 . 嘉應(yīng)學(xué)院畢業(yè)論文 (設(shè)計(jì) ) 10 RTP 報(bào)
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1