aplay 源码分析

article/2025/10/11 8:32:45
ffmpeg -formats 
ffmpeg -sample_fmts
ffmpeg -i ../english14.mp3 -ar 44100 -ac 2 -sample_fmt s16 -f wav english14.wav
ffmpeg -i ../english14.mp3 -ar 44100 -ac 2 -sample_fmt s16 -f s16le english14.pcm其中针对PCM个数的数据aplay正确的播放格式为:
aplay -r 48000 -c 2 english14.pcm 
下面都是错误的格式,声音不能正常识别
aplay -c 2 english14.pcm 
aplay -r 48000 english14.pcm 
aplay english14.pcm/home/suiyuan626/share/alsa-utils-1.2.6/aplay/aplay -v -t raw -f S16_LE -r 48000 -c 2 english14.pcm此处的aplay来自alsa-utils-1.2.6中源码编译
suiyuan626@ubuntu:~/share/ffmpeg/ffmpeg/doc/examples/data$ /home/suiyuan626/share/alsa-utils-1.2.6/aplay/aplay -v -f S16_LE -r 48000 -c 2 english14.pcm 
Playing raw data 'english14.pcm' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
ALSA <-> PulseAudio PCM I/O Plugin
Its setup is:stream       : PLAYBACKaccess       : RW_INTERLEAVEDformat       : S16_LEsubformat    : STDchannels     : 2rate         : 48000exact rate   : 48000 (48000/1)msbits       : 16buffer_size  : 24000period_size  : 6000period_time  : 125000tstamp_mode  : NONEtstamp_type  : GETTIMEOFDAYperiod_step  : 1avail_min    : 6000period_event : 0start_threshold  : 24000stop_threshold   : 24000silence_threshold: 0silence_size : 0boundary     : 6755399441055744000
^CAborted by signal Interrupt...
上面的命令中使用 -f -r -c 参数参数 -f ,其主要配置的是 根据用户给定的参数格式找出PCM.h中定义的采样个事,采样率和通道数case 'f':force_sample_format = 1;if (strcasecmp(optarg, "cd") == 0 || strcasecmp(optarg, "cdr") == 0) {if (strcasecmp(optarg, "cdr") == 0)rhwparams.format = SND_PCM_FORMAT_S16_BE;elserhwparams.format = file_type == FORMAT_AU ? SND_PCM_FORMAT_S16_BE : SND_PCM_FORMAT_S16_LE;rhwparams.rate = 44100;rhwparams.channels = 2;} else if (strcasecmp(optarg, "dat") == 0) {rhwparams.format = file_type == FORMAT_AU ? SND_PCM_FORMAT_S16_BE : SND_PCM_FORMAT_S16_LE;rhwparams.rate = 48000;rhwparams.channels = 2;} else {rhwparams.format = snd_pcm_format_value(optarg);if (rhwparams.format == SND_PCM_FORMAT_UNKNOWN) {error(_("wrong extended format '%s'"), optarg);prg_exit(EXIT_FAILURE);}}break;case 'r':tmp = parse_long(optarg, &err);if (err < 0) {error(_("invalid rate argument '%s'"), optarg);return 1;}if (tmp < 1000)tmp *= 1000;rhwparams.rate = tmp;if (tmp < 2000 || tmp > 768000) {error(_("bad speed value %i"), tmp);return 1;}breakcase 'c':rhwparams.channels = parse_long(optarg, &err);if (err < 0) {error(_("invalid channels argument '%s'"), optarg);return 1;}if (rhwparams.channels < 1 || rhwparams.channels > 256) {error(_("value %i for channels is invalid"), rhwparams.channels);return 1;}break;使用aplay要么record,要么播放文件,从stream的定义中可以知道
/** PCM stream (direction) */
typedef enum _snd_pcm_stream {/** Playback stream */SND_PCM_STREAM_PLAYBACK = 0,/** Capture stream */SND_PCM_STREAM_CAPTURE,SND_PCM_STREAM_LAST = SND_PCM_STREAM_CAPTURE
} snd_pcm_stream_t;static void header(int rtype, char *name)
{if (!quiet_mode) {if (! name)name = (stream == SND_PCM_STREAM_PLAYBACK) ? "stdout" : "stdin";fprintf(stderr, "%s %s '%s' : ",(stream == SND_PCM_STREAM_PLAYBACK) ? _("Playing") : _("Recording"),gettext(fmt_rec_table[rtype].what),name);fprintf(stderr, "%s, ", snd_pcm_format_description(hwparams.format));fprintf(stderr, _("Rate %d Hz, "), hwparams.rate);if (hwparams.channels == 1)fprintf(stderr, _("Mono"));else if (hwparams.channels == 2)fprintf(stderr, _("Stereo"));elsefprintf(stderr, _("Channels %i"), hwparams.channels);fprintf(stderr, "\n");}
}有没有设置-I参数,故执行playback()函数进行播放,同时我们可以添加参数 -t 来执行播放文件类型case 't':if (strcasecmp(optarg, "raw") == 0)file_type = FORMAT_RAW;else if (strcasecmp(optarg, "voc") == 0)file_type = FORMAT_VOC;else if (strcasecmp(optarg, "wav") == 0)file_type = FORMAT_WAVE;else if (strcasecmp(optarg, "au") == 0 || strcasecmp(optarg, "sparc") == 0)file_type = FORMAT_AU;else {error(_("unrecognized file format %s"), optarg);return 1;}break;static void playback(char *name)
{int loaded = 0;pbrec_count = LLONG_MAX;fdcount = 0;if (!name || !strcmp(name, "-")) {fd = fileno(stdin);name = "stdin";} else {init_stdin();if ((fd = open(name, O_RDONLY, 0)) == -1) {perror(name);prg_exit(EXIT_FAILURE);}}printf("name:%s,file_type:%d\n",name,file_type);switch(file_type) {case FORMAT_AU:playback_au(name, &loaded);break;case FORMAT_VOC:playback_voc(name, &loaded);break;case FORMAT_WAVE:playback_wave(name, &loaded);break;case FORMAT_RAW:playback_raw(name, &loaded);break;default:/* parse the file header */printf("file_type:%d\n",file_type);if (playback_au(name, &loaded) < 0 &&playback_voc(name, &loaded) < 0 &&playback_wave(name, &loaded) < 0)playback_raw(name, &loaded); /* should be raw data */break;}if (fd != fileno(stdin))close(fd);
}
其四个函数的额处理差异,主要是处理了文件头,比如播放的为PCM或者WAV格式的文件,而给定的参数-t au/voc 将不会进行播放。


