首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类QIODevice用于QAudioDecoder

子类QIODevice用于QAudioDecoder
EN

Stack Overflow用户
提问于 2016-08-21 05:12:20
回答 1查看 1.4K关注 0票数 1

Qt 5.7

根据文档,QAudioDecoder不支持流媒体。但它接受文件名或QIODevice作为源。出现了一个“好主意”:让我们用子类QIODevice来创建流媒体支持。

但我总是会犯错误:

无法启动解码过程。流不包含任何数据。

我检查过,检查过,调试过。不知道问题出在哪里。

我只是在测试它,所以下面的代码并不是最终的。

标题:

代码语言:javascript
复制
class InputBuffer : public QIODevice
{

public:

    InputBuffer(QString fileName);
    ~InputBuffer();

    qint64 readData(char *data, qint64 maxlen);
    qint64 writeData(const char *data, qint64 len);

    bool   isSequential();
    qint64 bytesAvailable();
    qint64 size();


private:

    char*  bufferRef;
    qint64 length;
    qint64 position;

};

执行情况:

代码语言:javascript
复制
#include "inputbuffer.h"

InputBuffer::InputBuffer(QString fileName)
{
    QFileInfo fileInfo(fileName);

    length   = fileInfo.size();
    position = 0;

    bufferRef = (char*)malloc(length);

    QFile file(fileName);
    file.open(QFile::ReadOnly);
    file.read(bufferRef, length);
    file.close();

    emit readyRead();
}


InputBuffer::~InputBuffer()
{
    free(bufferRef);
}


qint64 InputBuffer::readData(char *data, qint64 maxlen)
{
    if (position >= length) {
        return -1;
    }

    qint64 readSize = qMin(maxlen, length - position);

    memcpy(data, bufferRef + position, readSize);
    position += readSize;

    return readSize;
}


qint64 InputBuffer::writeData(const char *data, qint64 len)
{
    return -1;
}


bool InputBuffer::isSequential()
{
    return true;
}


qint64 InputBuffer::bytesAvailable()
{
    return length - position;
}


qint64 InputBuffer::size()
{
    return length;
}

用法:

代码语言:javascript
复制
inputBufferRef = new InputBuffer("/home/pp/Zenék/Test.mp3");
inputBufferRef->open(QIODevice::ReadOnly);

audioDecoderRef = new QAudioDecoder();

audioDecoderRef->setAudioFormat(audioFormat);
audioDecoderRef->setSourceDevice(inputBufferRef);

connect(audioDecoderRef, SIGNAL(bufferReady()),               this, SLOT(decoderBufferReady()));
connect(audioDecoderRef, SIGNAL(finished()),                  this, SLOT(decoderFinished()));
connect(audioDecoderRef, SIGNAL(error(QAudioDecoder::Error)), this, SLOT(decoderError(QAudioDecoder::Error)));

audioDecoderRef->start();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-21 08:36:52

您的isSequential()bytesAvailable()size()方法都不覆盖QIODevice中的相应方法,因为签名不匹配。他们都缺少了一个const限定符。在重写虚拟方法时使用C++11 override关键字会有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39061016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档