2012-04-21 14 views
1

Qtのfreshgirlです。 (同様にC++)オーディオ入力の例が機能しません - QAudioInput:IOError

私はQAudioInputクラスの参照からの例を見て、コンパイルを渡すために、私は(コンパイルの最初に失敗したので、あなたが例に私のコードから見る全ての差がある)少し変更を行いました。

私はインターネットで多くを見つめて、まだ何も得ていません。そして、http://doc.qt.io/archives/qt-4.7/multimedia-audioinput-audioinput-h.html の例が機能します。そして私は注意深く読んでいます。私がファイルに保存することを除いて、そしてバッファに保存すること以外は何も変わりません。

QAudioInputを引き起こす原因は何ですか?IOError(IOデバイスに問題がありますが、何が問題なのですか?) 2、どのようにコードを動作させることができますか?ここで

はコードです:

//audioprocess.h 
#ifndef AUDIOPROCESS_H 
#define AUDIOPROCESS_H 

#include <QAudioInput> 
#include <QFile> 
#include <QDebug> 
#include <QTimer> 
#include <QObject> 

class audioprocess : public QObject 
{ 
    Q_OBJECT 
public: 
    void startRecording(); 
private slots: 
    void stopRecording(); 
private: 
    QFile outputFile; // class member. 
    QAudioInput *audioInput; // class member. 
}; 

#endif // AUDIOPROCESS_H 

//---------------------------------------------- 
//audioprocess.cpp 


#include "audioprocess.h" 

void audioprocess::startRecording() 
{ 
    outputFile.setFileName("/audio_qt.raw"); 
    outputFile.open(QIODevice::WriteOnly | QIODevice::Truncate); 

    QAudioFormat format; 
    // set up the format you want, eg. 
    format.setFrequency(8000); 
    format.setChannels(1); 
    format.setSampleSize(8); 
    format.setCodec("audio/pcm"); 
    format.setByteOrder(QAudioFormat::LittleEndian); 
    format.setSampleType(QAudioFormat::UnSignedInt); 

    QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice(); 
    if (!info.isFormatSupported(format)) { 
    qWarning()<<"default format not supported try to use nearest"; 
    format = info.nearestFormat(format); 
    } 

    audioInput = new QAudioInput(format,reinterpret_cast<QObject*>(this)); 

    QTimer::singleShot(100, reinterpret_cast<QObject*>(this), SLOT(stopRecording())); 
    audioInput->start(&outputFile); 
    // Records audio for 3000ms 
} 

void audioprocess::stopRecording() 
{ 
    audioInput->stop(); 
    outputFile.close(); 
    delete audioInput; 
} 
//-------------------------------------------------------- 

//main.cpp 
#include <QtGui/QApplication> 
#include "audioprocess.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    audioprocess audiorecord; 
    audiorecord.startRecording(); 

    return a.exec(); 
} 

答えて

1

あなたは、アプリケーションがルートフォルダ(ファイル名は=「/audio_qt.raw」)に書き込むための権限を持っていることを確認していますか?

私はユーザーのホームフォルダに書き込もうとします。

これが本当に問題であるかどうかを確認する簡単なテストは、outputFile.open()の戻り値をチェックすることです(trueを返す必要があります)。

+0

ありがとう、それはまさに問題です。私は生成されたファイルのパスの形式を知らなかったので、十分な注意を払っていませんでした。しかし、もう少し小さな疑問があります。もし私がskypeのような最終的なプログラムを作ってみたいのであれば、ユーザーは同時に話して聞いています - これにはマルチスレッドプログラミングが必要ですか? – Tiina

+0

Qtではこれを行うためにマルチスレッドは必要ありません。 QAudioInputのreadyRead信号を接続してサウンドを受信し、QAudioOutputに書き込むだけでサウンドを送信できます。これを管理するQtライブラリについては、QXmpp(http://code.google.com/p/qxmpp/)をご覧ください。それが正しい場合は、回答を受け入れてください:-) –

関連する問題