http://chatgpt.dhexx.cn/article/nD6shCHA.shtml

相关文章

Qt,Linux: 播放声音(aplay)

Linux下&#xff0c;Qt开发&#xff0c;使用的电脑情况比较复杂&#xff0c;开发机是Intel cpu, 常用的验证机是飞腾&#xff08;arm&#xff09;cpu, 客户的目标机也是飞腾&#xff08;arm&#xff09;cpu, 但验证机和目标机上情况还不太一样。 需要用到播放声音的功能&#x…

ALSA音频架构 -- aplay播放流程分析

引言 上文ALSA音频架构 – snd_pcm_open函数分析已经获取了aplay中对应的播放API writei_func snd_pcm_writei;&#xff0c;本文将具体分析该API在哪里调用。 aplay处理数据流顺序图 代码详细分析 1、对参数进行解析&#xff0c;存储在全局变量hwparams&#xff0c;配置回调…

《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...

欢迎大家订阅《Autosar_MCAL高阶配置》专栏&#xff08;可以理解为是Autosar培训教程&#xff09;&#xff0c;献上常用的案例和配置方法。下方整理了相关博文的链接&#xff08;单击蓝色字体即可跳转&#xff09;&#xff0c;方便大家获取。 本专栏旨在&#xff1a; 扫除Auto…

