oss alsa 音频播放 SOS!!!!

时间:2021-12-16 04:00:11
被抓去搞linux下的音频开发!!! oss alsa 音频播放 SOS!!!!, 实在不行了!!只能大家发出SOS信号拉!! oss alsa 音频播放 SOS!!!!
在网上查了一些资料,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来处理的话,那么就会得到楼主所说的播放得太快了的效果。

好久木有搞这些东东了,仅供参考。

#6


引用 5 楼 pathuang68 的回复:
如果楼主在网上搜过,那么下面这篇文章,楼主肯定是读过了:
https://www.ibm.com/developerworks/cn/linux/l-audio/

这篇文章写得已经非常详细了,再仔细读读吧。

如果是播放太快这类的问题,估计是你的程序搞乱了音频数据的timestamp。俺曾经帮助一个朋友解决过类似的问题,他当时播放得太慢了。

一般的音频编码是这样的:
[time……


请问一下要怎么设置timestamp的时间呢??实在是不懂,以前没接触过这方面的知识,看资料似乎都挺简单的,也就是设置采样格式、设置声道数、设置采样率、从文件读入数据再向设备写入数据就行了。可事实确实。。。。

#7


引用 6 楼 lanneret1234 的回复:
引用 5 楼 pathuang68 的回复:
如果楼主在网上搜过,那么下面这篇文章,楼主肯定是读过了:
https://www.ibm.com/developerworks/cn/linux/l-audio/

这篇文章写得已经非常详细了,再仔细读读吧。

如果是播放太快这类的问题,估计是你的程序搞乱了音频数据的timestamp。俺曾经帮助一个朋友解决过类似的问题,他当时播放得太慢……


上面我只是举一个例子。

设定timestamp是编码的时候做的事情,解码的时候,不需要写timestamp,只要正确地读出来,并在timestamp指定的时间间隔,播放音频数据就OK了。

#8


不清楚
google下

#9


oss alsa 音频播放 SOS!!!!
问题解决啦!!原来是驱动没装好!!
原来还不敢怀疑的!!去官网下了他的工具包(alsa-utils-1.0.24.2.tar.bz2)。里面有一个播放和录音的例子,竟然也不行!!就她奶的重装alsa驱动再重启!!神奇的行啦!发现那音乐真好听!!痛苦了几天!
在此谢谢大家的回复 oss alsa 音频播放 SOS!!!!

#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来处理的话,那么就会得到楼主所说的播放得太快了的效果。

好久木有搞这些东东了,仅供参考。

#6


引用 5 楼 pathuang68 的回复:
如果楼主在网上搜过,那么下面这篇文章,楼主肯定是读过了:
https://www.ibm.com/developerworks/cn/linux/l-audio/

这篇文章写得已经非常详细了,再仔细读读吧。

如果是播放太快这类的问题,估计是你的程序搞乱了音频数据的timestamp。俺曾经帮助一个朋友解决过类似的问题,他当时播放得太慢了。

一般的音频编码是这样的:
[time……


请问一下要怎么设置timestamp的时间呢??实在是不懂,以前没接触过这方面的知识,看资料似乎都挺简单的,也就是设置采样格式、设置声道数、设置采样率、从文件读入数据再向设备写入数据就行了。可事实确实。。。。

#7


引用 6 楼 lanneret1234 的回复:
引用 5 楼 pathuang68 的回复:
如果楼主在网上搜过,那么下面这篇文章,楼主肯定是读过了:
https://www.ibm.com/developerworks/cn/linux/l-audio/

这篇文章写得已经非常详细了,再仔细读读吧。

如果是播放太快这类的问题,估计是你的程序搞乱了音频数据的timestamp。俺曾经帮助一个朋友解决过类似的问题,他当时播放得太慢……


上面我只是举一个例子。

设定timestamp是编码的时候做的事情,解码的时候,不需要写timestamp,只要正确地读出来,并在timestamp指定的时间间隔,播放音频数据就OK了。

#8


不清楚
google下

#9


oss alsa 音频播放 SOS!!!!
问题解决啦!!原来是驱动没装好!!
原来还不敢怀疑的!!去官网下了他的工具包(alsa-utils-1.0.24.2.tar.bz2)。里面有一个播放和录音的例子,竟然也不行!!就她奶的重装alsa驱动再重启!!神奇的行啦!发现那音乐真好听!!痛苦了几天!
在此谢谢大家的回复 oss alsa 音频播放 SOS!!!!