音视频之使用sonic.cpp实现音频倍速播放功能

sonic.cpp 是一个音频处理库,可以实现倍速播放。
如果单纯通过修改pcm的采样率来实现音频倍速播放的话,就会出现声音变调的情况。

以下是通过采集windows 虚拟声卡获取到的音频数据,
我的声卡采样率是44100次/秒,audio_buffer_size 设置为100,这样每次采样的样本数是4410次,相当于采集100ms的pcm数据。

AVFormatContext* avFormatCxt = NULL;
AVDictionary* options = NULL;
char* devicename = const_cast<char*>("audio=Line 1 (Virtual Audio Cable)");
string devicename_utf8_str = GbkToUtf8(devicename);
char* devicename_utf8 = const_cast<char*>(devicename_utf8_str.c_str());
avdevice_register_all();
AVInputFormat* inFormat = av_find_input_format("dshow");
av_dict_set(&options, "audio_buffer_size", "100", 0);
int ret = avformat_open_input(&avFormatCxt, devicename_utf8, inFormat, &options);
AVPacket av_packet;
FILE* out_file_ptr2 = fopen(".\\speed15x.pcm", "wb+");// 初始化部分:先创建一个流
sonicStream tempoStream_;
// 参数为采样率和声道数
tempoStream_ = sonicCreateStream(44100, 2); //采样率与通道数
float speed = 1.5;//1.5倍速
sonicSetSpeed(tempoStream_, speed);
sonicSetPitch(tempoStream_, 1.0);
sonicSetRate(tempoStream_, 1.0);uint8_t** src_data;
int src_linesize = 0;
// 88200/2/2
// 给src_data 分配空间 创建输入缓冲区
av_samples_alloc_array_and_samples(&src_data, // 输出缓冲区地址&src_linesize, // 缓冲区大小2,             // 通道数2 4410,         // 采样个数    多少算一个音频帧呢?AV_SAMPLE_FMT_S16, // 采样格式 0);while (av_read_frame(avFormatCxt, &av_packet) == 0) {memcpy((void *)src_data[0], (void *)av_packet.data, av_packet.size);ret = sonicWriteShortToStream(tempoStream_, (short*)src_data[0], 4410); //4410为每次采样的样本数量int numSamples = 4410 / speed;int new_buffer_size = 0;if (ret) {// 从流中读取处理好的数据new_buffer_size = sonicReadShortFromStream(tempoStream_, (short*)src_data[0], numSamples); //返回的是采样数}fwrite(src_data[0], new_buffer_size * 2 * 2, 1, out_file_ptr2);// av_packet_unref(&av_packet); //释放内存
}
fclose(out_file_ptr2);
sonicDestroyStream(tempoStream_);
// 释放输入输出缓冲区
if (src_data) {av_freep(&src_data[0]);
}
av_freep(&src_data);
avformat_close_input(&avFormatCxt);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SecurtCRT连接服务器自动断开

mac Terminal-->Anti-idle-->send protocol NO-OP 60勾中

位图原理、代码实现及应用实例

位图的原理&#xff1a; 在位图中采用比特位表示对应的元素存在或者不存在 0&#xff1a;不存在 1&#xff1a;存在例如一个int整数有32个比特位可以表示0-31个整数。 再举一个例子 存入的数字为8988 首先&#xff1a; 8988/32 280 其次&#xff1a; 8988%32 28 再来一个例…

通过修改注册表,实现网页链接中的私有协议启用本地exe进程

私有协议为 coffeeclass://xxxxxx.mp4 注册表如下 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\coffeeclass] "coffeeClass Protocol" "URL Protocol"""[HKEY_CLASSES_ROOT\coffeeclass\DefaultIcon] "D:\\Program Files (x…

布隆过滤器的原理、应用场景和源码分析实现

原理 布隆过滤器数据结构 布隆过滤器是一个 bit 向量或者说 bit 数组&#xff0c;长这样&#xff1a; 如果我们要映射一个值到布隆过滤器中&#xff0c;我们需要使用多个不同的哈希函数生成多个哈希值&#xff0c;并对每个生成的哈希值指向的 bit 位置 1。 例如针对值 “baid…

判断一个数字是否存在于某一个数据之中

哈希表 这个没啥说的&#xff0c;后面补充 位图 https://blog.csdn.net/csdn_kou/article/details/95337121 布隆过滤器 哈希表位图 https://blog.csdn.net/csdn_kou/article/details/95371085

根据语句自动生成正则表达式

自动生成 http://www.txt2re.com 速查手册 https://www.jb51.net/shouce/jquery/regexp.html

免密登录堡垒机和服务器

免密登录堡垒机 安装oathtool和sshpass 这两个文件安装比较耗费时间&#xff01; brew install oath-toolkit brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb免密登录堡垒机 书写shell脚本 #!/usr/bin/env bash …

mysql建表sql

