最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++使用alsa庫實現(xiàn)播放聲音文件

 更新時間:2024年04月24日 08:38:01   作者:洛克希德馬丁  
這篇文章主要為大家詳細介紹了Linux系統(tǒng)上C++如何使用alsa庫播放聲音文件,文中示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

平常讀麥克風(fēng)的場景居多,有時候也需要播放一個聲音文件,這里就介紹怎么處理。

一、命令行

1.ffmpeg

ffmpeg -i <filename.wav> -f alsa default

2.aplay

aplay -i <filename.wav>

如果提示找不到aplay就安裝工具:

sudo apt install alsa-utils

二、代碼實現(xiàn)

main.cpp

#include <alsa/asoundlib.h>
#include <iostream>
#include <fstream>

#define PCM_DEVICE "default"http://默認的播放設(shè)備,你可以在settings里面調(diào)換

int main(int argc, char *argv[]) {
    const char *audioFilename = "../wakeup.wav";

    // 配置ALSA參數(shù)
    snd_pcm_t *pcmHandle;
    if (snd_pcm_open(&pcmHandle, PCM_DEVICE, SND_PCM_STREAM_PLAYBACK, 0) < 0) {
        std::cerr << "Error: Failed to open PCM device" << std::endl;
        return 1;
    }

    snd_pcm_hw_params_t *params;
    snd_pcm_hw_params_alloca(&params);
    snd_pcm_hw_params_any(pcmHandle, params);
    snd_pcm_hw_params_set_access(pcmHandle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
    snd_pcm_hw_params_set_format(pcmHandle, params, SND_PCM_FORMAT_S16_LE);
    snd_pcm_hw_params_set_channels(pcmHandle, params, 2);
    unsigned int sampleRate = 48000;
    snd_pcm_hw_params_set_rate_near(pcmHandle, params, &sampleRate, nullptr);
    snd_pcm_uframes_t bufferSize = 512;
    snd_pcm_hw_params_set_buffer_size_near(pcmHandle, params, &bufferSize);
    snd_pcm_hw_params(pcmHandle, params);

    std::ifstream ifs("../wakeup.wav");
    if (ifs.is_open()) {
        std::string data;
        size_t size;
        char buffer[8192];
        while ((size = ifs.readsome(buffer, 8192)) > 0) {
            data.append(buffer, size);
        }
        snd_pcm_sframes_t err = snd_pcm_writei(pcmHandle, (const void *) data.c_str(),
                                               data.size()); 
        if (err < 0) {
            std::cerr << "Error: Failed to write PCM device" << std::endl;
        }
        ifs.close();
    }

    // 關(guān)閉PCM設(shè)備和文件
    snd_pcm_close(pcmHandle);
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(write_speaker)

set(CMAKE_CXX_STANDARD 11)

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} asound)

三、知識補充

C++使用Alsa采集linux音頻

1、運行時前先裝庫,sudo apt-get install libalsa

2遍tab自動提示出庫文件,選擇庫,alsa-ocaml-dev,最終的命令行為:sudo apt-get install libalsa-ocaml-dev

2、編譯執(zhí)行腳本,gcc -o main main.c -lasound;

3、執(zhí)行 ./main

以下是代碼

#include <stdlib.h>
#include <stdio.h>
#include <alsa/asoundlib.h>
#include <signal.h>
static int recording;

void stop_record(int param)
{
recording = 0;
}
void InitCapture(snd_pcm_t ** handle,snd_pcm_hw_params_t ** params,snd_pcm_uframes_t* frames,char ** buffer,int* size)
{
int ret;
unsigned int val;
int dir;
//打開設(shè)備
ret = snd_pcm_open(handle, “default”, SND_PCM_STREAM_CAPTURE, 0);
printf(“after open file\n”);
if (ret < 0)
{
fprintf(stderr, “unable to open device:%s\n”, snd_strerror(ret));
exit(1);
}
//分配一個硬件參數(shù)結(jié)構(gòu)體
snd_pcm_hw_params_alloca(params);

//使用默認參數(shù)
snd_pcm_hw_params_any(*handle, *params);

//翻譯
    snd_pcm_hw_params_set_access(*handle, *params, SND_PCM_ACCESS_RW_INTERLEAVED);

//S16小端
snd_pcm_hw_params_set_format(*handle, *params, SND_PCM_FORMAT_S16_LE);

//雙通道,立體聲
snd_pcm_hw_params_set_channels(*handle, *params, 2);

//采樣率
val = 44100;
snd_pcm_hw_params_set_rate_near(*handle, *params,&val,&dir);

*frames = 32;
snd_pcm_hw_params_set_period_size_near(*handle, *params,frames,&dir);

//參數(shù)生效
ret = snd_pcm_hw_params(*handle, *params);
if (ret<0)
{
	fprintf(stderr, "unable to set hw parameters:%s\n", snd_strerror(ret));
		exit(1);
}
//得到一個周期的數(shù)據(jù)大小
snd_pcm_hw_params_get_period_size(*params, frames, &dir);

//16位雙通道,16位為2字節(jié),2字節(jié)*2通道=4,假如frames=1024,則size是1024*4 = 4096
*size = *frames * 4;
*buffer = (char*)malloc(*size); 

//設(shè)置一個周期的時間長度
snd_pcm_hw_params_get_period_time(*params, &val, &dir);
}

void CaptureAudio(snd_pcm_t ** handle,snd_pcm_uframes_t* frames,char ** buffer,int* size,FILE ** pFile)
{
int ret;

recording = 1;
while (recording)
{
	ret = snd_pcm_readi(*handle, *buffer,*frames);
	if (ret == -EPIPE )
	{
		fprintf(stderr, "overrun occurred\n");
		snd_pcm_prepare(*handle);
	}
	else if (ret < 0)
	{
		fprintf(stderr, "error from read\n");
		snd_strerror(ret);
	}
	else if (ret != (int)(*frames))
	{
		fprintf(stderr, "short read %d frames\n",ret);
	}
	printf("write to file......%d\n", *size);
	//寫到標準輸出中去
	ret = fwrite(*buffer, sizeof(char), *size, *pFile);
	if (ret != *size)
	{
		fprintf(stderr, "short write :write %d bytes\n", ret);
	}
	if (signal(SIGINT, stop_record)==SIG_ERR)
	{
		fprintf(stderr, "signal failed\n");
	}
}
}

void CloseCaptureDevice(FILE ** pFile,snd_pcm_t ** handle,char ** buffer)
{
printf(“write file exit\n”);
snd_pcm_drain(*handle);
snd_pcm_close(*handle);
free(*buffer);
fclose(*pFile);
}

int main()
{
FILE * pFile;
pFile = fopen(“test.pcm”, “wb”);
int size;
//給文件操作分配一個句柄
snd_pcm_t * handle;
//硬件參數(shù)
snd_pcm_hw_params_t * params;
//
snd_pcm_uframes_t frames;
char * buffer;
printf(“before open file\n”);
InitCapture(&handle,&params,&frames,&buffer,&size);
CaptureAudio(&handle,&frames,&buffer,&size,&pFile);
CloseCaptureDevice(&pFile,&handle,&buffer);
printf(“write file exit\n”);

return 0;
}

到此這篇關(guān)于C++使用alsa庫實現(xiàn)播放聲音文件的文章就介紹到這了,更多相關(guān)C++ alsa播放聲音文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt繪制時鐘效果

    Qt繪制時鐘效果

    這篇文章主要為大家詳細介紹了Qt繪制時鐘效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 基于C語言實現(xiàn)鉆石棋游戲的示例代碼

    基于C語言實現(xiàn)鉆石棋游戲的示例代碼

    獨立鉆石是源于18世紀法國的宮廷貴族的自我挑戰(zhàn)類單人棋游戲,可以鍛煉邏輯思維能力。本文將用C語言實現(xiàn)這一簡單的游戲,感興趣的小伙伴可以了解一下
    2023-02-02
  • C語言與C++動態(tài)通訊錄超詳細實現(xiàn)流程

    C語言與C++動態(tài)通訊錄超詳細實現(xiàn)流程

    這篇文章主要為大家介紹了C語言與C++動態(tài)實現(xiàn)通訊錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-05-05
  • 380行C++代碼實現(xiàn)掃雷小游戲

    380行C++代碼實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細介紹了380行C++代碼實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C語言實現(xiàn)選擇排序、直接插入排序、冒泡排序的示例

    C語言實現(xiàn)選擇排序、直接插入排序、冒泡排序的示例

    這篇文章主要介紹了C++實現(xiàn)選擇排序、直接插入排序、冒泡排序的代碼示例,相當簡潔直觀,也是算法和數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)中的基礎(chǔ),需要的朋友可以參考下
    2016-02-02
  • C標準庫<assert.h>的實現(xiàn)詳解

    C標準庫<assert.h>的實現(xiàn)詳解

    這篇文章主要介紹了C標準庫<assert.h>的實現(xiàn),主要包括了<assert.h>的基本概念、實現(xiàn)及用法等,需要的朋友可以參考下
    2014-09-09
  • C++11 上下文關(guān)鍵字的具體實踐

    C++11 上下文關(guān)鍵字的具體實踐

    本文主要介紹了C++11 上下文關(guān)鍵字的具體實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • QT5實現(xiàn)電子時鐘

    QT5實現(xiàn)電子時鐘

    這篇文章主要為大家詳細介紹了QT5實現(xiàn)電子時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言文件讀寫操作介紹與簡單示例

    C語言文件讀寫操作介紹與簡單示例

    這篇文章主要給大家介紹了關(guān)于C語言文件讀寫操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++實現(xiàn)Go的defer功能(示例代碼)

    C++實現(xiàn)Go的defer功能(示例代碼)

    defer和go一樣都是Go語言提供的關(guān)鍵字。defer用于資源的釋放,會在函數(shù)返回之前進行調(diào)用。接下來通過本文給大家介紹C++實現(xiàn)Go的defer功能,感興趣的朋友跟隨小編一起看看吧
    2021-07-07

最新評論

桐乡市| 南平市| 佛山市| 余干县| 皋兰县| 白玉县| 盐津县| 梁河县| 中西区| 南京市| 嘉荫县| 平凉市| 安西县| 泸州市| 定陶县| 盖州市| 清水县| 隆昌县| 郎溪县| 垣曲县| 双江| 铅山县| 屯门区| 绥阳县| 凤城市| 华宁县| 兰溪市| 马公市| 万州区| 浪卡子县| 剑川县| 锦屏县| 元朗区| 永新县| 太保市| 安陆市| 营山县| 吴旗县| 若羌县| 明水县| 新沂市|