版本是4.7,想实现音频的边加载边播放!
项目里面有另外一个模块,输出wav格式的音频我这边可以取 getAudioData(char *pBuf, int len, int pos);
PHonon支持本地文件,qurl,QIODevice,还有一个AbstractMediaStream
用本地文件很简单,我这边已经实现了, 但是因为处理很慢,所以要求必须是边缓存边播放,所以我就想用流实现。
看了一下AbstractMediaStream,我开始觉得应该很简单,但是我做了一个简单的测试:
MediaDataStream是继承AbstractMediaStream的。
#include "mediadatastream.h"
#include <QDebug>
MediaDataStream::MediaDataStream(QObject *parent) :
AbstractMediaStream(parent)
{
file.setFileName("D:\\江南Style.wav");
if( !file.open( QIODevice::ReadOnly ) )
{
qDebug() << "File Open Failed!";
}
setStreamSize(file.size());
this->setStreamSeekable(false);
}
void MediaDataStream::needData()
{
static int i = 0;
qDebug() << "needData:" << i++;
quint64 bytesWritten = 0;
while(1){
QByteArray &data = file.read(10240);
if(data.isEmpty())
{
qDebug() << "end";
AbstractMediaStream::endOfData();
break;
}
else
{
writeData(data);
bytesWritten += data.size();
qDebug() << "write " << data.size() << bytesWritten;
}
}
}
void MediaDataStream::enoughData()
{
file.close();
qDebug() << "enoughData:" << i;
}
void MediaDataStream::seekStream(qint64 offset)
{
qDebug() << "seekStream:" << i << offset;
}
void MediaDataStream::reset()
{
qDebug() << "reset:" << i;
}
例子,为了测试,数据源我是从文件取的。但是我把这个给MediaSource后,放不出来,并且一直再needData,感觉数据没有写进去?
然后我又想继承QIODevice,用QIODevice来实现,但是不太明白怎么操作。。反正只有实现MediaSource在播的时候,我可以用另外一个线程继续往里面写数据就可以。。
网上搜了一些demo,大部分都是播放本地文件的。。文件被MediaSource用了以后,又不能继续追加了。
有人用过AbstractMediaStream这个么,或者有其他的建议也可以。。谢谢大家了。