赞
踩
本实验记录了 初步使用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,声音基本完全还原了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。