音视频开发—FFmpeg打开麦克风,采集音频数据

文章目录

    • 1.使用命令行实现采集PCM数据
    • 2.使用代码实现
    • 3.播放PCM
    • 4.PCM转换为WAV

1.使用命令行实现采集PCM数据

  1. 确保你的系统有FFmpeg安装。你可以通过在终端运行ffmpeg -version来检查是否已安装。

  2. 找出你的麦克风设备名。在Linux中,你可以使用arecord -l命令列出所有的音频录制设备。

  3. 使用FFmpeg录制音频。下面是一个基本的命令示例,它使用FFmpeg从麦克风捕获音频并将其保存为PCM格式的文件:

    ffmpeg -f alsa -i hw:0 -acodec pcm_s16le -ar 44100 -ac 2 output.pcm
    
    • -f alsa: 指定使用ALSA音频框架。
    • -i hw:0: 指定输入设备,hw:0根据你的arecord -l结果而定。
    • -acodec pcm_s16le: 指定音频编解码器为PCM 16位小端格式。
    • -ar 44100: 设置音频采样率为44100Hz。
    • -ac 2: 设置音频通道数为2(立体声)。
    • output.pcm: 指定输出文件名。
  4. 执行命令。复制并粘贴上述命令到你的终端中,根据需要修改输入设备。按下回车键开始录制,使用Ctrl+C停止录制。

确保你有足够的权限来访问麦克风设备。如果遇到权限问题,可能需要以root用户执行命令或修改用户权限设置。

2.使用代码实现

实现步骤:

1. 包含必要的库

代码首先通过extern "C"包含了FFmpeg库的头文件,保证了C++编译器能够正确地处理这些C语言编写的库。

2. 注册设备和初始化

使用avdevice_register_all()注册所有可用的设备和编解码器,以便FFmpeg能够识别和使用它们。然后,初始化一个AVPacket来存储从设备读取的数据。

3. 设置日志级别

通过av_log_set_level(AV_LOG_INFO)设置日志级别,这样FFmpeg在运行时会提供信息级别的日志输出,有助于调试和跟踪问题。

4. 打开音频输入设备

使用av_find_input_format("alsa")查找ALSA音频设备格式,并尝试用avformat_open_input()打开指定的音频设备(在这个例子中是"default",即系统默认音频设输入设备)。注:Linux是使用alsa,Windows上使用dshow,MacOs上使用avfoundation

5. 打开输出文件

创建并打开一个文件output.pcm用于写入捕获的音频数据。

6. 读取和保存音频数据

通过一个循环使用av_read_frame()从音频设备中读取数据,每次读取的数据被存储在之前初始化的AVPacket中。随后将这些数据写入到之前打开的输出文件中。循环继续执行,直到读取了5000个数据包或遇到读取错误。

7. 清理资源

在录制完成后,关闭输出文件,释放与音频设备关联的AVFormatContext,并关闭输入流。这一步骤确保所有打开的资源得到适当的管理和释放。

extern "C"
{
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>
#include <libavutil/audio_fifo.h>
#include <libavcodec/avcodec.h>
}
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{AVFormatContext *formatCtx = NULL;AVInputFormat *inputFormat;AVPacket packet;int ret;FILE *outputFile;// 注册所有设备avdevice_register_all();// 初始化数据包av_init_packet(&packet);// 设置日志级别av_log_set_level(AV_LOG_INFO);// 寻找 ALSA 音频设备inputFormat = av_find_input_format("alsa");if (!inputFormat){fprintf(stderr, "Cannot find input device\n");return -1;}// 打开音频设备if ((ret = avformat_open_input(&formatCtx, "default", inputFormat, NULL)) < 0){av_log(NULL, AV_LOG_ERROR, "Cannot open input device\n");return -1;}outputFile = fopen("output.pcm", "wb");if (!outputFile){fprintf(stderr, "Could not open output file\n");return -1;}int count = 0;// 读取数据包while ((ret = av_read_frame(formatCtx, &packet)) >= 0 && count++ <5000){// 在这里处理捕获的音频数据cout << "packet size is " << packet.size << endl;fwrite(packet.data, 1, packet.size, outputFile);  // Write raw audio dataav_packet_unref(&packet);}// Clean upfclose(outputFile);// 清理avformat_close_input(&formatCtx);avformat_free_context(formatCtx);return 0;
}

