草庐IT

c++ - QAudioOutput 总是遇到 UnderrunError

coder 2024-02-25 原文

我在 Windows 7 Ultimate x64 上使用 Qt 4.8 和 Qt Creator 2.4.1。

我正在使用 QAudioInput 类获取音频输入并使用 QAudioOutput 播放它。有 2 秒超时,之后我停止输入,然后按如下方式设置输出:

class MainWindow
{
    // ...

    QByteArray output_data;
    QBuffer output_data_buffer;
    QAudioOutput *audio_out;

    // ...
};

MainWindow::MainWindow(QWidget *parent)
{
    // ...

    output_data_buffer.setBuffer(&output_data);

    // ...
}

void MainWindow::audioInputStopped(QByteArray data)
{
    output_data = data;
    output_data_buffer.open(QIODevice::ReadOnly);
    audio_out = new QAudioOutput(audio_format, this);
    connect(audio_out, SIGNAL(stateChanged(QAudio::State)), 
            SLOT(audioOutputStateChanged(QAudio::State)));
    audio_out->start(&output_data_buffer);
}

输入和输出设备都支持我使用的音频格式。我使用 QAudioDeviceInfo::isFormatSupported() 检查了它们。 2 秒音频(audioInputStopped() 中的data)始终播放正常。

在插槽 audioOutputStateChanged 中,我总是遇到 audio_out->error() 缓冲区后的 QAudio::UnderrunError 错误玩完了。 audio_out->start() 被调用后,状态(在 audioOutputStateChanged() 中作为参数传递)和错误如下所示:

  1. 没有错误。活跃状态。
  2. 没有错误。停止状态。
  3. 欠载错误。空闲状态。

请注意,我在空闲状态下停止audio_out following this example .为什么代码遇到欠载错误?这正常吗?

最佳答案

这可能看起来有点奇怪,但我已经看到 Qt 中的内置数组在堆上构建时处理得更好,或者至少当它们的元素在堆上构建时(所以它们只是一个数组指针)。内存管理有点棘手,但插入其中的项目不会超出范围。 Qt Object Model还促进将大多数东西放在堆上并正确地养育它们。这可能会有所帮助。

在阅读了一些关于缓冲区欠载的信息后,听起来似乎仍有一些东西在尝试从音频源中读取,而其他东西正在写入它,反之亦然。查看下面的一些链接。在读取缓冲区之前,您可以尝试断开 audio_in 部分与缓冲区的连接。这更有可能修复错误。

我还会在主窗口的构造函数中构造 QAudioOutput 指针(更像是一种样式)。按照 Qt 示例中的一些组织方式,它似乎是一个更好的组织。这是 cpp对于 QAudioInput example .

如果您有一个更完整的示例,我可以尝试更多使用它来重现错误并进行调试。

这里还有一个值得同情的人:

http://qt-project.org/forums/viewthread/16729

还有一篇维基文章:

http://en.wikipedia.org/wiki/Buffer_underrun

以及 Qt 上的多媒体示例列表:

http://doc.qt.nokia.com/4.7-snapshot/examples-multimedia.html

希望对您有所帮助。

关于c++ - QAudioOutput 总是遇到 UnderrunError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9555302/

有关c++ - QAudioOutput 总是遇到 UnderrunError的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  3. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  4. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  9. ruby - Nokogiri:遇到 nil:NilClass 错误 "undefined method ‘text’” - 2

    我是程序员的新手,请原谅我的新手。所以我正在使用Nokogiri来抓取警方的犯罪记录。这是下面的代码:require'rubygems'require'nokogiri'require'open-uri'url="http://www.sfsu.edu/~upd/crimelog/index.html"doc=Nokogiri::HTML(open(url))putsdoc.at_css("title").textdoc.css(".brief").eachdo|brief|putsbrief.at_css("h3").textend我使用选择器小工具书签来查找日志(.brief)的C

  10. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

随机推荐