mysql建表 文章目录mysql建表mysql学生表插入数据建表&#xff0c;学生和idgroup byinner joinmysql学生表 CREATE TABLE courses ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 自增id, student VARCHAR(255) DEFAULT NULL COMMENT 学生, class VARCHAR(255) DEFAU…

Effective C++学习第一天

1&#xff1a;区分C中的术语声明、定义、初始化的概念声明&#xff08;declaration&#xff09;&#xff1a;告诉编译器某个东西的名称和类型&#xff0c;但略去其他细节&#xff08;可以出现多次&#xff0c;编译器不分配内存&#xff09;。定义&#xff08;definition&#x…

Redis运维和开发学习笔记(1) Redis简介

文章目录Redis的特性速度快持久化多种数据结构主从复制高可用和分布式典型的应用场景Redis启动和可执行文件Redis可执行文件说明启动方式验证redisredis常用配置redis数据结构和内部编码Redis是单线程&#xff0c;不会同时执行两条命令哈希慢查询pipelineRedis的特性 速度快 …

Effective C++学习第二天

1&#xff1a;确保对象被使用前已先被初始化&#xff0c;读取未初始化的值会造成不明确的行为&#xff0c;可能导致程序终止运行或者其他不可预期的现象&#xff1b;在C中&#xff0c;当你使用C part of C(C中C语言部分的内容&#xff09;且初始化可能导致运行期成本&#xff0…

Redis运维和开发学习笔记(3)redis搭建集群

Redis运维和开发学习笔记(3)redis搭建集群 文章目录Redis运维和开发学习笔记(3)redis搭建集群Redis集群搭建Redis集群搭建 cp /etc/redis.d/redistest_7001.conf /etc/redis.d/redistest_XXXX.conf :%s/7001/xxxx/g 配置文件内容&#xff1a;cluster-enabled yes ############…

Effective C++学习第三天

1&#xff1a;为多态基类声明virtual析构函数当我们创建一个base class指针指向新生成的derived class时&#xff0c;当删除基类指针时&#xff0c;如果base class是一个non-virtual析构函数时&#xff0c;实际执行的结果通常是derived class中的base成分被销毁&#xff0c;der…

linux创建指定大小的文件

一、生成文件大小和实际占空间大小一样的文件 dd if/dev/zero ofname.file bs1M count1 文件名称name.file bs1M表示每一次读写1M数据&#xff0c;count50表示读写 50次&#xff0c;这样就指定了生成文件的大小为50M。 二、生成文件大小固定&#xff0c;但实际不占空间命令 …

Effective C++学习第四天

条款11&#xff1a;在operator中处理自我赋值的现象虽然我们在平时可能不会出现显示自我赋值的现象&#xff0c;当加入指针或者引用时&#xff0c;可能会出现不同的指针或引用指向同一对象&#xff08;对象的不同别名&#xff09;&#xff0c;这时候我们就得考虑对象是否是同一…

Effective C++学习第五天

条款14&#xff1a;在资源管理类中小心copy行为当我们深入理解“资源取得时机是初始化时机&#xff08;RAII&#xff09;”概念&#xff0c;并以此作为“资源管理类”的核心时&#xff0c;我们可能会遇到将RAII对象复制的情况&#xff0c;一般有两种情况处理这个现象&#xff1…

Redis运维和开发学习笔记(2) redis持久化

Redis运维和开发学习笔记(2) redis持久化 文章目录Redis运维和开发学习笔记(2) redis持久化持久化持久化方式一:RDB触发~~的三种~~方式1. save命令2. bgsave配置触发机制RDB 总结持久化方式二:AOFAOF的三种策略三种策略的优缺点AOF重写机制持久化 redis将所有数据保存在内存中&…

Effective C++学习第六天

条款18&#xff1a;让接口更容易被正确使用&#xff0c;不易被误用设计接口的原则&#xff1a;正确性、高效性、封装性、维护性、延展性以及协议的一致性&#xff1b;设计原则&#xff1a;1&#xff09;导入新类型来预防很多客户端的错误&#xff0c;多使用系统类型&#xff08…

Redis运维和开发学习笔记(4) Redis参数意义

Redis运维和开发学习笔记(4) Redis参数意义 文章目录Redis运维和开发学习笔记(4) Redis参数意义参数意义参数意义 Client连接 问题 id567800790 addr10.18.17.217:37310 fd1572 name age2039114 idle2034860 flagsN db0 sub0 psub0 multi-1 qbuf0 qbuf-free0 obl0 oll0 omem0 …

Effective C++学习第七天

条款23&#xff1a;宁以non-memeber、non-friend替换member函数non-member/non-friend可以给对象带来更大的封装性&#xff0c;从两个方面来考虑&#xff1a;1&#xff09;考虑封装&#xff0c;越多东西被封装&#xff0c;它们就越不可见&#xff0c;就越少人看到它&#xff0c…