3.播放PCM

生成的PCM为纯二进制数据,没有关键信息头,如果想要播放这段数据,可以使用ffplay制定采样的参数来播放,在Linux中一般默认的参数为

  • -f alsa: 指定使用ALSA音频框架。
  • -i hw:0: 指定输入设备,hw:0根据你的arecord -l结果而定。
  • -acodec pcm_s16le: 指定音频编解码器为PCM 16位小端格式。
  • -ar 44100: 设置音频采样率为44100Hz。
  • -ac 2: 设置音频通道数为2(立体声)。
  • output.pcm: 指定输出文件名。

命令示例:

ffplay -f s16le -ar 48000 -ac 1 input.pcm

在这里插入图片描述

可以看出来ffplay 已经成功将二进制数据转换为模拟信号进行播放了

4.PCM转换为WAV

如果不清楚什么是PCM和WAV 请看这篇blog

可以使用ffmpeg 通过添加参数的方式将PCM数据转换为WAV格式,以供各种播放器进行播放。

ffmpeg -f s16le -ar 44100 -ac 2 -i output.pcm output.wav

在这里插入图片描述

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

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

相关文章

Java实战:从文件读出学生列表

本实战项目的目标是从文本文件中读取学生列表&#xff0c;并验证读取过程的正确性通过单元测试。 创建静态方法 实现一个名为readStudentsFromFile的静态方法&#xff0c;该方法接收一个文件路径作为参数。创建一个Student对象的列表&#xff0c;用于存储从文件中读取的学生信息…

使用PyCharm 开发工具创建工程

一. 简介 前面学习了 安装 python解释器。如何安装python的一种开发工具 PyCharm。 本文来简单学习一下&#xff0c;如何使用 PyCharm 开发工具创建一个简单的 python工程。 二. PyCharm 开发工具创建一个工程 1. 首先&#xff0c;首先打开PyCharm 开发工具。选择 创建一…

2024-6-1 石群电路-20

2024-6-1&#xff0c;星期六&#xff0c;18:24&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。已经到学校啦&#xff0c;本来打算今天休息一天不更了&#xff0c;但是觉得可以更新完再休息&#xff0c;没有这么累&#xff0c;哈哈哈哈&#xff0c;这就不得不说…

长安链使用Golang编写智能合约教程(二)

长安链2.3.0的go合约虚拟机和2.3.0以下的不兼容&#xff0c;编译的方式也有差异&#xff0c;所以在ide上做了区分。 教程三会写一些&#xff0c;其他比较常用SDK方法的解释和使用方法 教程一&#xff1a;&#xff08;长安链2.1.的版本的智能合约&#xff09; 教程三&#xff…

排序方法——堆排序

文章目录 一、堆的概念二、向下调整法三、堆排序建堆排序 四、 完整代码 一、堆的概念 堆的概念&#xff1a;一个按照完全二叉树的储存方式存储的一维数组我们称之为堆。   堆可以分为大堆和小堆&#xff1a;   大堆&#xff1a;二叉树中父亲节点的值都比自己的孩子节点的…

阿里云部署nodejs

目录 1、安装node.js 1-1 进入opt/software 1-2 下载node.js安装包 1-3 解压 2 配置环境变量 2-1 vim中配置环境变量 2-2 命令行中保存环境变量 2-3 检查安装版本 2-3 更换镜像 3、上传node.js项目 1-1 启动项目 1-2 配置对应的安全组 ​编辑 4、pm2启动多个node项…

运维开发.Kubernetes探针与应用

运维系列 Kubernetes探针与应用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263…

SQL—DQL(数据查询语言)之小结

一、引言 在前面我们已经学习完了所有的关于DQL&#xff08;数据查询语言&#xff09;的基础语法块部分&#xff0c;现在对DQL语句所涉及的语法&#xff0c;以及需要注意的事项做一个简单的总结。 二、DQL语句 1、基础查询 注意&#xff1a; 基础查询的语法是&#xff1a;SELE…

