基于 QPlay 的智能无线流媒体传输音箱的功能实现

本文详细介绍了基于QPlay的智能无线流媒体传输音箱的核心功能实现,包括QPlay认证、队列管理、设备离线处理及歌曲播放。QPlay认证涉及MID、DID和Code的验证;队列功能利用SetAVTransportURI等动作管理播放列表;设备离线功能确保在网络断开或关机时通知控制点;歌曲播放功能则依赖avconv进行在线解码播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于 QPlay 的智能无线流媒体传输音箱的功能实现

系统核心功能模块

系统需要实现的核心功能有QPlay认证功能,QPlay队列功能,设备离线功能,歌曲播放功能。

QPlay认证功能模块

QPlay认证功能处于系统的事件循环阶段。

事件回调函数event_handler()识别出事件类型(EventType)为UPNP_CONTROL_ACTION_REQUEST以及动作名称(ActionName)为"QPlayAuth"后,将调用函数qplayAuth()进行处理。

QPlay认证功能具体实现

QPlayAuth动作事件处理函数为qplayAuth,该函数用于提供QPlay认证所需的MID(制造商ID)、DID(设备类型ID)和Code(由Seed和PSK计算出的认证密钥)。

图为设备有关QPlayAuth动作的部分log信息。

QPlayAuth动作log信息

◆ qplayAuth函数具体代码:

static int qplayAuth(struct action_event *event) {
   
	int rc               = -1;
	char * seed         = NULL;
	char * code         = NULL;
	ENTER();
	struct DocumentData docDataArray[] = {
   
		{
    "Seed", &seed },
		{
    NULL, NULL },
	};
	rc = check_document_element_array(event, docDataArray);
	if (rc)
		goto out;

	code = md5sum_code(seed); // Calculate Code MD5
	if (code == NULL)
		goto out;
	qplay_set_value(QPLAY_VAR_A_ARG_TYPE_Code, code);
	upnp_append_variable(event, QPLAY_VAR_A_ARG_TYPE_Code, "Code");
	upnp_append_variable(event, QPLAY_VAR_A_ARG_TYPE_MID, "MID");
	upnp_append_variable(event, QPLAY_VAR_A_ARG_TYPE_DID, "DID");
out:
	FREE_SAFETY(seed);
	FREE_SAFETY(code);
	LEAVE();
	return rc;
}

QPlay认证功能具体表现

当QPlay设备的认证成功时,QQ音乐应用程序的设备列表中,该设备将显示为QPlay图标。如图所示通过认证的QPlay设备图标。

如果QPlay设备认证未成功,或是DLNA设备,则该设备将显示为普通扬声器设备图标,并且连接后会弹出“该设备尚未通过QPlay认证,部分操作可能无法正常使用。”。如图所示未通过认证的QPlay设备图标。

QPlay队列功能模块

QPlay队列功能处于系统的事件循环阶段。QPlay队列功能需要多个动作事件才能实现,主要有:“SetAVTransportURI”,“SetTracksInfo”,“Seek”,“Play”,“SetPlayMode"和"GetTracksInfo”。

QPlay队列功能方法实现

  1. 的SetAVTransportURI动作

SetAVTransportURI动作处理函数为set_avtransport_uri,SetAVTransportURI动作是DLNA规范规定的动作,在QPlay中被复用。

在QPlay中用于设置队列需要队列ID(QueueID),队列ID可以用于判断队列是否改变以及防止攻击等。

在SetAVTransportURI动作中标签的值如果开头为"qplay://",则是QPlay控制点(QQ音乐)的事件,后面是队列ID。否则,为一般DLNA控制点的事件。
在DLNA中则用于提供歌曲信息等,用于歌曲播放。

SetAVTransportURI动作log信息

  1. SetTracksInfo动作

SetTracksInfo动作处理函数为setTracksInfo,该函数用于设置QPlay队列。设备具有歌曲队列后,可以脱离QQ音乐引用程序等控制点进行播放。同时,支持设备端的切歌操作。

SetTracksInfo动作log信息

◆ set_avtransport_uri函数具体代码:

static int setTracksInfo(struct action_event *event) {
   
	i
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值