ffmpeg 采集pcm音频数据并播放

本实验记录了 初步使用ffmpeg 采集pcm原始音频数据,并以一定格式播放
实验环境:Linux 系统,并安装了 ffmpeg包含 :

ffmpeg  推流 音视频处理
ffplay  播放器  拉流播放
ffprobe 侦测多媒体文件  格式等基本信息

Makefile

BINS := audiotest

CXX := gcc

#.h
INCDIRI :=
INCDIRI += -I /usr/local/ffmpeg/include

#LIB
INCDIRI += -L /usr/local/ffmpeg/lib

#SRCSALL
SRCSALL += ./

LIBS += -lavcodec -lavdevice -lavfilter -lavformat -lavutil -lswresample -lswscale


CFLAGS := $(INCDIRI)

$(BINS):
	$(CXX) -o $(BINS) main.c $(LIBS) $(CFLAGS) 

clean :
	rm $(BINS)

main.c

#include <stdio.h>
#include <string.h>
#include "libavutil/avutil.h"
#include "libavdevice/avdevice.h"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswresample/swresample.h"


void rec_audio() {

    int ret = 0;
    char errors[1024] = {0, };

    //音频数据上下文
    AVFormatContext *fmt_ctx = NULL;
    AVDictionary *options = NULL;

    //pakcet 存储获取的音频数据
    AVPacket pkt;

    //[[video device]:[audio device]]
    //音频输入设备  我的ubuntu系统下音频设备是  hw:0,0
    char *devicename = "hw:0";

    //set log level
    av_log_set_level(AV_LOG_DEBUG);

    //register audio device  向ffmpeg注册设备
    avdevice_register_all();

    //设置采集方式,对于不同的平台,采集数据的方式不同  linux系统是 
    /*
    返回值:输入格式
    */
    AVInputFormat *iformat = av_find_input_format("alsa");

    //打开音频设备
    /*
	参数1 获得 音频数据上下文 AVFormatContext
	参数2 网络地址/本地文件(设备名)
	参数3 输入格式
	参数4 其他参数 这里为NULL
    */
    if((ret = avformat_open_input(&fmt_ctx, devicename, iformat, &options)) < 0 ){
        av_strerror(ret, errors, 1024);
        fprintf(stderr, "Failed to open audio device, [%d]%s\n", ret, errors);
        return;

    }

    //创建输出的音频文件  将音频数据写到该文件
    char *out = "/home/mhr/Desktop/video/audio_test/audio.pcm";
    FILE *outfile = fopen(out, "wb+");

 
	/* read data from device  获取音频数据 到pkt
	参数1: 音频数据上下文
	参数2: 音频数据存放的目标地址
	返回值:return 0 is OK
	*/
    while((ret = av_read_frame(fmt_ctx, &pkt)) == 0) {

        av_log(NULL, AV_LOG_INFO,"packet size is %d(%p)\n", pkt.size, pkt.data);

        //write file
        fwrite(pkt.data, 1, pkt.size, outfile);
        fflush(outfile);
        av_packet_unref(&pkt); //release pkt
    }


    //close file
    fclose(outfile);
	
    //关闭设备 并 释放音频数据上下文
    avformat_close_input(&fmt_ctx);
    av_log(NULL, AV_LOG_DEBUG, "finish!\n");

    return;
}

int main(int argc, char *argv[])
{
    rec_audio();
    return 0;
}

播放 : 44100采样率,双通道,s16le 格式播放

ffplay -ar 44100 -ac 2 -f s16le audio.pcm

这里的采样率 也可以是 48000 ,我的系统音频参数就是 48000,声音基本完全还原了

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/121430111