音视频基础(二)Ffmpeg采集音频数据
一、ffmpeg采集音频流程:
打开输入设备 -> 获取数据包 -> 输出文件
二、ffmpeg采集音频步骤:
注册设备 -> 设置采集方式 -> 打开音频设备
三、开发准备(MAC环境)
(1)安装ffmpeg
方法1 通过homebrew
点击查看代码
brew install ffmpeg
方法2 通过源代码编译
访问HTTP://FFMPEG.ORG/DOWNLOAD.HTML,点击DOWNLOAD SNAPSHOT,下载源码
安装sdl2
点击查看代码
brew install sdl2
点击查看代码
./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --enable-shared --enable-sdl2
点击查看代码
make -j 4
点击查看代码
make install
(3)建立C项目,引入ffmpeg头文件
四、代码开发
点击查看代码
#include <stdio.h>
#include <unistd.h>
#include "libavdevice/avdevice.h"
#include "libavformat/avformat.h"
#include "libavutil/avutil.h"
#include "libavcodec/avcodec.h"
int main() {
// 打开设备状态码,0-成功,否则失败
int ret = 0;
char errors[1024] = {0, };
// 上下文相关
AVFormatContext *fmt_ctx = NULL;
AVDictionary *options = NULL;
// 包相关
int count = 0;
AVPacket pkt;
// 设置日志级别
av_log_set_level(AV_LOG_DEBUG);
// 先传入视频设备编号,再传入音频设备编号
// [[video device]:[audit device]]
char *devicename = ":0";
// 注册音频设备
avdevice_register_all();
// 获取输入数据格式
AVInputFormat *iformat = av_find_input_format("avfoundation");
if((ret = avformat_open_input(&fmt_ctx, devicename, iformat, &options)) < 0){
av_strerror(ret, errors, 1024);
printf(stderr, "Failed to open audio device, [%d]%s\n", ret, errors);
return 1;
}
av_init_packet(&pkt);
// 定义录制文件保存路径
char *out_path = "/Users/apple/tempPath/audio.pcm";
// 打开文件
FILE *out_file = fopen(out_path, "wb+");
while(count < 500){
ret = av_read_frame(fmt_ctx, &pkt);
if(ret == 1 || ret == -35) {
usleep(10000);
continue;
}
if(ret < 0){
break;
}
count ++;
av_log(NULL, AV_LOG_INFO, "pkt size is %d(%p), count is %d \n",
pkt.size, pkt.data, count);
// 将数据以二进制形式写入文件
fwrite(pkt.data, pkt.size, 1, out_file);
// 从缓冲区写入文件
fflush(out_file);
// 释放pkg指针
av_packet_unref(&pkt);
}
// 关闭文件
fclose(out_file);
// 关闭设备,释放上下文指针
avformat_close_input(&fmt_ctx);
av_log(NULL, AV_LOG_DEBUG, "finish wangjiangjiang\n");
return 0;
}
五、ffplay播放PCM
点击查看代码
ffplay -ar 48000 -ac 1 -f f32le /Users/apple/tempPath/audio.pcm
其中-ar为采样率,-ac为通道数,-f为采样大小
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效