• 3307阅读
  • 0回复

QT Phonon播放音频流的问题! [复制链接]

上一主题 下一主题
 

只看楼主 倒序阅读 楼主  发表于: 2015-01-30
版本是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这个么,或者有其他的建议也可以。。谢谢大家了。


快速回复
限100 字节
 
上一个 下一个