在网上查了一些资料,linux的音频驱动主要有OSS和ALSA两种,
他们的大概流程也差不多,也就是
(1)打开音频设备;
(2)设置采样格式(即量化位数);
(3)设置声道数(单声道或者立体声);
(4)设置采样率(即采样速度);
(5)从设备读入数据或者向设备写入数据;
(6)关闭音频设备;
也下载了一些例子,可是呢!不管是OSS和ALSA的例子在我的机器上总是不行,表现为播放太快,几分钟的wav文件10来秒叽哩咕噜的就没了,我就在读数据与写数据之间用usleep()暂停一下,就可以播放,只是播放的效果很差,很多杂音。
使用mplayer和ALSA的player命令来播放都没问题,这样我的驱动应该是没事的,应该是我程序里一些参数没设置好。
网上资料说 unsigned char buf[采样频率 * 量化位数* 声道数/ 8]; /*buf里面正好放一秒钟的音频,下面的计时还要用*/
是播放一分钟的数据,可是我把这些数据write设备一下就播完了,根本没一秒钟,我个人理解是,我在调用write向音频驱动写数据时,是先写到驱动的缓存区里,当缓存区满时就会阻塞,等缓存区有空间时再从我的缓存区里读数据,直到把我缓存区的数据读完。不知道我的理解对不对。
大家有没有什么OSS或ALSA播放音频的例子,最好是在你的机器上确定可以正常跑起来的,发给小弟参考一下,在此先谢过!!
9 个解决方案
#1
没玩过 帮顶!
#2
去LINUX版问问
#3
网上多下载一些例子吧!!!
#4
真不懂,只能搜索了
#5
如果楼主在网上搜过,那么下面这篇文章,楼主肯定是读过了:
https://www.ibm.com/developerworks/cn/linux/l-audio/
这篇文章写得已经非常详细了,再仔细读读吧。
如果是播放太快这类的问题,估计是你的程序搞乱了音频数据的timestamp。俺曾经帮助一个朋友解决过类似的问题,他当时播放得太慢了。
一般的音频编码是这样的:
[timestamp0]音频数据0[timestamp1]音频数据1...[timestampn]音频数据0
假定正常播放的情况下timestamp0 = 0,timestamp1 = 1000ms,那么如果你的程序吧timestamp1当成10ms来处理的话,那么就会得到楼主所说的播放得太快了的效果。
好久木有搞这些东东了,仅供参考。
https://www.ibm.com/developerworks/cn/linux/l-audio/
这篇文章写得已经非常详细了,再仔细读读吧。
如果是播放太快这类的问题,估计是你的程序搞乱了音频数据的timestamp。俺曾经帮助一个朋友解决过类似的问题,他当时播放得太慢了。
一般的音频编码是这样的:
[timestamp0]音频数据0[timestamp1]音频数据1...[timestampn]音频数据0
假定正常播放的情况下timestamp0 = 0,timestamp1 = 1000ms,那么如果你的程序吧timestamp1当成10ms来处理的话,那么就会得到楼主所说的播放得太快了的效果。
好久木有搞这些东东了,仅供参考。
#6
请问一下要怎么设置timestamp的时间呢??实在是不懂,以前没接触过这方面的知识,看资料似乎都挺简单的,也就是设置采样格式、设置声道数、设置采样率、从文件读入数据再向设备写入数据就行了。可事实确实。。。。
#7
上面我只是举一个例子。
设定timestamp是编码的时候做的事情,解码的时候,不需要写timestamp,只要正确地读出来,并在timestamp指定的时间间隔,播放音频数据就OK了。
#8
不清楚
google下
google下
#9
问题解决啦!!原来是驱动没装好!!
原来还不敢怀疑的!!去官网下了他的工具包(alsa-utils-1.0.24.2.tar.bz2)。里面有一个播放和录音的例子,竟然也不行!!就她奶的重装alsa驱动再重启!!神奇的行啦!发现那音乐真好听!!痛苦了几天!
在此谢谢大家的回复
#1
没玩过 帮顶!
#2
去LINUX版问问
#3
网上多下载一些例子吧!!!
#4
真不懂,只能搜索了
#5
如果楼主在网上搜过,那么下面这篇文章,楼主肯定是读过了:
https://www.ibm.com/developerworks/cn/linux/l-audio/
这篇文章写得已经非常详细了,再仔细读读吧。
如果是播放太快这类的问题,估计是你的程序搞乱了音频数据的timestamp。俺曾经帮助一个朋友解决过类似的问题,他当时播放得太慢了。
一般的音频编码是这样的:
[timestamp0]音频数据0[timestamp1]音频数据1...[timestampn]音频数据0
假定正常播放的情况下timestamp0 = 0,timestamp1 = 1000ms,那么如果你的程序吧timestamp1当成10ms来处理的话,那么就会得到楼主所说的播放得太快了的效果。
好久木有搞这些东东了,仅供参考。
https://www.ibm.com/developerworks/cn/linux/l-audio/
这篇文章写得已经非常详细了,再仔细读读吧。
如果是播放太快这类的问题,估计是你的程序搞乱了音频数据的timestamp。俺曾经帮助一个朋友解决过类似的问题,他当时播放得太慢了。
一般的音频编码是这样的:
[timestamp0]音频数据0[timestamp1]音频数据1...[timestampn]音频数据0
假定正常播放的情况下timestamp0 = 0,timestamp1 = 1000ms,那么如果你的程序吧timestamp1当成10ms来处理的话,那么就会得到楼主所说的播放得太快了的效果。
好久木有搞这些东东了,仅供参考。
#6
请问一下要怎么设置timestamp的时间呢??实在是不懂,以前没接触过这方面的知识,看资料似乎都挺简单的,也就是设置采样格式、设置声道数、设置采样率、从文件读入数据再向设备写入数据就行了。可事实确实。。。。
#7
上面我只是举一个例子。
设定timestamp是编码的时候做的事情,解码的时候,不需要写timestamp,只要正确地读出来,并在timestamp指定的时间间隔,播放音频数据就OK了。
#8
不清楚
google下
google下
#9
问题解决啦!!原来是驱动没装好!!
原来还不敢怀疑的!!去官网下了他的工具包(alsa-utils-1.0.24.2.tar.bz2)。里面有一个播放和录音的例子,竟然也不行!!就她奶的重装alsa驱动再重启!!神奇的行啦!发现那音乐真好听!!痛苦了几天!
在此谢谢大家的回复