音频延时测试方法与实现
音频延时测试方法有以下几种
1、使用专业的测试设备,通过专业的音频测试仪器可以准确测量音频延时,如常见声学分析仪、信号发生器、声卡+Smaart(介绍测试延时方法链接:https://blog.csdn.net/weixin_48408892/article/details/127318158?spm=1001.2014.3001.5501)等等。
2、手动测量:可以通过在音频信号进入和离开设备时手动观察信号波形的变化,如从录音设备中录入一个短促的声音,同时再监听设备中观察声音的回放情况,以此来判断音频延时的大小。
3、使用软件测试:通过电脑或手机上的特殊软件来测试音频延时,如Voicemeeter Bannana。
无论用哪种方法都需要注意测试准确性,尽量减少外部干扰。同时,测试结果会受到设备类型,连接方法等因素影响,最好多次测试以获得更准确的数据。
还有通过自定义软件方式实现延时测试,比较2笔音频buf,记录时间戳,确认音频一致性后,计算时间差即延时。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/soundcard.h>
#define SAMPLE_RATE 44100 // 采样率 Hz
#define SAMPLE_SIZE 2 // 采样长度,2字节
#define CHANNELS 2 // 声道数
#define DEVICE_1 “/dev/dsp” // 音频设备路径 1
#define DEVICE_2 “/dev/dsp1” // 音频设备路径 2
// 计算两个时间戳之间的差值(微秒)
unsigned long diff_time(struct timeval *t1, struct timeval *t2)
{
return (t2->tv_sec - t1->tv_sec) * 1000000 + (t2->tv_usec - t1->tv_usec);
}
int main()
{
int fd1, fd2; // 文件描述符
int bufsize; // 缓冲区大小
char *buff1, *buff2; // 缓冲区指针
struct timeval t1, t2; // 时间戳
int i, j; // 循环变量
int chan=CHANNELS;
// 打开音频设备 1
fd1 = open(DEVICE_1 , O_RDONLY);
if (fd1 < 0) {
fprintf(stderr, “Failed to open %s: %s\n”, COREINPUTREC, strerror(errno));
exit(EXIT_FAILURE);
}
// 打开音频设备 2
fd2 = open(DEVICE_2, O_RDONLY);
if (fd2 < 0) {
fprintf(stderr, “Failed to open %s: %s\n”, COREOUTPUTREC, strerror(errno));
exit(EXIT_FAILURE);
}
// 设置音频设备参数
int format = AFMT_S16_LE;
if (ioctl(fd1, SNDCTL_DSP_SETFMT, &format) == -1) {
fprintf(stderr, “Failed to set format: %s\n”, strerror(errno));
exit(EXIT_FAILURE);
}
if (ioctl(fd1, SNDCTL_DSP_CHANNELS, &chan) == -1) {
fprintf(stderr, “Failed to set channels: %s\n”, strerror(errno));
exit(EXIT_FAILURE);
}
int speed = SAMPLE_RATE;
if (ioctl(fd1, SNDCTL_DSP_SPEED, &speed) == -1) {
fprintf(stderr, “Failed to set speed: %s\n”, strerror(errno));
exit(EXIT_FAILURE);
}
// 分配缓冲区
bufsize = chan * SAMPLE_SIZE * SAMPLE_RATE / 10; // 每次读取10毫秒的数据
buff1 = (char *)malloc(bufsize);
buff2 = (char *)malloc(bufsize);
// 循环读取数据,每次读取5次数据
for (i = 0; i < 5; i++) {
// 同时读取2个设备的数据
if (read(fd1, buff1, bufsize) == -1) {
fprintf(stderr, “Failed to read data: %s\n”, strerror(errno));
exit(EXIT_FAILURE);
}
if (read(fd2, buff2, bufsize) == -1) {
fprintf(stderr, “Failed to read data: %s\n”, strerror(errno));
exit(EXIT_FAILURE);
}
// 记录时间戳
gettimeofday(&t1, NULL);
// 循环查找延迟
for (j = 0; j < bufsize; j += SAMPLE_SIZE * CHANNELS) {
// 判断第一个缓冲区是否包含第二个缓冲区的数据
if (memcmp(buff1 + j, buff2, SAMPLE_SIZE * CHANNELS) == 0) {
// 计算延迟时间
gettimeofday(&t2, NULL);
printf(“延迟:%ld 微秒\n”, diff_time(&t1, &t2));
break;
}
}
}
// 释放缓冲区
free(buff1);
free(buff2);
// 关闭音频设备
close(fd1);
close(fd2);
return 0;
}
以上代码根据实际需要进行再调整(不适合超过10ms延时音频测量),如间隔10ms读取一次数据。。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
音频延时测试方法与实现
音频延时测试方法有以下几种 1、使用专业的测试设备,通过专业的音频测试仪器可以准确测量音频延时,如常见声学分析仪、信号发生器、声卡Smaart(介绍测试延时方法链接:https://blog.csdn.net/weixin_48408892/article/details/1273…...
![](https://www.ngui.cc/images/no-images.jpg)
在 Python 中管理机密的四种方法
我们生活在一个应用程序用于做任何事情的世界,无论是股票交易还是预订沙龙,但在幕后,连接是使用秘密完成的。必须适当管理机密,例如数据库密码、API 密钥、令牌等,以避免任何泄露。 管理机密的需求对任何组织都至关重…...
![](https://www.ngui.cc/images/no-images.jpg)
全国青少年信息素养大赛Python编程挑战赛初赛试题说明
Python 编程挑战赛初赛采用线上考试比赛形式,分为小学组和初中组。不同组别的考核重难点略有不同,考核内容主要是 Python 基础知识,共 30 题,均为单选题,具体考核如下: 小学组考核内容主要是 Python 基础知识,包括输入输出,变量,条件结构,计次循环和无限循环,海龟库…...
![](https://img-blog.csdnimg.cn/0fc52e80716941e39883a0f07379def2.gif)
无需魔法打开即用的 AI 工具集锦
作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...
![](https://img-blog.csdnimg.cn/img_convert/38111bed7d48ddec74973dc8a560b9b1.jpeg)
如何进行SEO站内优化,让你的网站更易被搜索引擎收录
我们了解了 SEO 的流程,知道了哪些元素对 SEO 的效果会产生关键影响,接下来,我们就该正式开始动手,打造一个让搜索引擎“爱不释手”的网站。 为了方便理解与记忆,我们将网站划分为几个模块,告诉你优化网站…...
![](https://img-blog.csdnimg.cn/72bd3cc0237a478ca73e8960c5d7ed58.png)
组件内部watch后切换数据报错Error in callback for watcher “xxxx“
报错信息: 报错代码: 百度了一下是因为这里写了箭头函数,导致this指向为父级作用域上下文,不是vue实例导致 修改为: progressData: {handler: function(newValue, oldValue) {this.setChartData(newValue)},deep: …...
![](https://img-blog.csdnimg.cn/img_convert/12cc64701b7d90b0147d887aa1cf05b7.png)
VMware ESXi 7.0 U3l macOS Unlocker OEM BIOS (标准版和厂商定制版)
VMware ESXi 7.0 U3l macOS Unlocker & OEM BIOS (标准版和厂商定制版) 提供标准版和 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科) 定制版镜像 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-oem/,查看最新版…...
![](https://img-blog.csdnimg.cn/1ee0f3cd67e34c419dee6962561abfea.png)
华为阿里版ChatGPT横空出世,谁的成效更好呢?
“你训练的大模型涌现了吗?”“还没有。好难受。”一时间成为了最近AI赛道玩家的一个爆热梗。 不管承不承认,相信每个玩家都不愿意输掉这场激烈的竞争。自百度成为国内“第一个吃螃蟹的人”后,又有两大中国科技巨头做好了准备——华为和阿里…...
![](https://www.ngui.cc/images/no-images.jpg)
【云原生之Docker实战】使用docker部署kooteam在线团队协作工具
【云原生之Docker实战】使用docker部署kooteam在线团队协作工具 一、kooteam介绍1.kooteam介绍2.kooteam的技术选型二、检查本地docker环境1.检查Docker版本2.检查Docker状态三、下载kooteam镜像四、部署kooteam文档管理系统1.创建安装目录2.创建mysql数据库3.新建kooteam数据库…...
![](https://www.ngui.cc/images/no-images.jpg)
ITSS认证是什么认证,itss资质认证
一、ITSS是什么 ITSS根据英文翻译信息技术服务标准(InformationTechnologyServiceStandards,简称ITSS),它既是一套成体系和综合配套的标准库,又是一套选择和提供IT服务的方法学,对企业IT服务而言࿰…...
![](https://img-blog.csdnimg.cn/04fa4675a5224f8e8fe7be574b611135.png)
FTP-----局域网内部远程桌面
此文包含详细的图文教程。有疑问评论区留言。博主第一时间解决。 目录 一、被远程桌面的电脑 1.开启远程权限 2.添加账户,有本地账户跳过这步 3.帐号隶属于 远程桌面 4.帐号隶属于 本地用户组 二、本地电脑连接远程桌面 前提条件: 1.两台电脑在…...
![](https://img-blog.csdnimg.cn/4bd81624e3bc4f95bcb8e805777eddec.png#pic_center)
Learning C++ No.18【STL No.8】
引言: 北京时间:2023/3/18/21:47,周末,不摆烂,但是欠钱终于还是遭报应了,导致坐牢7小时(上午3.5,下午3.5),难受,充分意识到行哥是那么的和蔼可亲…...
![](https://img-blog.csdnimg.cn/ee84c80280ff476cbcd7e6218fca7092.png)
pytorch搭建ResNet50实现鸟类识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍦 参考文章地址: 365天深度学习训练营-第J1周:ResNet-50算法实战与解析 🍖 作者:K同学啊 理论知识储备 深度残差网络ResNet(dee…...
![](https://img-blog.csdnimg.cn/a41638877cc6437995168433ebba65c8.png#pic_center)
Node.js -- npm与包
1.包 Node.js中的第三方模块又叫做包 就像电脑和计算机指的是相同的东西,第三方模块和包指的是同一概念,只不过叫法不同。 包的来源: 包是由第三方或者个人团队开发出来的,免费供个人使用。 国外有一家IT 公司,叫做n…...
![](https://img-blog.csdnimg.cn/74a9837ebcb444c686de2c274844d888.jpeg#pic_center)
二 、Locust自定义用户(场景)
二 、自定义用户(场景) 一个用户类代表了你系统中的一种用户/场景。当你做一个测试运行时,你指定你想模拟的并发用户的数量,Locust将为每个用户创建一个实例。你可以给这些类/实例添加任何你喜欢的属性,但有一些属性对…...
![](https://img-blog.csdnimg.cn/7d2aaf8d51d14a8e829095c8280a0398.png)
1~3年的测试工程师薪资陷入了瓶颈期,如何突破自己实现涨薪?
对于技术人员而言,职业规划一般分为两个方向:做技术、做管理。进入软件测试行业的新人都会从最基础的执行开始,然后是基本的功能测试。 随后大家会根据个人职业发展来进一步细化,有的走管理路线,成为主管、经理、项目…...
![](https://www.ngui.cc/images/no-images.jpg)
springboot项目前端ajax 07进阶优化,使用jQuery的ajax
使用官网https://jquery.com/ 在下载那里,选择Download the compressed, production jQuery 3.6.4(版本不一样),而后在打开的网页中,选择另存为,就下载好了js文件。 > function doAjax(){ …...
![](https://www.ngui.cc/images/no-images.jpg)
东数西存场景的探索与实践
“东数西算”是通过构建数据中心、云计算、大数据一体化的新型算力网络体系,将东部算力需求有序引导到西部,对优化数据中心建设布局,提升国家整体算力水平,促进绿色发展,扩大有效投资,具有重要意义。 在实…...
![](https://www.ngui.cc/images/no-images.jpg)
[图神经网络]PyTorch简单实现一个GCN
Pytorch自带一个PyG的图神经网络库,和构建卷积神经网络类似。不同于卷积神经网络仅需重构__init__( )和forward( )两个函数,PyTorch必须额外重构propagate( )和message( )函数。 一、环境构建 ①安装torch_geometric包。 pip install torch_geometric …...
![](https://img-blog.csdnimg.cn/d7c28023f39d435681d633efb9673696.png)
Elasticsearch(黑马)
初识elasticsearch . 安装elasticsearch 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的…...
![](https://www.ngui.cc/images/no-images.jpg)
oracle数据库调整字段类型
oracle数据库更改字段类型比较墨迹,因为如果该字段有值,是不允许直接更改字段类型的。另外oralce不支持在指定的某个字段后面新增一个字段,但是mysql数据可以向指定的字段后面新增一个字段。 mysql向指定字段后面新增一个字段: al…...
![](https://img-blog.csdnimg.cn/e2fe2f2649c54c608fe6c150837009c3.gif)
面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码)
面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码) 目录 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码) 1.面部表情识别方法 2.面部表情识别数据集 (1)表情识别数据集说明 (2&…...
![](https://img-blog.csdnimg.cn/img_convert/22f0529f04212c69cc4773cb607a6a5f.png)
赛效:如何在线给图片加水印
学会给图片加水印是一个非常实用的技能,可以让你的图片更具保护性和个性化。说到加水印,很多人不知道怎么操作。其实,给图片加水印非常简单,不用下载任何程序,在线就能完成。今天,我将介绍如何使用改图宝在…...
![](https://img-blog.csdnimg.cn/img_convert/d7f5fc50455382017acebbee5ed28fae.png)
动力节点杜老师Vue笔记——Vue程序初体验
一、Vue程序初体验 我们可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的,这些对我们编写Vue程序起不到太大的作用,更何况现在说了一些特点之后,我们也没有办法彻底理解它,因此我们可以先学会用,使…...
![](https://img-blog.csdnimg.cn/20974e3d29fa446dbaa3a8a4cc5213b8.png)
ajax上传图片存入到指定的文件夹并回显
html代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"js/jquery-2.1.0.js"></script> </head> <body> <form…...
![](https://www.ngui.cc/images/no-images.jpg)
cesium加载cesiumlab切的影像切片和标准TMS瓦片的区别
1.加载cesiumlab切的影像 var labImg viewer.scene.imageryLayers.addImageryProvider( new Cesium.UrlTemplateImageryProvider({url:http://192.168.1.25:8080/DOMtms/{z}/{x}/{y}.png,fileExtension : "png"})); 2.标准TMS瓦片 var labImg viewer.scene.im…...
![](https://img-blog.csdnimg.cn/5de72c299d62427ab9d7aa9e780c7798.png)
第二周P9-P22
文章目录第三章 系统总线3.1、总线的基本概念一、为什么要用总线二、什么是总线三、总线上信息的传送四、总线结构的计算机举例1、单总线结构框图2、面向CPU的双总线结构框图3、以存储器为中心的双总线结构图3.2、总线的分类1、片内总线2、系统总线3、通信走线3.3、总线特性及性…...
![](https://www.ngui.cc/images/no-images.jpg)
java反射
文章目录何为反射?反射的应用场景了解么?谈谈反射机制的优缺点优点缺点反射实战获取 Class 对象的四种方式1. 知道具体类的情况下可以使用TargetObject.class:2. 通过 Class.forName()传入类的全路径获取:3. 通过对象实例instance…...
![](https://www.ngui.cc/images/no-images.jpg)
307 Temporary Redirect 解决办法(临时重定向)
背景:java后台服务请求python服务端 java服务报错:Unexpected response status:307 python服务端报错:307 Temporary Redirect 解决:查了好久找不到什么原因,请求路径问题 请求url:http//:w…...
![](https://img-blog.csdnimg.cn/c0df94fdf0ef412d8da47086d594866a.png)
SpringBoot案例
SpringBoot案例5,案例5.1 创建工程5.2 代码拷贝5.3 配置文件5.4 静态资源目标 基于SpringBoot的完成SSM整合项目开发 5,案例 SpringBoot 到这就已经学习完毕,接下来我们将学习 SSM 时做的三大框架整合的案例用 SpringBoot 来实现一下。我们完…...
![](https://img-blog.csdnimg.cn/20201219180105757.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY4Njk0Mg==,size_16,color_FFFFFF,t_70#pic_center)
想做网站制作运营注册什么公司核实/上海seo网站排名优化公司
参考博客: 轮盘赌 https://blog.csdn.net/weixin_45274629/article/details/103480900 随机数产生1 随机数产生2 https://blog.csdn.net/weixin_43666945/article/details/90287775 一、实验目的 1.掌握遗传算法的基本原理和步骤。 2.熟练使…...
![](http://s3.51cto.com/wyfs02/M02/87/F3/wKioL1fk2DCBWN3XAAEpbvQJTIU071.jpg-wh_651x-s_214864585.jpg)
网站建设后期需要后期做的/百度手机助手网页
企业仍然很担心云计算安全风险,这是因为:转移数据到异地通常会导致数据丢失或者泄露,并且,很多公司仍在纠结是否决定放弃任何安全控制。 然而,最新调查可能表明安全已不再是企业考虑云计算部署的最大问题。只有24%的受…...
![](/images/no-images.jpg)
宁波营销型网站建设优化建站/上海百度公司总部
经常遇到这样的情况,要取得所有客户的最新交易记录,读取网站所有浏览者最后一次访问时间。一个客户只读取最新的一次记录,相同,大部分的人首先想到的就是排除所有记录,相同的只取一条。用distint,但是distint只能取到一…...
![](https://img-blog.csdnimg.cn/3ffac7632ff2433abc29c8c0c85b449b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ29kZVN0YXJy,size_20,color_FFFFFF,t_70,g_se,x_16)
网络优化公司网站代码/电商运营助理
文章目录1. 安装2. 插桩3. Quick Startcorpus基本使用输出多线程字典崩溃分析4. 用户手册如何查看结果如何配置(环境变量)多线程5. Using ASAN with AFL6. TipsFuzz优化7. More about AFLAFL原理8. Demo9. 其它参考资料官方文档:https://afl-…...
![](/images/no-images.jpg)
网站从哪些方面做优化/朋友圈信息流广告投放价格
今天在CSDN上看到一个帖子 :".net 4.0和4.5不同版本的Uri.ToString行为不同?", 调试.NET Framework 源代码发现,是这句代码起的作用 internal static bool ShouldUseLegacyV2Quirks{get{return UriParser.s_QuirksVersion < Uri…...
![](https://img-blog.csdnimg.cn/img_convert/501a97f7fce82c7bb4e86903fed026a2.png)
网盘做网站空间/网站做外链平台有哪些
系统集成是指通过结构化的综合布线系统和计算机网络技术,将各个分离的设备(如个人电脑)、功能和信息等集成到相互关联的、统一和协调的系统之中,使资源达到充分共享,实现集中、高效、便利的管理,以发挥整体…...