c++ - 在使用Qt 5.9.4的Fedora上,我无法同时记录和播放音频

标签 c++ qt audio qaudioinput

我正在尝试用Qt编写一个程序,该程序同时记录来自麦克风的音频并同时播放。我使用的是Qt 5.9.4,我使用的是Fedora 29(由于我们的生产环境是Fedora 29,因此无法更新至最新版本-无法更新,已经询问了老板)。

我写了一些准系统代码,如下所示。但是每次运行程序时,都会出现以下错误消息:

using null output device, none available
using null input device, none available

我已经安装了每个qt5 *软件包。我也安装了alsa-utils和Pulse音频。

我还研究了这些或多或少对我有所帮助但未能解决我的问题的方法:
  • Qt - how to record and play sound simultaneously
  • https://forum.qt.io/topic/10399/how-to-record-and-play-sound-simultaneously/5
  • https://www.qtcentre.org/threads/45300-How-to-record-and-play-sound-simultaneously
  • Qt - No audio output device - Yocto/poky
  • Qt + conan = using null output device, none available

  • 我不知道这是与Fedora有关的问题还是与Qt有关的问题。请帮忙!

    myaudiorecorder.h:
     #ifndef MYAUDIORECORDER_H
     #define MYAUDIORECORDER_H
    
    #include <QAudioFormat>
    #include <QAudioDeviceInfo>
    #include <QTextStream>
    #include <QAudioInput>
    #include <QAudioOutput>
    #include <QObject>
    
    class MyAudioRecorder : public QObject
    {
        Q_OBJECT
    
    public:
        MyAudioRecorder();
    
        QAudioFormat formatIn;
        QAudioFormat formatOut;
    
        QAudioInput *m_audioInput;
        QAudioOutput *m_audioOutput;
    
        QAudioDeviceInfo m_InputDevice;
        QAudioDeviceInfo m_OutputDevice;
    
        QIODevice *m_input;
        QIODevice *m_output;
    
        QAudioDeviceInfo deviceIn;
        QAudioDeviceInfo deviceOut;
    
        void getFormat();
        void createAudioInput();
        void createAudioOutput();
        void beginAudio();
    
    };
    
    #endif // MYAUDIORECORDER_H
    

    myaudiorecorder.cpp:
    #include "myaudiorecorder.h"
    
    MyAudioRecorder::MyAudioRecorder() {
        getFormat();
        createAudioInput();
        createAudioOutput();
    }
    
    
    void MyAudioRecorder::getFormat(){
        formatIn.setSampleSize(8);
        formatIn.setCodec("audio/pcm");
        formatIn.setByteOrder(QAudioFormat::LittleEndian);
        formatIn.setSampleType(QAudioFormat::UnSignedInt);
    
        deviceIn = QAudioDeviceInfo::availableDevices(QAudio::AudioInput).at(1);
        if(!deviceIn.isFormatSupported(formatIn)){
        QTextStream(stdout) << " default formatIn not supported " << endl;
        formatIn = deviceIn.nearestFormat(formatIn);
        } else {
        QTextStream(stdout) << " default formatIn supported " << endl;
        }
    
        deviceOut = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput).at(0);
        if(!deviceOut.isFormatSupported(formatOut)) {
        QTextStream(stdout) << "1. default formatOut not supported " << endl;
        formatOut = deviceOut.nearestFormat(formatOut);
        }
    
    }
    
    
    void MyAudioRecorder::createAudioInput(){
        m_audioInput = new QAudioInput(m_InputDevice, formatIn, 0);
    }
    
    void MyAudioRecorder::createAudioOutput(){
        m_audioOutput = new QAudioOutput(m_OutputDevice, formatOut, 0);
    }
    
    void MyAudioRecorder::beginAudio(){
        m_output = m_audioOutput->start();
        m_input = m_audioInput->start();
    }
    

    最佳答案

    void MyAudioRecorder::beginAudio(){
        m_output = m_audioOutput->start();
        m_audioInput->start(m_output);
    
    
       //Above should do the trick but do check the volume, state and error if any:
       qDebug() << "m_audioInput: volume=" <<  m_audioInput->volume()
                << ", state=" << m_audioInput->state()
                << ", error=" << m_audioInput->error();
       qDebug() << "m_audioOutput: volume=" <<  m_audioOutput->volume()
                << ", state=" << m_audioOutput->state()
                << ", error=" << m_audioOutput->error();
    
    }
    

    关于c++ - 在使用Qt 5.9.4的Fedora上,我无法同时记录和播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60381580/

    相关文章:

    c++将空指针发送到函数并将其设置为函数而不丢失范围?

    c++ - 如何使用 CLI 生成 JSON 编译数据库?

    c++ - 在 QT 应用程序(VS 插件)中使用 QcustomPlot 基本代码停止工作程序

    audio - 如何在iPhone SDK中将诸如回声,法兰等声音效果应用于音乐

    c++ - 在C++/MFC中停止和启动DirectX声音合成器时弹出/单击

    python - boost::python 具有静态工厂构造函数和 std::unique_ptr 的纯虚拟基类

    c++ - QLocalSocket/QDataStream应该如何读取才能避免死锁?

    c++ - 当已在 Excel 中打开时,使用 QFile 写入文件失败,没有错误代码

    python - QtGlobal 声明可以在 PyQt5 中访问吗?

    java - Java 音库