国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux alsa 音頻 錄制與播放

這篇具有很好參考價(jià)值的文章主要介紹了Linux alsa 音頻 錄制與播放。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一. 概述

ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經(jīng)成為了linux的主流音頻體系結(jié)構(gòu)。

在內(nèi)核設(shè)備驅(qū)動(dòng)層,ALSA提供了alsa-driver,同時(shí)在應(yīng)用層,ALSA為咱們提供了alsa-lib,應(yīng)用程序只要調(diào)用alsa-lib提供的API,便可以完成對(duì)底層音頻硬件的控制。

alsa音頻,應(yīng)用編程,linux音頻子系統(tǒng),linux,Powered by 金山文檔

二.常用命令

aplay -l 顯示實(shí)際聲卡序號(hào)

alsa音頻,應(yīng)用編程,linux音頻子系統(tǒng),linux,Powered by 金山文檔

查看聲卡:


cat /proc/asound/cards

錄音:


arecord -D hw:0,0 -c 2 -r 44100 -f S16_LE test.wav

播放:


aplay -Dplughw:0,0 test.wav

打開耳機(jī)功能


amixer cset numid=1,iface=MIXER,name='Playback Path' 3
alsa音頻,應(yīng)用編程,linux音頻子系統(tǒng),linux,Powered by 金山文檔

打開MIC(麥克風(fēng))功能:


amixer cset numid=2,iface=MIXER,name='Capture MIC Path' 1
alsa音頻,應(yīng)用編程,linux音頻子系統(tǒng),linux,Powered by 金山文檔

三.音頻參數(shù)理解

聲道

單聲道:mono

雙聲道:stereo。最常見的類型,包含左聲道以及右聲道

采樣率

音頻采樣,是把聲音從模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)。采樣率,就是每秒對(duì)聲音進(jìn)行采集的次數(shù),同樣也是所得的數(shù)字信號(hào)的每秒樣本數(shù)

采樣越高,聲音的還原就越真實(shí)越自然,人對(duì)頻率的識(shí)別范圍是 20HZ - 22000HZ, 如果每秒鐘能對(duì)聲音做 22000 個(gè)采樣, 回放時(shí)就足可以滿足人耳的需求. 所以 22050 的采樣頻率是常用的, 根據(jù)奈奎斯特采樣定理44100Hz是不失真的情況下的采樣率, 超過48000的采樣對(duì)人耳已經(jīng)沒有意義。文章來源地址http://www.zghlxwxcb.cn/news/detail-597055.html

四.用戶空間打開PCM設(shè)備錄制聲音


#define ALSA_PCM_NEW_HW_PARAMS_API

#include <alsa/asoundlib.h>

int main() {
    long loops;
    int rc;
    int size;
    unsigned int val;
    int dir;
    char *buffer;
    snd_pcm_t *handle;
    snd_pcm_hw_params_t *params;
    snd_pcm_uframes_t frames;

    /*以錄制模式打開*/
    /* Open PCM device for recording (capture). */
    rc = snd_pcm_open( &handle, "default", SND_PCM_STREAM_CAPTURE, 0);
    if (rc < 0) {
        fprintf(stderr, "unable to open pcm device");
        exit(EXIT_FAILURE);
    }

    /*分配一個(gè)參數(shù)對(duì)象*/
    /* Allocate a hardware parameters object. */
    snd_pcm_hw_params_alloca(&params);
    /*初始化參數(shù)對(duì)象*/
    /* Fill it in with default values. */
    rc = snd_pcm_hw_params_any(handle, params);
    if (rc < 0) {
        printf("Err\n");
    }
    /* Set the desired hardware parameters. */

    /*交錯(cuò)模式*/
    /* Interleaved mode */
    rc = snd_pcm_hw_params_set_access(handle, params,
                          SND_PCM_ACCESS_RW_INTERLEAVED);
    if (rc < 0) {
        printf("Err\n");
    }
    /*PCM格式*/
    /* Signed 16-bit little-endian format */
    rc = snd_pcm_hw_params_set_format(handle, params,
                                  SND_PCM_FORMAT_S16_LE);
    if (rc < 0) {
        printf("Err\n");
    }
    /*設(shè)置通道數(shù)*/
    /* Two channels (stereo) */
    rc = snd_pcm_hw_params_set_channels(handle, params, 2);
    if (rc < 0) {
        printf("Err\n");
    }
    /*設(shè)置采樣率*/
    /* 44100 bits/second sampling rate (CD quality) */
    val = 44100;
    rc = snd_pcm_hw_params_set_rate_near(handle, params,
                                &val, &dir);
    if (rc < 0) {
        printf("Err\n");
    }
    /*沒周期的幀數(shù)*/
    /* Set period size to 32 frames. */
    frames = 32;
    rc = snd_pcm_hw_params_set_period_size_near(handle,
                            params, &frames, &dir);
    if (rc < 0) {
        printf("Err\n");
    }
    /* Write the parameters to the driver */
    rc = snd_pcm_hw_params(handle, params);
    if (rc < 0) {
        fprintf(stderr,
                "unable to set hw parameters: %s/n",
                snd_strerror(rc));
        exit(1);
    }

    /* Use a buffer large enough to hold one period */
    rc = snd_pcm_hw_params_get_period_size(params,
                                          &frames, &dir);
    if (rc < 0) {
        printf("Err\n");
    }
    size = frames * 4; /* 2 bytes/sample, 2 channels */
    buffer = (char *) malloc(size);

    /* We want to loop for 5 seconds */
    rc = snd_pcm_hw_params_get_period_time(params, &val, &dir);
    loops = 5000000 / val;

    while (loops > 0) {
        loops--;
        rc = snd_pcm_readi(handle, buffer, frames);
        if (rc == -EPIPE) {
          /* EPIPE means overrun */
          fprintf(stderr, "overrun occurred/n");
          //把PCM流置于PREPARED狀態(tài),這樣下次我們向該P(yáng)CM流中數(shù)據(jù)時(shí),它就能重新開始處理數(shù)據(jù)。
          snd_pcm_prepare(handle);
        } else if (rc < 0) {
          fprintf(stderr,
                  "error from read: %s/n",
                  snd_strerror(rc));
        } else if (rc != (int)frames) {
          fprintf(stderr, "short read, read %d frames/n", rc);
        }
        rc = write(1, buffer, size);
        if (rc != size)
          fprintf(stderr,
                  "short write: wrote %d bytes/n", rc);
    }

    //調(diào)用snd_pcm_drain把所有掛起沒有傳輸完的聲音樣本傳輸完全
    rc = snd_pcm_drain(handle);
    //關(guān)閉該音頻流,釋放之前動(dòng)態(tài)分配的緩沖區(qū),退出
    rc = snd_pcm_close(handle);
    free(buffer);

    return 0;
}

五.用戶空間打開PCM設(shè)備播放聲音


#define ALSA_PCM_NEW_HW_PARAMS_API

#include <alsa/asoundlib.h>

int main() {
    long loops;
    int rc;
    int size;
    snd_pcm_t *handle;
    snd_pcm_hw_params_t *params;
    unsigned int val;
    int dir;
    snd_pcm_uframes_t frames;
    char *buffer;

    /* Open PCM device for playback. */
    rc = snd_pcm_open(&handle, "default",
                    SND_PCM_STREAM_PLAYBACK, 0);
    if (rc < 0) {
        fprintf(stderr,
                "unable to open pcm device: %s/n",
                snd_strerror(rc));
        exit(1);
    }

    /*分配一個(gè)參數(shù)對(duì)象*/
    /* Allocate a hardware parameters object. */
    snd_pcm_hw_params_alloca(&params);

    /*初始化參數(shù)對(duì)象*/
    /* Fill it in with default values. */
    snd_pcm_hw_params_any(handle, params);

    /* Set the desired hardware parameters. */

    /*交錯(cuò)模式*/
    /* Interleaved mode */
    snd_pcm_hw_params_set_access(handle, params,
                      SND_PCM_ACCESS_RW_INTERLEAVED);

    /*設(shè)置PCM格式*/
    /* Signed 16-bit little-endian format */
    snd_pcm_hw_params_set_format(handle, params,
                              SND_PCM_FORMAT_S16_LE);

    /*設(shè)置通道數(shù)*/
    /* Two channels (stereo) */
    snd_pcm_hw_params_set_channels(handle, params, 2);

    /*設(shè)置采樣率*/
    /* 44100 bits/second sampling rate (CD quality) */
    val = 44100;
    snd_pcm_hw_params_set_rate_near(handle, params,
                                  &val, &dir);

    /* Set period size to 32 frames. */
    frames = 32;
    snd_pcm_hw_params_set_period_size_near(handle,
                              params, &frames, &dir);

    /* Write the parameters to the driver */
    rc = snd_pcm_hw_params(handle, params);
    if (rc < 0) {
        fprintf(stderr,
                "unable to set hw parameters: %s/n",
                snd_strerror(rc));
        exit(1);
    }

    /* Use a buffer large enough to hold one period */
    snd_pcm_hw_params_get_period_size(params, &frames, &dir);
    size = frames * 4; /* 2 bytes/sample, 2 channels */
    buffer = (char *) malloc(size);

    /* We want to loop for 5 seconds */
    snd_pcm_hw_params_get_period_time(params,
                                    &val, &dir);
    /* 5 seconds in microseconds divided by
    * period time */
    loops = 5000000 / val;

    while (loops > 0) {
        loops--;
        rc = read(0, buffer, size);
        if (rc == 0) {
            fprintf(stderr, "end of file on input/n");
            break;
        } else if (rc != size) {
            fprintf(stderr,
                  "short read: read %d bytes/n", rc);
        }
        rc = snd_pcm_writei(handle, buffer, frames);
        if (rc == -EPIPE) {
            /* EPIPE means underrun */
            fprintf(stderr, "underrun occurred/n");
            //把PCM流置于PREPARED狀態(tài),這樣下次我們向該P(yáng)CM流中數(shù)據(jù)時(shí),它就能重新開始處理數(shù)據(jù)。
            snd_pcm_prepare(handle); 
        } else if (rc < 0) {
            fprintf(stderr,
                "error from writei: %s/n",
            snd_strerror(rc));
        }  else if (rc != (int)frames) {
            fprintf(stderr,
                  "short write, write %d frames/n", rc);
        }
    }

    //調(diào)用snd_pcm_drain把所有掛起沒有傳輸完的聲音樣本傳輸完全
    snd_pcm_drain(handle);
    //關(guān)閉該音頻流,釋放之前動(dòng)態(tài)分配的緩沖區(qū),退出
    snd_pcm_close(handle);
    free(buffer);

  return 0;
}

到了這里,關(guān)于Linux alsa 音頻 錄制與播放的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【嵌入式Linux內(nèi)核驅(qū)動(dòng)】SPI子系統(tǒng) | 硬件原理 | 應(yīng)用編程 | 內(nèi)核驅(qū)動(dòng) | 總體框架

    【嵌入式Linux內(nèi)核驅(qū)動(dòng)】SPI子系統(tǒng) | 硬件原理 | 應(yīng)用編程 | 內(nèi)核驅(qū)動(dòng) | 總體框架

    1.1 SPI通信協(xié)議 SPI(Serial Peripheral Interface)是由Motorola公司開發(fā)的一種通用數(shù)據(jù)總線 四根通信線:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select) 同步,全雙工 支持總線掛載多設(shè)備(一主多從) 1.2 硬件連接 多NSS獨(dú)立片選方式 菊花

    2024年02月16日
    瀏覽(29)
  • 【嵌入式Linux內(nèi)核驅(qū)動(dòng)】05_IIC子系統(tǒng) | 硬件原理與常見面試問題 | 應(yīng)用編程 | 內(nèi)核驅(qū)動(dòng) | 總體框架

    【嵌入式Linux內(nèi)核驅(qū)動(dòng)】05_IIC子系統(tǒng) | 硬件原理與常見面試問題 | 應(yīng)用編程 | 內(nèi)核驅(qū)動(dòng) | 總體框架

    1.1 IIC 基礎(chǔ) IIC協(xié)議簡(jiǎn)介—學(xué)習(xí)筆記_iic標(biāo)準(zhǔn)協(xié)議_越吃越胖的黃的博客-CSDN博客 I2C(Inter-Integrated Circuit)是一種串行通信協(xié)議,用于連接微控制器、傳感器、存儲(chǔ)器和其他外設(shè)。 I2C使用兩條線(SDA和SCL)進(jìn)行通信,可以連接多個(gè)設(shè)備,每個(gè)設(shè)備都有一個(gè)唯一的地址。I2C總線上的

    2024年02月09日
    瀏覽(93)
  • Linux ALSA音頻工具aplay、arecord、amixer的使用方法

    Linux ALSA音頻工具aplay、arecord、amixer的使用方法

    ALSA 是Advanced Linux Sound Architecture的縮寫,先進(jìn)的Linux音頻架構(gòu),為L(zhǎng)inux操作系統(tǒng)提供音頻和MIDI功能。 aplay是播放命令。 -t, 指定輸出數(shù)據(jù)格式,默認(rèn)是wave格式,還支持raw,voc,au,后兩種格式不懂。 -D,指定播放設(shè)備,設(shè)備名的格式為hw:0,0,表示0號(hào)card的0號(hào)device。 -c,指定c

    2024年02月06日
    瀏覽(23)
  • 深入探索RK3588平臺(tái)開發(fā):解析Linux音頻調(diào)試與alsa-utils工具

    近期我深入研究了RK3588平臺(tái)的開發(fā),特別是在音頻領(lǐng)域的探索。在這個(gè)系列的講解中,我們將重點(diǎn)關(guān)注Linux音頻調(diào)試,并深入探討與之相關(guān)的alsa-utils工具。通過本文,我將為大家詳細(xì)介紹如何在RK3588平臺(tái)上進(jìn)行高效的音頻開發(fā),讓我們一同踏入這個(gè)令人興奮的領(lǐng)域。 RK3588是瑞

    2024年01月25日
    瀏覽(20)
  • Python音頻處理,錄制播放

    Simpleaudio:支持numpy數(shù)組播放 sounddevice 和 soundfile:支持播放和錄制包含音頻信號(hào)的 NumPy 數(shù)組 pydub:必須預(yù)先安裝至少一個(gè)來自(simpleaudio、pyaudio、ffplay 和 avplay)的音頻播放包??梢圆榭匆纛l信息(時(shí)長(zhǎng),分貝) pyaudio 和 wave:錄制和連續(xù)音頻流 moviepy:視頻音頻剪輯處理 讀取文

    2024年02月07日
    瀏覽(23)
  • Matlab實(shí)現(xiàn)音頻錄制和播放

    Matlab實(shí)現(xiàn)音頻錄制和播放 在Matlab中,我們可以使用內(nèi)置的函數(shù)輕松地對(duì)音頻進(jìn)行錄制和播放。本文將介紹如何使用Matlab實(shí)現(xiàn)音頻錄制和播放。 錄制音頻 首先,我們需要?jiǎng)?chuàng)建一個(gè)錄音對(duì)象并進(jìn)行設(shè)置。我們可以使用audiorecorder函數(shù)來創(chuàng)建錄音對(duì)象。我們可以通過設(shè)定采樣率、比

    2024年02月04日
    瀏覽(15)
  • Android錄制音頻并使用ijkplayer播放

    在使用AudioRecorder時(shí),需要了解采樣率、頻道配置和PCM音頻格式數(shù)據(jù)的相關(guān)知識(shí); PCM:音頻的原始數(shù)據(jù)(AudioFormat.ENCODING_PCM_16BIT、AudioFormat.ENCODING_PCM_8BIT、AudioFormat.ENCODING_PCM_FLOAT等等);不同的PCM代表不同的位深 采樣率:錄音設(shè)備在單位時(shí)間內(nèi)對(duì)模擬信號(hào)采樣的多少,采樣頻

    2023年04月09日
    瀏覽(24)
  • HarmonyOS實(shí)戰(zhàn)開發(fā)-錄音機(jī)、如何實(shí)現(xiàn)音頻錄制和播放的功能

    HarmonyOS實(shí)戰(zhàn)開發(fā)-錄音機(jī)、如何實(shí)現(xiàn)音頻錄制和播放的功能

    本示例使用audio相關(guān)接口實(shí)現(xiàn)音頻錄制和播放的功能,使用mediaLibrary實(shí)現(xiàn)音頻文件的管理。 相關(guān)概念: AudioRecorder:音頻錄制的主要工作是捕獲音頻信號(hào),完成音頻編碼并保存到文件中,幫助開發(fā)者輕松實(shí)現(xiàn)音頻錄制功能。它允許調(diào)用者指定音頻錄制的采樣率、聲道數(shù)、編碼

    2024年04月17日
    瀏覽(92)
  • 關(guān)于Linux系統(tǒng)中使用Kazam錄制的視頻在Win系統(tǒng)中無法播放的問題解決辦法

    關(guān)于Linux系統(tǒng)中使用Kazam錄制的視頻在Win系統(tǒng)中無法播放的問題解決辦法

    ? ? ? ? 今天在linux系統(tǒng)【ubuntu】中錄制了一段視頻,想要在win系統(tǒng)中進(jìn)行剪輯,但是發(fā)現(xiàn)無法打開,使用的是Kazam錄制的mp4格式視頻。 安裝方式——linux終端輸入: 使用方式——linux終端輸入: 使用Kazam錄制好了一段視頻,將mp4格式的視頻文件移動(dòng)到win系統(tǒng)中,打開時(shí)出現(xiàn)這

    2024年04月12日
    瀏覽(25)
  • FFmpeg編程錄制音頻(Mac OS)

    FFmpeg編程錄制音頻(Mac OS)

    之前我們使用FFmpeg命令行工具進(jìn)行了簡(jiǎn)單的音視頻操作,這次在Mac OS環(huán)境下編寫代碼實(shí)現(xiàn)簡(jiǎn)單的音頻錄制功能。 首先回顧一下Mac OS環(huán)境下簡(jiǎn)單的音頻錄制命令行實(shí)現(xiàn): 參數(shù)說明: ? -f avfoundation:指定輸入設(shè)備為 avfoundation,用于音頻錄制。 ? -i \\\":0\\\":指定錄制的音頻輸入源

    2024年01月22日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包