遇到个奇怪的问题,av_read_frame速度很慢,平均1s中才能返回一个数据,断点排查发现经常是一帧正常一帧-35,可能是什么原因呀?用ffmpeg命令直接录制和播放没问题,代码如下:
void rec_audio(){
int ret = 0;
char errors[1024] = {0, };
AVFormatContext *fmt_ctx = NULL;
AVDictionary *optins = NULL;
// 数据包
int count = 0;
AVPacket pkt;
// [[video device]:[audio device]]
char *devicename = ":1"; // 用了耳机当做输入源,之前用本机 :0 试过,也是一样的
// 设置日志级别
av_log_set_level(AV_LOG_DEBUG);
// 注册所有设备
avdevice_register_all();
// 获取格式
const AVInputFormat *iformat = av_find_input_format("avfoundation");
if ((ret = avformat_open_input(&fmt_ctx, devicename, iformat, &optins)) < 0) {
av_strerror(ret, errors, 1024);
av_log(NULL, AV_LOG_ERROR, "Failed to open audio device, [%d]%s\n", ret, errors);
// 释放
avformat_close_input(&fmt_ctx);
return;
}
// 创建文件
char *out = "/Users/like/Downloads/audio.pcm";
FILE *outfile = fopen(out, "wb+");
// 读数据
av_init_packet(&pkt);
while (count < 20) {
ret = av_read_frame(fmt_ctx, &pkt);
if(ret == -35) {
av_log(NULL, AV_LOG_DEBUG, "please sleep\n");
sleep(1);
continue;
}
if(ret < 0){
break;
}
count++;
av_log(NULL, AV_LOG_INFO, "packet size is %d(%p), count=%d\n", pkt.size, pkt.data, count);
// 写文件
fwrite(pkt.data, pkt.size, 1, outfile);
fflush(outfile);
// 释放
av_packet_unref(&pkt);
}
// 关闭文件
fclose(outfile);
// 释放
avformat_close_input(&fmt_ctx);
printf("Read finish, count is %d\n", count);
if (ret != 0) {
av_strerror(ret, errors, 1024);
av_log(NULL, AV_LOG_ERROR, "Something error, [%d]%s\n", ret, errors);
return;
}
return;
}