首页 > 应用开发 > IT综合 > 直播带货系统,实现直播音频的播放
这是一篇关于直播带货系统直播音频播放的文章,参考自苹果OS X的demo。
在移植到iOS后,可以通过iphone播放Mac上面的音频,实现在直播音频播放的功能。
本文可以学习到 socket编程、 AudioFileStream转换音频流、 AudioQueue播放音频、 信号量的使用。
demo有两个工程,分别是
servers和
client。
servers是OS X的应用,作为服务端,负责发送音频流数据;
client是iOS的应用,直播带货系统作为客户端,负责接收音频流数据;
音频数据通过AudioFileStream转换后,调用AudioQueue进行播放,中间会用到信号量进行等待和同步。
1、socket编程
bind方法用于绑定接口,然后用listen监听tcp连接请求,accept用于接受tcp连接;
fopen打开音频文件,fread读取音频数据,send对建立的连接发送音频流;
对已经失效的socket,send两次数据就会触发SIGPIPE信号,默认的处理是关闭进程。
2、AudioQueue播放音频
AudioQueue的播放时,需要先给audioBuffer填充数据,并把audioBuffer放入AudioQueue,然后通知AudioQueue开始播放;
AudioQueue从已经填充的audioBuffer里面开始播放数据,实时把播放完毕的audioBuffer回调给直播带货系统业务层,业务继续填充播放完毕的audioBuffer,重复流程直到音频播放完毕。
配置AudioQueue
开始播放
播放结束
3、互斥锁
普通锁
pthread_mutex_lock(mutex) 加锁,可能会阻塞;
pthread_mutex_unlock(mutex) 解锁;
条件锁(pthread_cond_wait)
调用pthread_cond_wait时,条件不成立则阻塞,直到条件成立;
调用pthread_cond_wait前,要先调用pthread_mutex_lock(mutex)加锁,pthread_cond_wait会在调用结束解锁mutex;
pthread_cond_wait条件满足后(pthread_cond_signal被调用),会对mutex加锁,当我们执行完程序时需要对mutex解锁;
调用pthread_cond_wait时,为了防止并发放入阻塞队列,所以需要提前对mutex加锁;
申请条件锁
释放条件锁
4、AudioFileStream转换直播带货系统音频流
AudioFileStream可以用来读取音频流信息和分离音频帧,与之类似的API簇还有AudioFile和ExtAudioFile。
AudioFileStream可以用在线音频流,也可以使用本地文件。
附录
demo中用到用到的一些方法:
AudioFileStreamParseBytes 解析数据,会调用之前设置好的
AudioFileStream_PropertyListenerProc 和
AudioFileStream_PacketsProc 回调函数;
AudioFileStreamOpen 打开一个音频流转换器,需要设置
AudioFileStream_PropertyListenerProc 和
AudioFileStream_PacketsProc 回调函数;
MyPropertyListenerProc 音频属性回调函数;
MyPacketsProc 数据回调函数;
MyEnqueueBuffer 把buffer里面的数据传入AudioQueue;
WaitForFreeBuffer 当前所有buffer已经占用满,等待AudioQueue播放完释放buffer;
MyAudioQueueOutputCallback AudioQueue释放buffer的回调函数;
MyAudioQueueIsRunningCallback AudioQueue是否在播放的回调函数;
MyConnectSocket 建立socket链接
demo 的代码地址在这里
传送门。
demo的打开方式:
server是服务端,运行在OS X
有binary和app两种方式
client是客户端,运行在iOS
这个demo很有意思:用到很多知识点,而且很简单,非常适合学习。
声明:本文由云豹科技转发自 落影博客,如有侵权请联系作者删除
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70002045/viewspace-2784396/ ,如需转载,请注明出处,否则将追究法律责任。