На Fedora с использованием Qt 5.9.4 я не могу одновременно записывать и воспроизводить аудио - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь написать программу на Qt, которая одновременно записывает звук с микрофона и воспроизводит его одновременно. Я использую Qt 5.9.4 и использую Fedora 29 (не могу обновить до последней версии, так как наша производственная среда - Fedora 29 - не могу обновить его, уже спросил начальник).

У меня есть некоторый код, как вы можете видеть ниже. Но каждый раз, когда я запускаю программу, я получаю следующее сообщение об ошибке:

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

Я установил каждый пакет qt5 *. У меня также есть alsa-utils и импульсный звук.

Я также смотрел на них, которые более или менее помогли мне, но не решили мою проблему:

Я не знаю, является ли это проблемой, связанной с 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();
}

Ответы [ 2 ]

1 голос
/ 25 февраля 2020
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();

}
0 голосов
/ 14 апреля 2020

вам нужно скопировать qt Qt / 5.9.x / mingw73_64 / plugins / audio в ваш двоичный каталог, а не скопировать qtaudio_ windows .dll, это скопировать аудио папку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...