移动端性能测试(android/ios)

solox官网 https://github.com/smart-test-ti/SoloX solox简介 实时收集android/ios性能的工具&#xff0c;Android设备无需Root&#xff0c;iOS设备无需越狱。有效解决Android和iOS性能的测试和分析挑战。 solox安装 环境准备 python安装3.10以上的 python官网下载地址…

cocos creator 3.x实现手机虚拟操作杆

简介 在许多移动游戏中&#xff0c;虚拟操纵杆是一个重要的用户界面元素&#xff0c;用于控制角色或物体的移动。本文将介绍如何在Unity中实现虚拟操纵杆&#xff0c;提供了一段用于移动控制的代码。我们将讨论不同类型的虚拟操纵杆&#xff0c;如固定和跟随&#xff0c;以及如…

[AI OpenAI] 推出ChatGPT Edu

一种负担得起的解决方案&#xff0c;帮助大学将AI负责任地引入校园。 我们宣布推出ChatGPT Edu&#xff0c;这是一个专为大学设计的ChatGPT版本&#xff0c;旨在负责任地向学生、教职员工、研究人员和校园运营部署AI。ChatGPT Edu由GPT-4o提供支持&#xff0c;能够跨文本和视觉…

iPad里的图片如何导出 iPad的照片如何管理

我们的设备中充满了各种重要的照片和视频&#xff0c;特别是iPad&#xff0c;作为苹果公司的一款强大的平板电脑&#xff0c;它不仅能够捕捉生活中的精彩瞬间&#xff0c;还可以存储和展示我们珍贵的回忆。然而&#xff0c;随着照片数量的不断增加&#xff0c;有效地管理和导出…

IO流(1)

定义&#xff1a;存取和读取数据的解决方案 作用&#xff1a;用于读写数据&#xff08;本地文件、网络&#xff09; 分类&#xff1a; 一种是&#xff1a;输出流和输入流。 一种是&#xff1a;字节流和字符流。 字节流 字节流——FileOutputStream&#xff08;字节输出流&…

【常见的六大排序算法】插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

个人主页 创作不易&#xff0c;感谢大家的关注&#xff01; 文章目录 前言 &#x1f3a1;一、插入排序&#x1f332;二、希尔排序&#x1f389;三、选择排序&#x1f380;四、冒泡排序&#x1f698;五、堆排序&#x1f6f5;六、快速排序1. Hoare版本2. 挖坑法3. 前后指针法4. 非…

VLAN的概念及优势

文章目录 VLAN的概念及优势分割广播域 广播域vlanVLAN的优势 VLAN的种类静态VLAN动态VLAN 静态VLAN的配置静态VLAN范围配置静态VLAN的步骤 TRUNK介绍与配置三层交换机转发原理三层交换技术mls基于CEF的MLSCEF是一种基于拓补转发的模型 三层交换机的配置层 VLAN的概念及优势 分…

使用onnxruntime加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 LabelMe 工具进行标注&#xff0c;然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容…

C++的第一道门坎:类与对象(二)

目录 一.类中生成的默认成员函数详解 0.类的6个默认成员函数 1.构造函数 1.1概念 1.2特性 2.析构函数 2.1概念 2.2特性 3.拷贝构造函数 3.1概念 3.2特性 3.3拷贝构造的使用方法 4.运算符重载 5.赋值运算符重载 6.const修饰函数 7.取地址及const取地址操作符重载…

【漯河市人才交流中心_登录安全分析报告-Ajax泄漏滑动距离导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用

场景 Windows10中Docker的安装与遇到的那些坑: Windows10中Docker的安装与遇到的那些坑_在 docker.core.logging.httpclientexceptionintercept-CSDN博客 上面讲Docker Desktop在windows10非家庭版上的安装&#xff0c;如果是家庭版&#xff0c;则需要执行如下步骤。 注&am…

【python】OpenCV—Tracking(10.2)

文章目录 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三种背景分割器 K-Nearest&#xff1a;KNN Mixture of Gaussian&#xff08;MOG2&#xff09; Geometric Multigid&#xff08;GMG&#xff09; …