关闭

SDL 混音同时播放多个媒体文件

1016人阅读 评论(0) 收藏 举报
分类:

转自http://blog.csdn.net/u013080313/article/details/50375098

首先,跟学习任何东西一样,官方的资料永远是最应该看的。传送门:sdl官方网站 http://www.libsdl.org/
好在org后缀的外网还能够上,SDL是开源的,包括源代码在内,都可以从官网上下载到。SDL并不能算作是音频库,更不是解码库,Simple DirectMedia Layer 从名字上来看就可以归结为一个媒体库(囊括了输入、输出、Video、Audio、Opengl、DX相关的多个方法)。

1.SDL_OpenAudio

这个函数很关键,这个函数将获取你设备的Audio并将其打开,无论你在当前的软件中的哪一个进程,都可以访问到这个设备,并对设备进行操作(列如:SDL_PauseAudio,SDL_CloseAudio)。
值得注意的是,设备Audio只能打开一次,我曾经尝试多线程打开多个Audio设备,最后都失败了,返回Error说Audio已经打开,那一瞬间我懵了,既然不能用多线程,如何播放多个音频呢?别急,奥秘在SDL_mixAudio里面,稍后我回提。

2.SDL_PauseAudio

每次调用这个函数,设备都将回调你在打开Audio时预设的回调函数(也就是SDL_AudioSpec.callback)。这样的回调允许你一次次的将PCM buffer填入Audio预设的steam中,使得设备顺利的播放音频文件。而如何将buffer填入steam中呢?则需要使用SDL_mixAudio。

3.PCM
什么是PCM?可以自习搜索PCM看详细的介绍。简单的来说,音频文件解压后的文件格式就是PCM,而SDL仅提供播放PCM和WAV(都是未压缩的文件格式)的播放方法。简单来说,要想播放MP3等通用格式,必须先解码成音频格式文件,再进行播放,当然也可以一边解压一边播放,只是需要使用多线程罢了。使用SDL_Thread来创建并管理线程,蛮方便的。(线程我以后再总结)

4.SDL_mixAudio
我最想说的就是这个,因为我苦苦寻求了半天的“同时播放多个音频文件”,奥秘就在SDL_mixAudio。这个函数其实很傻很简单,无非是把两个buffer内容叠加起来。于是你只需要把希望播放的音频buffer叠加在一起,就可以成功的播放多个音频文件。官方给的例子是这样的
void audio_callback(void *udata, Uint8 *stream, int len)
{
    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
}
这就是把stream与audio_pos两个buffer叠加到stream当中,其中的使用方式大家多试一试吧。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

最简单的视音频播放示例9:SDL2播放PCM

本文记录SDL播放音频的技术。在这里使用的版本是SDL2。实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API。在Windows平台下,SDL封装了Direct3D这类的API...
  • leixiaohua1020
  • leixiaohua1020
  • 2014-10-31 00:23
  • 22344

SDL_MixAudio函数

SDL_MixAudio函数:对音乐数据进行混音。void SDL_MixAudio(Uint8* dst, const Uint8* src, ...
  • caimouse
  • caimouse
  • 2016-12-07 10:03
  • 1710

SDL下播放声音文件

SDL在默认情况下,只支持WAV格式,如果要播放其他格式的文件我们能采用SDL_mixer,他支持WAV,MP3,MIDI,OGG,MOD,如果要支持更多的文件格式,我们就不得不采用其他库了.一. S...
  • gameboy12615
  • gameboy12615
  • 2010-07-09 16:52
  • 5699

SDL编程三(音频)

SDL播放声音的基本流程如下: (1)创建一个回调函数用于混合音频数据,并放入音频流; (2)设置音频参数,调用SDL_OpenAudio,打开音频设备; (3)调用SDL_Paus...
  • zqf_office
  • zqf_office
  • 2014-06-13 11:36
  • 2640

SDL 与 FFMPEG 音乐播放器开发(2)——混播多个音频

第一篇总体提了一下SDL,完全没有提到FFMPEG。我的思路是,在说解码之前,你起码要知道怎么使用解码后的文件。 相信大家如果看了网上的一些教程,应该已经能够播放出PCM文件。今天我来谈谈如何播放多个...
  • u013080313
  • u013080313
  • 2015-12-23 15:16
  • 905

ffmpeg+SDL能同时播放多路视频么?

转自: http://www.chinavideo.org/archiver/?tid-17184.html ffmpeg+SDL能同时播放多路视频么? 如题,有能实现的大侠么? ...
  • xiaoxianerqq
  • xiaoxianerqq
  • 2015-11-10 17:12
  • 1177

SDL2.0超简单入门 100行代码实现播放wav声音文件

sdl主要用图形界面显示及播放声音,本人刚刚接触sdl,写了个简单的入门程序,实现播放声音文件,现分享一下当做个笔记。 // sound2.cpp : 定义控制台应用程序的入口点。 // #inc...
  • coolgar2005
  • coolgar2005
  • 2015-02-05 00:36
  • 570

SDL播放wav音频分析

主机环境:Win7 SDLban'b 关于SDL音频播放的分析可以查看SDL2源代码中
  • key123zhangxing
  • key123zhangxing
  • 2014-09-24 23:21
  • 1608

FFMpeg+SDL多线程播放器

大家在网上搜索FFmpeg+SDL应该就能找到很多基于FFmpeg+SDL的播放器,如: 雷骁骅的100行代码实现FFMpeg+SDL的视频播放器:http://blog.csdn.net/leix...
  • nvniaobi
  • nvniaobi
  • 2015-11-19 12:35
  • 858

SDL 与 FFMPEG 音乐播放器开发(2)——混播多个音频

第一篇总体提了一下SDL,完全没有提到FFMPEG。我的思路是,在说解码之前,你起码要知道怎么使用解码后的文件。 相信大家如果看了网上的一些教程,应该已经能够播放出PCM文件。今天我来谈谈如何播放多个...
  • u013080313
  • u013080313
  • 2015-12-23 15:16
  • 905
    个人资料
    • 访问:50207次
    • 积分:728
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:95篇
    • 译文:0篇
    • 评论:7条
    最新评论