aplay 源码分析

aplay 源码分析ffmpeg formatsffmpe sample fmtsffmpeg i english14 mp3 ar44100 ac2 sample fmts16 fwavenglish1 wavffmpeg i english14 mp3 ar44100 ac2 sample fmts16 fs16leenglis pcm 其中针对 PCM 个数的数据 aplay 正确的播放格式为 aplay r48000 c2english1

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 : PLAYBACK access : RW_INTERLEAVED format : S16_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 16 buffer_size : 24000 period_size : 6000 period_time :  tstamp_mode : NONE tstamp_type : GETTIMEOFDAY period_step : 1 avail_min : 6000 period_event : 0 start_threshold : 24000 stop_threshold : 24000 silence_threshold: 0 silence_size : 0 boundary :  ^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; else rhwparams.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 > ) { error(_("bad speed value %i"), tmp); return 1; } break case '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")); else fprintf(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 将不会进行播放。

aplay 源码分析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204623.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午7:54
下一篇 2026年3月19日 下午7:55


相关推荐

  • 服务熔断的实现

    服务熔断的实现0 服务熔断的实现思路 引入 hystrix 依赖 并开启熔断器 断路器 模拟降级方法 进行调用测试 1 项目中引入 hystrix 依赖 引入 hystrix dependency groupId org springframew cloud groupId artifactId spring cloud starter netflix hystrix artifactId dependency

    2026年3月26日
    2
  • 华为手机手机与计算机传输,华为手机怎么和电脑进行互联传输文件

    华为手机手机与计算机传输,华为手机怎么和电脑进行互联传输文件HuaweiShare 支持将手机中的照片 文件分享给电脑 还同时支持在电脑端编辑手机中的照片 无需通过 USB 线连接 HuaweiShare 帮你轻松完成 1 手机 电脑都接入同一 WLAN 网络 如图中的 Home wifi 2 手机打开 HuaweiShare 3 手机通知面板中 长按 HuaweiShare 图标 在弹出的页面开启 HuaweiShare 和 共享至电脑 并记住 电脑

    2026年3月18日
    1
  • 解决Discuz安装时报错“该函数需要 php.ini 中 allow_url_fopen 选项开启…”

    解决Discuz安装时报错“该函数需要 php.ini 中 allow_url_fopen 选项开启…”开启php的fsockopen函数——解决DZ论坛安装问题“该函数需要php.ini中allow_url_fopen选项开启。请联系空间商,确定开启了此项功能在安装dz论坛时遇到因为fsockopen()函数问题无法进入下一步,安装错误显示“该函数需要php.ini中allow_url_fopen选项开启。请联系空间商,确定开启了此项功能”,经过分析,总结了3个解决这个…

    2022年7月21日
    18
  • altas, ajax应用

    altas, ajax应用nbsp ajax 应该在今年业界火了一把 微软也不会放弃 altas 是基于 ASP NET 的 ajax 框架 接下来 介绍一下 altas 的简单应用 以后可能会多做一下这方面的应用 下面的是一个 ajax 原理的一个 DEMO 比较简单 页面每隔 5 秒 刷新 Receive asp 的内容 并显示在当前页面中 这里先开个头 http www w3 org TR xhtml1 DTD xhtml1 tr

    2026年3月17日
    2
  • 基于matlab的图像处理案例教程_matlab gui图像处理

    基于matlab的图像处理案例教程_matlab gui图像处理一、imfinfo函数——查看图像文件信息,注意参数是文件路径和文件名,不是图像对应的矩阵。imfinfo(‘C:\Users\zhulf\Desktop\1.jpg’)ans=Filename:’C:\Users\zhulf\Desktop\1.jpg’FileModDate:’19-Apr-201508:40:54′

    2022年10月4日
    4
  • 数组和链表的区别和优缺点总结!

    数组和链表的区别和优缺点总结!数组和链表是两种基本的数据结构,他们在内存存储上的表现不一样,所以也有各自的特点。链表中各结点在内存中的存放位置是任意的。 链表与数组的主要区别(1)数组的元素个数是固定的,而组成链表的结点个数可按需要增减;(2)数组元素的存诸单元在数组定义时分配,链表结点的存储单元在程序执行时动态向系统申请:(3)数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系…

    2022年6月16日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号