#ifndef PLAYSTREAM_H
#define PLAYSTREAM_H #include <QObject>
#include "../libMPG123/mpg123.h"
#include "../openal/include/al.h"
#include "../openal/include/alc.h"
#pragma comment (lib, "../openal/lib/OpenAL32.lib")
#pragma comment (lib, "../libMPG123/libmpg123.lib") class PlayStream : public QObject
{
Q_OBJECT public:
PlayStream(QObject *parent);
~PlayStream();
public:
//打开流
void OpenStream();
//播放实时流,需先调用OpenStream()
void Play(QByteArray datas);
//停止播放
void Stop();
//暂停播放
void Pasue();
private:
void init();
bool updataQueueBuffer();
void mpgClose(); private:
mpg123_handle *mh ;
ALCdevice *pDevice;
ALCcontext *pContext;
ALuint outSourceID;
long lRate;
}; #endif // PLAYSTREAM_H
#include "StdAfx.h"
#include "PlayStream.h" PlayStream::PlayStream(QObject *parent)
: QObject(parent)
{
init();
} PlayStream::~PlayStream()
{
mpgClose();
alcCloseDevice(pDevice);
alcDestroyContext(pContext);
} void PlayStream::init()
{
int err;
mpg123_init();
mh = mpg123_new(NULL,&err);
pDevice =alcOpenDevice(NULL);
if (pDevice)
{
pContext=alcCreateContext(pDevice,NULL);
alcMakeContextCurrent(pContext);
}
alGenSources(, &outSourceID);
alSourcei(outSourceID, AL_LOOPING, AL_FALSE);
alSourcef(outSourceID, AL_SOURCE_TYPE, AL_STREAMING);
} void PlayStream::Play(QByteArray datas)
{
updataQueueBuffer();
ALuint bufferID = ;
alGenBuffers(, &bufferID);
size_t done=;
size_t bufferSize=;
void *buffer=malloc(bufferSize);
ALuint ulFormat= alGetEnumValue("AL_FORMAT_STEREO16");
mpg123_decode(mh,(const unsigned char*)datas.constData(),datas.size(),(unsigned char *)buffer,bufferSize,&done);
if (done)
{
alBufferData(bufferID, ulFormat, buffer,done, );
alSourceQueueBuffers(outSourceID, , &bufferID);
}
ALint values;
alGetSourcei(outSourceID,AL_SOURCE_STATE,&values);
if (values != AL_PLAYING)
{
alSourcePlay(outSourceID);
}
alDeleteBuffers(, &bufferID);
free(buffer);
buffer=NULL;
} bool PlayStream::updataQueueBuffer()
{
ALint stateVaue;
int processed, queued;
alGetSourcei(outSourceID, AL_SOURCE_STATE, &stateVaue);
if (stateVaue == AL_STOPPED)
{
return false;
}
alGetSourcei(outSourceID, AL_BUFFERS_PROCESSED, &processed);
alGetSourcei(outSourceID, AL_BUFFERS_QUEUED, &queued);
while(processed--)
{
ALuint buff;
alSourceUnqueueBuffers(outSourceID, , &buff);
alDeleteBuffers(, &buff);
}
return true;
} void PlayStream::mpgClose()
{
alSourceStop(outSourceID);
alSourcei(outSourceID, AL_BUFFER, );
int err=mpg123_close(mh);
} void PlayStream::OpenStream()
{
int err=mpg123_open_feed(mh);
} void PlayStream::Stop()
{
mpgClose();
alcCloseDevice(pDevice);
alcDestroyContext(pContext);
} void PlayStream::Pasue()
{
alSourcePause(outSourceID);
}

Qt+mpg123+openal播放MP3流的更多相关文章

  1. 使用openal与mpg123播放MP3,附带工程文件(转)

    使用openal与mpg123播放MP3,附带工程文件 使用openal和mpg123播放MP3文件 使用静态编译,相关文件都在附件里 相关工程文件:openal_mpg123_player.7z 使 ...

  2. OpenAL播放pcm或wav数据流-windows/ios/android(一)

    OpenAL播放pcm或wav数据流-windows/iOS/Android(一)   最近在研究渲染问题,本文采用openal做pcm和wav数据流播放,并非本地文件,demo是windows的,i ...

  3. 使用VLC发送TS流与播放TS流

    使用VLC发送TS流与播放TS流 一.如何使用VLC发送TS流 1.添加一个文件至VLC 2.选择串流,继续 3.选择UDP,点击添加 4.输入地址及端口 5.选择h.264+mp3(TS) 6.ne ...

  4. 读取SD卡文件夹下的MP3文件和播放MP3文件

    首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...

  5. 遭遇flash播放mp3诡异问题

    在部分ie10+flash player 播放mp3,播放第二句话时,中断无法正常播放,(客户的机器上),自己公司的机器测试了几个,都没发现这个问题.其它浏览器(chrome,firefox)也没发现 ...

  6. Android命令行播放MP3音乐

    /*************************************************************************** * Android命令行播放MP3音乐 * 说 ...

  7. ios开发——实用技术篇Swift篇&播放MP3

    播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...

  8. 在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

  9. ubuntu 13.10 Rhythmbox不能播放mp3 和中文乱码的问题

    1.ubuntu 13.10 Rhythmbox不能播放mp3的解决方法 软件中心搜索(ubuntu额外的版权受限软件)不带括号 2.中文乱码问题解决方法: 终端顺序操作 : 1.  sudo ged ...

随机推荐

  1. 简单数论之整除&质因数分解&唯一分解定理

    [整除] 若a被b整除,即a是b的倍数,那么记作b|a("|"是整除符号),读作"b整除a"或"a能被b整除".b叫做a的约数(或因数),a ...

  2. (light oj 1102) Problem Makes Problem (组合数 + 乘法逆元)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1102 As I am fond of making easier problems, ...

  3. 菜鸟学python之大数据的初认识

    这次作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2639 1.这些分析所采用数据来源是什么? 国家数据库:中国铁路 ...

  4. MVC 全局过滤器

    1. 新创建一个类 CheckLogin2. 在类中加入以下代码 public class CheckLogin : ActionFilterAttribute { public override v ...

  5. Charles抓包工具使用

    Charles抓包工具使用和进行接口数据模拟 打开软件,选择Tools  >>  Map Local  >>  勾选enable  >>  add  >> ...

  6. 【zabbix教程系列】六、自动注册(Linux)

    一.agent安装脚本 #!/bin/bash #ltt #安装zabbix源 rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zab ...

  7. Vue组件开发

    在学习vue的时候,发现有很多使用vue开发的ui组件.本着学习的目的,自己也仿照Element写一些组件. 使用VuePress编写组件文档. 单元测试:karma+mocha+chai+sinon ...

  8. Azure DevOps

    Azure DevOps https://azure.microsoft.com/zh-cn/services/devops/ It looks great!

  9. 上传图片,通过node服务器存储在指定目录

    最近做毕设,需要上传图片,因为在本地服务器运行,所以想着前端上传后,通过node服务器接收图片,存储在指定的目录下. 一.前端实现 1.前端的页面和上传图片是利用element-ui组件实现的,&qu ...

  10. 关于【jq插件开发】

    很详细,原文链接:https://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html#commentform和https://www.cnblogs ...