简体   繁体   English

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

[英]On Fedora using Qt 5.9.4, I'm unable to simultaneously record and play audio at the same time

I'm trying to write a program in Qt that simultaneously records audio from a microphone and plays it back at the same time.我正在尝试在 Qt 中编写一个程序,该程序同时记录来自麦克风的音频并同时播放。 I'm using Qt 5.9.4 and I'm on Fedora 29 (can't update to latest version as our production environment is Fedora 29 -- can't update it, have already asked boss).我正在使用 Qt 5.9.4 并且我在 Fedora 29 上(无法更新到最新版本,因为我们的生产环境是 Fedora 29 - 无法更新它,已经问过老板)。

I have some barebones code written, as you can see below.我编写了一些准系统代码,如下所示。 But everytime I run the program, I get the following error message:但是每次运行程序时,都会收到以下错误消息:

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

I've installed every qt5* package.我已经安装了每个 qt5* 包。 I have alsa-utils and pulse audio installed as well.我也安装了 alsa-utils 和脉冲音频。

I have also looked at these which more or less helped me but did not solve my problem:我也看过这些或多或少对我有帮助但没有解决我的问题的:

I don't know if this is a fedora related issue or a Qt related issue.我不知道这是 Fedora 相关问题还是 Qt 相关问题。 Please help!请帮忙!

myaudiorecorder.h: 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: 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();

}

您需要将 qt Qt/5.9.x/mingw73_64/plugins/audio 复制到您的二进制目录,而不是复制 qtaudio_windows.dll ,是复制音频文件夹

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM