美文网首页
打开音频设备

打开音频设备

作者: 想成为大牛的程旭元 | 来源:发表于2020-07-24 18:09 被阅读0次

FFmpeg采集音频的流程

  1. 打开输入设备
  2. 数据包,从设备中获取数据流,对数据流进行判断,看获取的是视频流,还是音频流
  3. 输出文件,拿到数据包,输出到一个文件中,这样就把音频数据,保存下来了


    1.png

打开输入设备

采集音频的步骤
  1. 注册设备,ffmpeg有很多设备,有音频设备,有视频设备,还有一些其他的设备(本机集成的,外接的),需要显示的调用API,来注册设备
  2. 设置采集方式,avfoundation/dshow/alsa,注册设备完了,就得设置采集方式,不同的平台,采集方式不一样,mac是avfoundation,windows是dshow,Linux是alsa
  3. 打开音频设备,通过API打开了,可以读取音频流了

代码步骤

  1. 加入对应的头文件
//注册设备的
#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;
    }

相关文章

网友评论

      本文标题:打开音频设备

      本文链接:https://www.haomeiwen.com/subject/cjbjlktx.html