Autosar MCAL-ADC配置PWM硬件触发采样

文章目录 前言ADC配置AdcGroupRequestSourceAdcGroupTriggSrcAdcHwExtTrigSelectAdcHwGatePinAdcGeneral-AdcHwTriggerApiAdcHwGateSignalAdcHwTrigSignalAdcHwTrigType GtmGtmConnections PWM实际使用总结 前言 在实际项目开发过程中&#xff0c;关于ADC采样&#xff0c;大部…

【学一点英飞凌】AutoSar-MCAL-Gtm-TOM模块

系列文章目录 【英飞凌学习笔记】TC3XX系列GTM模块的基本组成 文章目录 系列文章目录前言一、TOM模块是什么&#xff1f;二、TGC Sub-unit-Global Channel Control&#xff08;全局控制寄存器&#xff09;1、触发源2、触发方法3、注意要点4、TGC具体结构 总结 前言 提示&…

【MCAL_CANDriver】-1.5-图解CANFD如何兼容经典Classical CAN 2.0及其解决方案

点击返回「《Autosar_MCAL高阶配置》总目录」 目录 1 图解CANFD网络兼容Classical CAN 1.1 Classical CAN节点接收CANFD帧检出错误原因 1.2 CAN FD升级解决方案选择 2 CANFD对硬件设计要求 END 1 图解CANFD网络兼容Classical CAN 关于CANFD帧和Classical CAN帧结构差异&…

基于EB工具的TC3xx_MCAL配置开发01_WDG模块配置介绍

目录 1.概述2. WDG 配置2.1 General部分配置2.2 WdgSettingsConfig配置2.2.1 配置概述2.2.2 CPU WDG具体配置2.3 WdgDemEventParameterRefs3. WDG配置注意事项1.概述 本篇开始我们基于EB Tresos工具对英飞凌TC3xx系列MCU的MCAL开发进行介绍,结合项目经验对各MCAL外设的开发及…

MCAL 部分配置详情

对CSDN上的MCAL相关文章配置的记录 &#xff0c;持续更新 英飞凌: Port 模块 DIO&#xff1a; DIO可以看做是Port的使用接口&#xff0c;应用程序是不可以直接操作Port或Pin的&#xff0c;只能通过DIO。DIO的配置也比较简单&#xff0c;其实就是给Pin重新定义了一个名称。 …

Autosar MCAL-ICU输入捕获

文章目录 前言ICUIcuChannelIcuChannelIdIcuDefaultStartEdgeIcuMeasurementModeIcuSignalTypeIcuWakeupCapability子配置项IcuSignalMeasurementIcuSignalMeasurementPropertyIcuDutycycleBufferMarker IcuOptionalApisIcuGetDutyCycleValuesApiIcuSetModeApiIcuSignalMeasure…

Autosar MCAL-SPI配置及使用

文章目录 前言SPI协议基础Autosar SPI专有名词SpiDriverSpiChannelSpiChannelIdSpiChannelTypeSpiDataWidthSpiDefaultDataSpiEbMaxLengthSpiIbNBuffersSpiTransferStart SpiExternalDeviceSpiBaudrateSpiAutoCalcBaudParamsSpiCsIdentifierSpiCsPolaritySpiCsSelectionSpiData…

【AUTOSAR】 MCAL配置说明(二)----MCAL CAN模块配置

CAN CAN 通讯模块配置 主要的配置内容如下&#xff1a; can 模块的时钟源 can busoff, rx&#xff0c; tx的处理方式 映射pin 脚选择 波特率&#xff0c;采样点设置 邮箱配置&#xff0c;接收、发送报文邮箱&#xff0c;标准帧/扩展帧 CanClockConfiguration 配置CAN 模…

Autosar MCAL-ADC详解(二)-基于Tc27x的cfg软件

