Qt 5.7
根据文档,QAudioDecoder不支持流媒体。但它接受文件名或QIODevice作为源。出现了一个“好主意”:让我们用子类QIODevice来创建流媒体支持。
但我总是会犯错误:
无法启动解码过程。流不包含任何数据。
我检查过,检查过,调试过。不知道问题出在哪里。
我只是在测试它,所以下面的代码并不是最终的。
标题:
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;
};执行情况:
#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;
}用法:
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();发布于 2016-08-21 08:36:52
您的isSequential()、bytesAvailable()和size()方法都不覆盖QIODevice中的相应方法,因为签名不匹配。他们都缺少了一个const限定符。在重写虚拟方法时使用C++11 override关键字会有所帮助。
https://stackoverflow.com/questions/39061016
复制相似问题