Qt+mpg123+openal播放MP3流
#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流的更多相关文章
- 使用openal与mpg123播放MP3,附带工程文件(转)
使用openal与mpg123播放MP3,附带工程文件 使用openal和mpg123播放MP3文件 使用静态编译,相关文件都在附件里 相关工程文件:openal_mpg123_player.7z 使 ...
- OpenAL播放pcm或wav数据流-windows/ios/android(一)
OpenAL播放pcm或wav数据流-windows/iOS/Android(一) 最近在研究渲染问题,本文采用openal做pcm和wav数据流播放,并非本地文件,demo是windows的,i ...
- 使用VLC发送TS流与播放TS流
使用VLC发送TS流与播放TS流 一.如何使用VLC发送TS流 1.添加一个文件至VLC 2.选择串流,继续 3.选择UDP,点击添加 4.输入地址及端口 5.选择h.264+mp3(TS) 6.ne ...
- 读取SD卡文件夹下的MP3文件和播放MP3文件
首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...
- 遭遇flash播放mp3诡异问题
在部分ie10+flash player 播放mp3,播放第二句话时,中断无法正常播放,(客户的机器上),自己公司的机器测试了几个,都没发现这个问题.其它浏览器(chrome,firefox)也没发现 ...
- Android命令行播放MP3音乐
/*************************************************************************** * Android命令行播放MP3音乐 * 说 ...
- ios开发——实用技术篇Swift篇&播放MP3
播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...
- 在C语言控制台程序中播放MP3音乐
游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...
- ubuntu 13.10 Rhythmbox不能播放mp3 和中文乱码的问题
1.ubuntu 13.10 Rhythmbox不能播放mp3的解决方法 软件中心搜索(ubuntu额外的版权受限软件)不带括号 2.中文乱码问题解决方法: 终端顺序操作 : 1. sudo ged ...
随机推荐
- CSS中的opacity,不透明度的坑
opacity的用法示例如下 /* 值是0到1之间的数值 */ opacity:0.5 opacity设置在元素上的时候,会出现什么效果? 答曰:如果不设置opacity的话,会显示效果为A(可以理解 ...
- mysql主主配置
数据安装完成后 配置信息 开启二进制文件复制 [client]port=3306[mysqld]basedir=/usr/local/mysqldatadir=/usr/local/mysql/da ...
- MyBatis-Plus
一.通用SQL 1.简介:(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 2.定义Javabean中成员变量所使用的的类型: ...
- Making every developer more productive with Visual Studio 2019
Today, in the Microsoft Connect(); 2018 keynote, Scott Guthrie announced the availability of Visual ...
- 用ES6创建一个简单工厂模式
1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式.我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂.工厂模式根据抽象程度的不同可以分为:简 ...
- 【DeepLearning】深入理解dropout正则化
本文为转载,作者:Microstrong0305 来源:CSDN 原文:https://blog.csdn.net/program_developer/article/details/80737724 ...
- How To Configure NetScaler AppFlow for SolarWinds
How To Configure NetScaler AppFlow for SolarWinds 来源 https://support.citrix.com/article/CTX227300 A ...
- ECMA262,JavaScript引擎,浏览器
相关阅读:https://www.cnblogs.com/970119449blog/p/8080133.html 相关阅读:https://www.jb51.net/article/75888.ht ...
- Linux-KVM虚拟化
kvm安装 1.在宿主机上准备好yum(只需要本地镜像yum就可以) 2.查看CPU是否支持inter或AMD的虚拟技术 # cat /proc/cpuinfo |grep -E "vmx| ...
- Centos下MariaDB操作
MariaDB简介 MariaDB是mysql数据库的一个分支,操作几乎和mysql一样 MariaDB安装.启动.停止 # 安装 yum -y install mariadb mariadb-ser ...