- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
本程序借助StreamSound进行流的形式播放声音,然后借助libFLAC进行FLAC文件的解码,把两者结合起来实现了FLAC文件的播放。
硬盘太慢的话效果会很差的。
有关FLAC和libFLAC的信息参见此帖:http://www.0xaa55.com/thread-711-1-1.html
有关StreamSound的信息则参见此帖:http://www.0xaa55.com/thread-693-1-1.html
BIN:
PlayFLAC.7z
(42.26 KB, 下载次数: 4, 售价: 2 个宅币)
SRC:
PlayFLAC.7z
(583.97 KB, 下载次数: 5, 售价: 20 个宅币)
经过我的精心调试它已经完美支持无缝播放了。只要你的FLAC文件能被快速读取就行(也就是说太慢的硬盘,或者SD卡等设备或者直接播放网络上的文件会很作死。。)
libFLAC的解码流程就是你提供一堆回调函数(比如各种文件操作的回调、取得解码数据的回调、取得元数据的回调等),然后你去控制libFLAC进行一帧一帧地解码。一帧大概四千多字节,视文件而定。
而我的StreamSound的播放流程就是你提供一个填充缓冲区的回调函数,然后不断检测是否需要重新填充数据。当发现需要重新填充数据的时候,你就填充波形数据,它就播放,这就是流的形式的播放(你不断地填充数据,它不断地播放)。
要把这两者结合起来需要好好组织一下它们之间的关系。我的做法就是先初始化StreamSound,这个时候它会不断调用我的回调函数来请求波形声音数据。这个时候我就初始化libFLAC,通过控制它的解码来取得声音数据,然后将声音数据填充到StreamSound的缓冲区里。每次StreamSound请求数据的时候我就让libFLAC解码。最终就实现了FLAC文件的无缝播放。
说起来好像很简单,但是真要实践起来,写一个有价值的代码还是需要花点功夫的。光是写一个DEMO很简单,而要写一个能广泛用于各种用途的代码就需要周全的考虑。如果只是为了写一个DEMO的话就没有任何意义了。 |
|