请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

重采样完毕之后打开声音听见吱吱的一声

代码如下,请老师指教
#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;

}

正在回答 回答被采纳积分+3

1回答

提问者 慕粉3536494 2020-11-02 08:39:53

请问

AV_SAMPLE_FMT_FLT

AV_SAMPLE_FMT_S32

这些都是什么意思?这些参数的选择是根据输入输出设备来定的,还是随程序员的意思随意选择?

1 回复 有任何疑惑可以回复我~
  • 李超 #1
    根据输入设备来设置的。FLT==float  也就是浮点型, S32=signed int 32表示整型32 位
    回复 有任何疑惑可以回复我~ 2020-11-04 12:05:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信