代码如下,请老师指教
#include “testc.h”
#include <string.h>
static int rec_status = 0;
void set_status(int status){
rec_status = status;
}
void record_audio(){
int ret = 0;
char errors[1024];
AVFormatContext *fmt_cxt = NULL;
AVDictionary *options = NULL;
int count = 0;
AVPacket pkt;
char *devicename = “:1”;
av_log_set_level(AV_LOG_DEBUG);
rec_status = 1;
avdevice_register_all();
//获取音频的方式
AVInputFormat *iformat = av_find_input_format(“avfoundation”);
//打开设备
if((ret = avformat_open_input(&fmt_cxt, devicename, iformat, &options))<0){
av_strerror(ret,errors, 1024);
printf(“fail to open device ,[%d]%s\n”,ret,errors);
return ;
}
//创建文件
char *out = “/Users/admin/Downloads/av_base/audio.pcm”;
FILE *outfile = fopen(out, “wb+”);//写入(w)二进制文件(b),如果文件不存在,则创建(+)
if (outfile == NULL) {
printf(“open fail: %d\n”, errno);
return;
}
SwrContext *swr_ctx = NULL;
swr_ctx = swr_alloc_set_opts(NULL, //ctx
AV_CH_LAYOUT_MONO, //输出channel布局
AV_SAMPLE_FMT_FLT, //输出的采样格式
48000, //采样率
AV_CH_LAYOUT_MONO, //输入channel布局
AV_SAMPLE_FMT_FLT, //输入的采样格式
48000, //输入的采样率
0,
NULL);
if(!swr_ctx){
}
if(swr_init(swr_ctx)<0){
}
uint8_t **src_data = NULL;
int src_linesize = 0;
uint8_t **dst_data = NULL;
int dst_linesize = 0;
//4096除以4除以2=512
//创建输入缓冲区
av_samples_alloc_array_and_samples(&src_data,
&src_linesize,
1,
512,
AV_SAMPLE_FMT_FLT,
0);
//创建输出缓冲区
av_samples_alloc_array_and_samples(&dst_data,
&dst_linesize,
1,
512,
AV_SAMPLE_FMT_S16,
0);
//从设备获取数据
while ((ret = av_read_frame(fmt_cxt, &pkt) == 0 && rec_status)) {
av_log(NULL, AV_LOG_INFO, "packet size is %d(%p),count=%d\n",pkt.size,pkt.data,count);
memcpy((void *)src_data[0], (void *)pkt.data, pkt.size);
//重采样
swr_convert(swr_ctx, //重采样的上下文
dst_data, //输出结果缓存区
512, //每个通道的采样数
(const uint8_t **) src_data, //输入缓冲区
512 //输入单个通道的采样数
);
fwrite(dst_data[0], 1, 512, outfile);
fflush(outfile);
av_packet_unref(&pkt);
}
//关闭文件
fclose(outfile);
if(src_data){
av_freep(&src_data[0]);
}
av_freep(&src_data);
if(dst_data){
av_freep(&dst_data[0]);
}
av_freep(&dst_data);
swr_free(&swr_ctx);
//关闭上下文
avformat_close_input(&fmt_cxt);
av_log(NULL,AV_LOG_DEBUG,"hello world ffmpeg from swift!\n");
return;
}