QT开发 FFmpeg录制音频 pcm 格式

QT开发 需要导入plist文件 访问麦克风的权限
FFmpeg命令录制音频在子线程中,在主线程会卡顿UI

ffmpeg -f avfoundation -i :2 out.wav

查看设备支持的视频设备和音频设备

ffmpeg -f avfoundation -list_devices true -i ''

[AVFoundation indev @ 0x7fc63bd086c0] AVFoundation video devices:
[AVFoundation indev @ 0x7fc63bd086c0] [0] FaceTime HD Camera(内制)
[AVFoundation indev @ 0x7fc63bd086c0] [1] Capture screen 0
[AVFoundation indev @ 0x7fc63bd086c0] AVFoundation audio devices:
[AVFoundation indev @ 0x7fc63bd086c0] [0] ZoomAudioDevice
[AVFoundation indev @ 0x7fc63bd086c0] [1] Built-in Microphone(内制)
[AVFoundation indev @ 0x7fc63bd086c0] [2] AirPods

FFmpeg代码录制音频

 // 注册设备
    avdevice_register_all();

核心代码

 // 获取输入格式对象
    AVInputFormat *fmt = av_find_input_format("avfoundation");
    if (!fmt) {
        qDebug() << "获取输入格式对象失败" <<"avfoundation";
        return;
    }
    // 格式上下文(将来可以利用上下文操作设备)
    AVFormatContext *ctx = nullptr;
    // 打开设备
    int ret = avformat_open_input(&ctx,":2", fmt, nullptr);
    if (ret < 0) {
        char errbuf[1024];
        av_strerror(ret, errbuf, sizeof (errbuf));
        qDebug() << "打开设备失败" << errbuf;
        return;
    }
    // 打印一下录音设备的参数信息
        // 获取输入流
    AVStream *stream = ctx->streams[0];
    // 获取音频参数
    AVCodecParameters *params = stream->codecpar;
    // 声道数
    qDebug() << params->channels;
    // 采样率
    qDebug() << params->sample_rate;
    // 采样格式
    qDebug() << params->format;
    // 每一个样本的一个声道占用多少个字节
    qDebug() << av_get_bytes_per_sample((AVSampleFormat) params->format);

    // 文件名
    QString filename ="/Users/apple/Desktop/";

    filename += QDateTime::currentDateTime().toString("MM_dd_HH_mm_ss");
    filename += ".pcm";
    QFile file(filename);

    // 打开文件
    // WriteOnly:只写模式。如果文件不存在,就创建文件;如果文件存在,就会清空文件内容
    if (!file.open(QFile::WriteOnly)) {
        qDebug() << "文件打开失败" << filename;
       // 关闭设备
        avformat_close_input(&ctx);
        return;
    }

    // 数据包
//    AVPacket pkt;
    AVPacket *pkt = av_packet_alloc();
    while (!isInterruptionRequested()) {
        // 不断采集数据
        ret = av_read_frame(ctx, pkt);

        if (ret == 0) { // 读取成功
             file.write((const char *) pkt->data, pkt->size);
        } else if (ret == AVERROR(EAGAIN)) { // 资源临时不可用
            continue;
        } else { // 其他错误
            char errbuf[1024];
            av_strerror(ret, errbuf, sizeof (errbuf));
            qDebug() << "av_read_frame error" << errbuf << ret;
            break;
        }

        // 必须要加,释放pkt内部的资源
        av_packet_unref(pkt);
    }
    file.close();
    av_packet_free(&pkt);
    avformat_close_input(&ctx);

    qDebug() << this << "正常结束----------";

问题:获取输入格式对象失败
没有调用 avdevice_register_all(); 这个函数
录制的pcm的数据是0
"avfoundation" 跟 ":2" 这两个参数不对 mac跟window的参数不一样

你可能感兴趣的:(QT开发 FFmpeg录制音频 pcm 格式)