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

news2024/9/20 19:33:36

文章目录

    • 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 data
        av_packet_unref(&packet);
    }

 // Clean up
    fclose(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.coloradmin.cn/o/1703202.html

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

相关文章

内存泄漏案例分享2-Fragment的内存泄漏

案例2——hprof文件显示出Fragment内存泄漏 接下来我们来看fragment内存泄漏&#xff0c;老规矩查看fields和references&#xff0c;确保它符合内存泄漏的情形&#xff1b;我们点击jump to source查看泄漏的位置 Fragment#MZBannerView#内部类Runnbale /*** Banner 切换时间间…

添加、修改和删除字典元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 由于字典是可变序列&#xff0c;所以可以随时在字典中添加“键-值对”。向字典中添加元素的语法格式如下&#xff1a; dictionary[key] value 参数…

有哪些永久免费的进销存管理软件?

我明白许多中小企业在寻求进销存系统时&#xff0c;希望能找到一款完全免费的解决方案&#xff0c;以减轻经济压力。这种心态非常正常&#xff0c;毕竟成本是任何企业都需要仔细考虑的因素。然而&#xff0c;我要强调的是&#xff0c;市场上那些声称“完全免费”的进销存系统&a…

【记录】初次本地搭建的模型-MiniCPM 2B

前言 查阅众多开源大模型后&#xff0c;打算动手尝试搭建端侧模型&#xff0c;看看效果。选中MiniCPM主要是因为参数小&#xff0c;同时中文支持相对较好。 首先对按照官网提供的demo进行了尝试&#xff0c;然后在colab中完成了一个webui程序并测试&#xff0c;最后通过docker环…

MySQL(二)基本SQL语句以及基本函数应用

1、基本SQL语句 MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串&#xff08;字符&#xff09;类型。 - 函数应用在sql语句中 -- 临时表 select now() from dual;-- 数…

分布式一致性必备:一文读懂Raft算法

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好!我是小米,一个热爱分享技术的29岁程序员哥哥。今天我们来聊聊分布式系统中的一个重要算法——Raft。这个算法专门用于管理分布式系统中…

学习100个Unity Shader (18) --- 几何着色器(Geometry Shader)

文章目录 概述编写格式举例应用举例&#xff08;用预制体球的每个顶点画一个立方体&#xff09;参考 概述 vertex shader --> [geometry shader] --> fragment shader。[]: 可选阶段。输入图元 —> geometry shader —> 其他图元 编写格式 [maxcertexcount(N)] …

会声会影2024旗舰版神器,让你的视频秒变大片,小白也能轻松上手

在数字时代&#xff0c;视频已经成为了人们表达自我、记录生活的重要方式。无论是旅行中的美景&#xff0c;还是生活中的点滴瞬间&#xff0c;我们都渴望能够用镜头捕捉下来&#xff0c;并通过精心剪辑&#xff0c;将这些美好的画面永远珍藏。然而&#xff0c;对于大多数人来说…

百川大模型拿下国产第一,AI助手「百小应」上线,比Kimi强不少

最近几天&#xff0c;国内 AI 创业公司正在连续刷新大模型的能力上限。 5 月 22 日&#xff0c;百川智能发布最新一代基座大模型 Baichuan 4&#xff0c;同时推出了首款 AI 助手「百小应」。 相较 1 月份发布的 Baichuan 3&#xff0c;新一代模型在各项能力上均有大幅提升&am…

OrangePi AIpro评测 - 基础操作篇

0. 环境 ●OrangePi AIpro ●win10笔记本 ●路由器 准备下win10电脑、路由器&#xff0c;这些板卡通常是在网络正常的环境下才方便测试。 还要准备OrangePi AIpro的官方资料&#xff1a; http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-suppo…

牛客NC164 最长上升子序列(二)【困难 贪心+二分 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4af96fa010c44638a7e112abf65f7237 思路 贪心二分 所谓贪心&#xff0c;就是往死里贪&#xff0c;所以对于最大上升子序列&#xff0c;结尾元素越小&#xff0c;越有利于后面接上其他的数&#xff0c;也就可能变…

麒麟系统firewalld限制指定的ip访问指定的端口

先开放所有端口 然后第三个限制会把第四个第五个拦住 so 这个是错误案例 accecpt 接受 reject 拒绝

为什么短剧突然爆火?背后究竟谁在为流量买单?

为什么短剧突然爆火&#xff1f;背后究竟谁在为流量买单&#xff1f; 文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 今年很多朋友交流的更多的商业热门话题就是“短剧”&#xff0c;目前我国拥有超10亿的短视频用户&a…

利用ESP32(Arduino IDE)向匿名上位机发送欧拉角

文章目录 一. 匿名上位机介绍二. 匿名协议说明1. 匿名协议官方说明文档2. 协议说明 三. 向匿名上位机发送数据(基于Arduino IDE的esp32)四. 运行效果 一. 匿名上位机介绍 匿名上位机官方介绍视频 匿名上位机官方下载 二. 匿名协议说明 1. 匿名协议官方说明文档 官方对于协…

2024年短视频评论区批量爬取采集软件

一、背景说明 前言 评论区引流&#xff0c;顾名思义&#xff0c;是通过在视频下方进行留言评论、回复评论&#xff0c;吸引用户的注意&#xff0c;从而和你的账号产生互动、交易。比如&#xff0c;在一个关于健身的视频下方&#xff0c;留言分享自己的健身经验或者提出问题。…

西门子S7-1200加入MRP 环网用法

MRP&#xff08;介质冗余&#xff09;功能概述 SIMATIC 设备采用标准的冗余机制为 MRP&#xff08;介质冗余协议&#xff09;&#xff0c;符合 IEC62439-2 标准&#xff0c;典型重新组态时间为 200ms&#xff0c;每个环网最多支持 50个设备。​博途TIA/WINCC社区VX群 ​博途T…

springboot+vue+mybatis基于java web的公益网站的设计与实现+jsp+PPT+论文+讲解+售后

现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本公益网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#xff0c;使…

docker搭建gitlab及默认密码修改及配置修改

推荐官方文档 https://docs.gitlab.com/17.0/ee/install/docker.html 我使用的是docker run的方式&#xff0c;官方文档后面有docker-compose、swarm、k8s的部署文档 版本说明 1&#xff1a;可以部署gitlab-ce社区版和gitlab-ee企业版&#xff0c;然后&#xff0c;鉴于是个人…

上海AI lab发布MathBench,GPT-4o的数学能力有多强?

大模型数学能力哪家强&#xff1f; 最近&#xff0c;上海AI lab构建了一个全面的多语言数学基准——MathBench。与现有的基准不同的是&#xff0c;MathBench涵盖从小学、初中、高中、大学不同难度&#xff0c;从基础算术题到高阶微积分、统计学、概率论等丰富类别的数学题目&a…

基于51单片机的函数发生器设计

一.硬件方案 此函数信号发生器是基于单片机AT89C51设计而成的&#xff0c;能够产生频率范围在0Hz—535Hz的锯齿波、正弦波、三角波、矩形波四种波形&#xff0c;并且能够通过液晶屏1602显示各自的波形类型以及频率数值。电路主要由51单片机最小系统DA0832模数转换模块运放模块…