当前位置:   article > 正文

ffmpeg 采集pcm音频数据并播放_ffmpeg 播放pcm

ffmpeg 播放pcm

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

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

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

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

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

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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/995035
推荐阅读
相关标签
  

闽ICP备14008679号