qt在windows下实现录音放音同步

??

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:WIN8

开发环境:Qt5 3.1.2

说明:

做一个类似qq的语音传输的软件,所以测试windows下如何用qt进行语音同步播放

源码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAudioInput>
#include <QAudioOutput>
#include <iostream>
#include <QFile>
#include <QBuffer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void stopRecording();
    void finishedPlaying(QAudio::State state);
    void readMore();
private:
    Ui::MainWindow *ui;

    QFile outputFile;   // class member.
    QAudioInput* audio_in; // class member.

    QFile inputFile;   // class member.
    QAudioOutput* audio_out; // class member.

    QIODevice *myBuffer_in;
    QIODevice *myBuffer_out;

    //QBuffer Buffer;

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    outputFile.setFileName("test.raw");
    outputFile.open( QIODevice::WriteOnly | QIODevice::Truncate );
    QAudioFormat format;
    // set up the format you want, eg.
    format.setSampleRate(8000);
    format.setChannelCount(1);
    format.setSampleSize(16);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);
    //format.setSampleType(QAudioFormat::SignedInt);
    QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
    if (!info.isFormatSupported(format)) {
       qWarning()<<"default format not supported try to use nearest";
       format = info.nearestFormat(format);
    }
    audio_in = new QAudioInput(format, this);
    //QTimer::singleShot(3000, this, SLOT(stopRecording()));
    //audio_in->start(&outputFile);
    myBuffer_in = audio_in->start();
    connect(myBuffer_in, SIGNAL(readyRead()), SLOT(readMore()));
    // Records audio for 3000ms
    qDebug() <<"record begin!" << endl;

    inputFile.setFileName("test.raw");
    inputFile.open(QIODevice::ReadOnly);
    audio_out = new QAudioOutput(format, this);
    connect(audio_out,SIGNAL(stateChanged(QAudio::State)),SLOT(finishedPlaying(QAudio::State)));
    //audio_out->start(&inputFile);
    //audio_out->start(myBuffer_out);
    myBuffer_out = audio_out->start();
    qDebug() <<"play begin!" << endl;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readMore()
{
    if (!audio_in)
        return;

    QByteArray m_buffer(2048,0);
    qint64 len = audio_in->bytesReady();
    qDebug() << "len1 = " << len;
    qint64 l = myBuffer_in->read(m_buffer.data(), len);
    qDebug() << "len2 = " << l;

    myBuffer_out->write(m_buffer);
}

void MainWindow::stopRecording()
 {
    qDebug() << "enter stop";

   audio_in->stop();
   outputFile.close();
   delete audio_in;
   qDebug() <<"record end!" << endl;

//   inputFile.setFileName("test.raw");
//   inputFile.open(QIODevice::ReadOnly);
//   QAudioFormat format;
//   // Set up the format, eg.
//   format.setSampleRate(8000);
//   format.setChannelCount(1);
//   format.setSampleSize(16);
//   format.setCodec("audio/pcm");
//   format.setByteOrder(QAudioFormat::LittleEndian);
//   format.setSampleType(QAudioFormat::UnSignedInt);
//   QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
//   if (!info.isFormatSupported(format)) {
//    qWarning()<<"raw audio format not supported by backend, cannot play audio.";
//    return;
//   }
//   audio_out = new QAudioOutput(format, this);
//   connect(audio_out,SIGNAL(stateChanged(QAudio::State)),SLOT(finishedPlaying(QAudio::State)));
//   audio_out->start(&inputFile);
//   //audio_out->start(myBuffer);
//   qDebug() <<"play begin!" << endl;
 }

void MainWindow::finishedPlaying(QAudio::State state)
 {
//   if(state == QAudio::IdleState) {
//     audio_out->stop();
//     inputFile.close();
//     delete audio_out;
//   }
   qDebug() << "play end!" << endl;
 }

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
时间: 2024-10-12 06:29:04

qt在windows下实现录音放音同步的相关文章

