• 6599阅读
  • 7回复

[提问]qt 音频 [复制链接]

上一主题 下一主题
离线童话889
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-03
在使用QAudioOutput 播放的时候,播放两段不同的文件的时候,中间会有卡的声音,请问如何去掉啊?如何播放完第一段马上切换到第二段上去啊,求大神帮忙!  
离线roywillow

只看该作者 1楼 发表于: 2013-03-03
关掉文件重新打开另外一个文件过程中出现卡顿是正常的现象啊……只要你的电脑够强大速度够快这个卡顿应该会减少的……
如果想去掉这个卡顿,那就自己去控制audiooutput的iodevice吧,你可以直接操纵这个device的,比如往后追加数据,控制pos的位置(这个位置跟播放的位置直接相关)
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线童话889

只看该作者 2楼 发表于: 2013-03-03
回 1楼(roywillow) 的帖子
我是在做网络的实时语音传输,我播放的是QBuffer缓存中的数据,但是他播放完第一帧,播放第二帧的时候就有卡顿的声音了,如果说不调用底层能解决吗
离线童话889

只看该作者 3楼 发表于: 2013-03-03
回 1楼(roywillow) 的帖子
补充:
    当我收到一帧时我就调用start进行数据播放,播放完成后,stop(),当收到第二帧时,再次start播放;
离线roywillow

只看该作者 4楼 发表于: 2013-03-03
回 3楼(童话889) 的帖子
那么你就创建一个QBuffer一直用来存储传来的数据
新来的数据都追加到这个buffer的后面,这样audiooutput会一直播放下去,因为这个device后面始终有数据
然后定期清理前面播放过的数据,然后往前移动pos相同的字节数以保证播放的位置相对于数据的位置不变
这个定期可以用audiooutput的某个信号来解决,间隔可以自己定
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线童话889

只看该作者 5楼 发表于: 2013-03-04
回 4楼(roywillow) 的帖子
现在我不知道这个pos怎么改啊!是用QAudioOutput 里面的函数吗?我好像没看到有这样的函数啊!还有,我试过不清理前面的数据,(因为我不知道怎么清理)他确实没有卡顿了,但是会感觉到某个瞬间他播放的特别快,即使是我收到第二帧的时候才开始播放,以后都往后加,他也会播放到末尾的,总感觉播放的比传过来的数据块
离线roywillow

只看该作者 6楼 发表于: 2013-03-04
回 5楼(童话889) 的帖子
我记得QBuffer是个QIODevice,所以他有pos()和seek()可以用来监视和控制播放的位置
QAudioOutput我记得本身没有控制播放位置的函数,所以播放位置的控制就全部依赖于对iodevice的控制了
你大概需要监视一下QBuffer的pos(),发现快到末尾的时候就把下面的数据给追加上(或者后面的数据一来就追加上)
然后直接操纵存储QBuffer具体数据的QByteArray,清理掉前面的数据,并且把QBuffer的pos()往前挪一下
我曾经在处理一段音频的部分循环播放的时候用的这种方法,目前我还没找到更好的方法
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线lvhuat
只看该作者 7楼 发表于: 2013-03-04
关注,我今天也烦心这个。
快速回复
限100 字节
 
上一个 下一个