找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4368|回复: 1

【C】C语言写的FLAC文件播放器

[复制链接]

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24261 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2014-7-14 07:31:06 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本程序借助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的话就没有任何意义了。

本帖被以下淘专辑推荐:

回复

使用道具 举报

15

主题

39

回帖

246

积分

用户组: 中·技术宅

UID
5832
精华
0
威望
2 点
宅币
188 个
贡献
0 次
宅之契约
0 份
在线时间
39 小时
注册时间
2020-4-15
发表于 2020-4-30 11:23:42 | 显示全部楼层
非常感谢,正好可以学习一下了。
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-29 20:06 , Processed in 0.044395 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表