ubuntu下使用Qt+ffmpeg采集音频,保存音频文件,简单多线程方式

ubuntu下使用Qt+ffmpeg采集音频,保存音频文件,简单多线程方式

ui界面增加按钮,按钮文本为开始录制。按钮槽函数:

void MainWindow::on_btn_Open_clicked()
{
    if (m_status)
    {
        m_status = false;
        ui->btn_Open->setText(tr("开始录制"));
    }
    else
    {
        m_status = true;
        ui->btn_Open->setText(tr("停止录制"));
        QtConcurrent::run([&](){
            // 录制音频函数
            openDeviceAndReadData();
        });
    }

}

用界面按钮控制开始录制和停止录制,使用QtConcurrent实现简单的多线程方式避免主线程卡顿。也可以使用QThread或者object等方式实现多线程,此处逻辑不复杂,所以采用了简单的方式实现多线程。录制函数中用m_status来控制开始和停止。

// 录制函数
void MainWindow::openDeviceAndReadData()
{
    // 设置日志级别
    av_log_set_level(AV_LOG_DEBUG);
    // 注册设备
    avdevice_register_all();

    // 获取采集格式
    AVInputFormat *inputFmt = av_find_input_format("alsa");

    int ret = 0;
    AVFormatContext *fmt_ctx = nullptr;
    char *deviceName = "hw:0,0";
    AVDictionary *options = nullptr;
    // 打开设备
    ret = avformat_open_input(&fmt_ctx, deviceName, inputFmt, &options);

    char errors[1024] = {0};
    if (ret < 0)
    {
        av_strerror(ret, errors, 1024);
        printf("Failed to open audio device, [%d]%s\n", ret, errors);
        return;
    }

    int count = 0;
    AVPacket packet;

    av_init_packet(&packet);

    // 创建文件
    char *outPath = "/opt/document/audio.pcm";
    FILE *outFile = fopen(outPath, "wb+");

    // 从设备读取数据, 用m_status控制是否读取
    while ((ret = av_read_frame(fmt_ctx, &packet) == 0) && m_status)
    {
        // 写入文件
        fwrite(packet.data, packet.size, 1, outFile);
        fflush(outFile);

        av_log(NULL, AV_LOG_INFO, "Packet size: %d(%p), count = %d\n",
               packet.size, packet.data, count++);

        // 释放packet空间
        av_packet_unref(&packet);
    }

    // 关闭文件
    fclose(outFile);

    // 关闭设备,释放上下文空间
    avformat_close_input(&fmt_ctx);

    av_log(NULL, AV_LOG_DEBUG, "Finish!\n");

}

找到生成的音频文件,我的在/opt/document/audio.pcm,在终端打开,执行如下命令,即可播放刚才录制的音频:

ffplay -ar 44100 -ac 2 -f s16le audio.pcm

我刚刚开始学习音视频的内容,把学习内容记录下来,方便自己查看,也分享给有需要的小伙伴,现在的都是基础,采集出来的音频效果不是特别好,以后会学习进阶篇,到时候再和大家分享更好的新内容。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VectorAL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值