qt在windows下的udp通信(最简单)

qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发通信 界面: 源代码: LssHost.pro: [cpp] view plain copy #------------------------------------------------- # # Project created by QtCreator 2013-09-22T09:36:44

qt在windows下编译遇到的一些问题

软件是在linux上写的,然而搬到windows上来遇到了好多问题.... 想跪.... 首先就是压根编译不了的问题....这个问题困扰我好久了....一直报错undefined reference to RInside和deplicate section.... 如贴:http://www.qter.org/forum.php?mod=viewthread&tid=6071&extra= 后来终于解决了,原来是qt版本的问题--原来是在5.7或5.8上编译的,换成5.6就好了... 呸

Qt在Windows下的三种编程环境搭建(图文并茂,非常清楚)good

尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器和调试器的信息如图所示: http://qt-project.org/doc/qtcreator-3.0/creator-debugger-engines.html (Home | Docs | Qt Creator 3.0 | Debuggingand Analyzing | Setting Up

Qt在Windows下的三种编程环境搭建

尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器和调试器的信息如图所示: http://qt-project.org/doc/qtcreator-3.0/creator-debugger-engines.html (Home | Docs | Qt Creator 3.0 | Debuggingand Analyzing | Setting Up

【Qt】Qt在Windows下的开发与调试环境配置

前文已经交待了从源码编译Qt自定义版本.现在可以开始配置一下开发与调试程序并写个Hello World了. 1. IDE 虽然Qt官方有VS插件使我们可以在VisualStudio中开发Qt应用,但我的感觉是那样的体验不太好,我还是喜欢使用清爽的Qt Creator来开发. QtCreator的下载地址:http://download.qt-project.org/official_releases/qtcreator/3.3/3.3.0/qt-creator-opensource-window

node.js在windows下的学习笔记(4)---同步,异步,回调的概念

Node.js是使用事件驱动的,非阻塞的I/O模型,用于构建快速的,可扩展的网络应用程序. Node.js想解决的问题是:处理输入,输入,高并发 1.阻塞与非阻塞 阻塞也叫同步,是指每一次执行一个操作,在这个操作完成之前,代码的执行会被阻塞,无法移到下一个操作上. 阻塞就相当于你在超市里面买东西,结账,在排队,如果前面的人没买单,你就不能买,一定要等前面的人先执行完其操作才可以 非阻塞就相当于你在外婆家取号,然后就可以去干别的事情了,等轮到我们的时候,短信发到我们的手机上了,说轮到我们了,这样我

关于windows下QT以及QT creator的安装

普及  之  windows下qt的安装及配置 qt介绍 : Qt,分为商业.开源两个版本,商业版需要花钱购买license,而开源版本则遵守GPL协议,提供了源码,用户需要自行编译,才能生产动态库文件. 所以以下介绍开源版本(原因嘛,,自然是因为免费): Qt开发需要安装qt library 和 qt creator qt library为Qt的程序提供头文件.静态链接库 和动态链接库 qt creator 是用于编程的IDE ,提供GUI界面绘制.代码编写.程序调试等多个功能. QT在win

QT - windows下编译坏境安装

qt在windows下的使用方式有两种: 1.将qt内置在vs下,例如,内置在vs2010下,使用vs的编译器及调试器. 2.在windows下,使用qt creator以及MingW作为编译器的使用. 当然两种方式也可以共存. 一.现在讲解第一种方式,qt4.8.5内置在vs2010下: 下载:1.“qt-win-opensource-4.8.5-vs2010.exe” 注意为安装版,不需要编译. 2.“qt-vs-addin-1.1.7.exe” 直接安装就可以,安装后,运行VS2010,菜

在windows下的QT编程中的_TCHAR与QString之间的转换

由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef UNICODE #define QStringToTCHAR(x)     (wchar_t*) x.utf16() #define PQStringToTCHAR(x)    (wchar_t*) x->utf16() #define TCHARToQString(x)     QString: