音视频基础(二)Ffmpeg采集音频数据

一、ffmpeg采集音频流程:
打开输入设备 -> 获取数据包 -> 输出文件

二、ffmpeg采集音频步骤:
注册设备 -> 设置采集方式 -> 打开音频设备

三、开发准备(MAC环境)
(1)安装ffmpeg
方法1 通过homebrew

点击查看代码
brew install ffmpeg

方法2 通过源代码编译
访问HTTP://FFMPEG.ORG/DOWNLOAD.HTML,点击DOWNLOAD SNAPSHOT,下载源码

安装sdl2

点击查看代码
brew install sdl2
解压缩ffmpeg,进入ffmpeg文件夹配置ffmpeg
点击查看代码
./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --enable-shared --enable-sdl2
编译ffmpeg
点击查看代码
make -j 4
安装ffmpeg
点击查看代码
make install
(2)安装clion clion是跨平台开发工具,在mac和windows都可以使用,安装与破@解过程省略。

(3)建立C项目,引入ffmpeg头文件

image

image

四、代码开发

点击查看代码
#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为采样大小

posted @   金元宝骑骑  阅读(977)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示