av_read_frame速度慢

来源:6-11 录制音频数据

快乐的兰那罗

2022-09-23

遇到个奇怪的问题,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;
}

写回答

3回答

戴着眼镜的平头哥

2023-06-10

解决了,不知道楼主是不是这样解决的

https://coding.imooc.com/learn/myrelated?cid=415&cate=myquestion

0
1
旭神smile
老铁 你这个是怎么解决的
2023-09-08
共1条回复

戴着眼镜的平头哥

2023-06-10

遇到了相同的问题,请问怎么解决的?

0
0

快乐的兰那罗

提问者

2022-09-23

问题已解决

0
4
李超
回复
谦谦君姿
将sleep改为usleep(100),也就是由原来的一秒读一次改为100毫秒读一次
2025-04-14
共4条回复

音视频小白系统入门课 音视频基础+ffmpeg原理

掌握音视频采集、编解码、RTMP传输协议等核心基础

2318 学习 · 813 问题

查看课程