文章目录 前言AdcHwUnitAdcGroupChannel Emux SelectGroup Access Mode配置结果指针初始化结果访问读取buffer中的结果 Group Buffer MarkerGroup Conversion ModeGroup IdGroup PriorityGroup ReplacementGroup Request SourceAdcGroupTriggSrcAdcHwTrigSignalHw Gate SignalA…

TC397 EB MCAL开发从0开始系列 之 [1.0]-MCAL结构及Demo介绍

MCAL结构介绍MCAL结构MCAL模块 MCAL安装包说明DemoWorkspaceMclsar EB 环境配置EB环境安装EB新建工程 ->返回总目录-< MCAL结构介绍 MCAL结构 MCAL是 Microcontroller Abstraction Layer&#xff08;微控制器抽象层)的简写&#xff0c;是AuoSar架构中的概念&#xff0…

MCAL中ADC的配置

根据硬件资源分配以及各信号的应用对ADC模块进行配置,使能正确采集信号,并提供转换结果。 1. ADC模块接口配置 使能AdcHwTriggerApi:硬件触发ADC转换,根据硬件需求,部分Channel的转换是通过硬件信号触发转换,因此需要使能该API。 使能AdcEnableStartStopGroupApi:软件…

AurixDevStudio集成MCAL

这是Tricore MCAL安装路径 打开ADS新建一个AURIX Project 我手上的是龙邱的TC377最小系统, 就这样选 理解下第一个选项 新建好的基础工程是这个样子 删除掉Library文件夹, 因为我们这里要使用的MCAL而不是iLLD库(虽然它们实现的功能大体相同) 在工程里新建一个文件夹为Mca…

AUTOSAR 学习笔记(一):NXP S32K14X AUTOSAR MCAL 软件下载及安装

AUTOSAR学习笔记(一)&#xff1a;NXP S32K14X AUTOSAR MCAL 软件下载及安装 目录 AUTOSAR学习笔记(一)&#xff1a;NXP S32K14X AUTOSAR MCAL 软件下载及安装1.下载MCAL 软件2、下载 AUTOSAR EB tresos 软件3、下载AUTOSAR 4.0 OS4、安装 EB tresos5、安装 MCAL6、安装 AUTOSAR…

[ 搞一点AutoSar ]基于EB的MCAL-GPT全模块配置与解析

笔者搞了快一个星期的GPT的测试了&#xff0c;从配置到代码一遍又一遍的操作和阅读。觉得有必要把学习成功稍微总结一下了&#xff1b;学AUTOSAR最后还是得熟悉代码&#xff0c;毕竟AUTOSAR只是目的&#xff0c;而代码才是实现的手段。中间的逻辑关系看代码一目了然&#xff1b…

【MCAL_CANDriver】-1.3-FullCAN和BasicCAN的差异及配置使用

点击返回「《Autosar_MCAL高阶配置》总目录」 目录 1 什么是FullCAN和BasicCAN 1.1 FullCAN / Basic CAN HRH区别 1.2 FullCAN / Basic CAN HTH区别 1.3 FullCAN和Basic CAN存在的原因 1.4 FullCAN/Basic CAN HRH/HTH如何选择 2 如何配置FullCAN和BasicCAN 3 来自CAN Dr…

MCAL MCU Module详解和配置说明

关注“嵌入式软件实战派”回复“AUTOSAR”获得更多实战教程。 以下内容包含&#xff1a;基本概念、模块依赖、应用时序、参数配置实践讲解&#xff0c;以及ECUM对其引用等。 1. 基本概念 描述了MCU&#xff08;Microcontroller Unit&#xff09; 驱动程序的功能和 API。 MCU 驱…

搞一点AutoSar--MCAL SPI-1

整理了一点SPI的资料 目录 1、SPI模块简介2、SPI驱动模块API的使用方法3、SPI通信主要概念4、选择SPI通道缓存&#xff08;Buffer&#xff09;位置5、SPI驱动模块API调用流程 1、SPI模块简介 图1 MCAL 4个驱动组与微控制器内核和外设的映射关系SPI属于MCAL模块中的通信驱动组&…