FFmpeg采集音频的流程
- 打开输入设备
- 数据包,从设备中获取数据流,对数据流进行判断,看获取的是视频流,还是音频流
-
输出文件,拿到数据包,输出到一个文件中,这样就把音频数据,保存下来了
1.png
打开输入设备
采集音频的步骤
- 注册设备,ffmpeg有很多设备,有音频设备,有视频设备,还有一些其他的设备(本机集成的,外接的),需要显示的调用API,来注册设备
- 设置采集方式,avfoundation/dshow/alsa,注册设备完了,就得设置采集方式,不同的平台,采集方式不一样,mac是avfoundation,windows是dshow,Linux是alsa
- 打开音频设备,通过API打开了,可以读取音频流了
代码步骤
- 加入对应的头文件
//注册设备的
#include "libavdevice/avdevice.h"
//打开设备 的头文件 对应ffmpeg,所有的都是一种格式(不管是打开设备还是多媒体文件),对于格式解析都是使用libavformat解析
#include "libavformat/avformat.h"
具体代码
void registerAllDevice(){
//1. 注册所有设备
avdevice_register_all();
//2. 获取格式 设置采集方式
AVInputFormat * iformat = av_find_input_format("avfoundation");
AVFormatContext *fmt_ctx = NULL;
//音频设备 mac上 :0 从第一个音频设备获取声音 可以到ffmpeg官网查看devicename说明
char * devicename = ":0";
AVDictionary *options = NULL;
//3.打开设备
/*
AVFormatContext **ps 上下文,作用:前面调用的API和后面调用的API都依赖于上下文,对一个多媒体文件进行解码、编码都依赖于上下文,操作那个文件,只需要把这个文件的上下文传过去,就知道是对那个文件操作了 。这个上下文是avformat_open_input这个API返回的指针,我们只要定义这个指针就行 AVFormatContext *fmt_ctx;
const char *url: 可以是一个网络地址,也可以是本地的文件,
AVInputFormat *fmt
AVDictionary **options 打开设备的一些参数,一般解码的时候用到
*/
// 成功==0,不成功!= 0
int ret = avformat_open_input(&fmt_ctx, devicename, iformat, &options);
if (ret < 0) {
/*
int enum 错误码
char errbuf 错误信息输出到哪
size_t errbuf_size
*/
char errors[1024];
av_strerror(ret, errors, 1024);
printf(stderr,"Failed to open audio device,[%d]%s\n",ret,errors);
return;
}
网友评论