導讀:
本文集主要講的是,dlna的投屏底層的原理,以及一步步的教你實現(xiàn),對網(wǎng)絡圖片/視頻或者本地的圖片/視頻的投屏到電視盒子上面(demo里面用的是電信的悅me盒子)
PS由于第一次接觸投屏,我只講我自己的理解,以及自己項目里面的所使用的功能模塊,如有理解不到位的,可以一起交流學習下。??????
主要參考:
說明:
對于投屏功能,本文主要是利用的iOS DLNA投屏功能了解一下,里的框架,感謝作者的源碼。
我是根據(jù)作者的代碼,新增了一些實際需要的方法,以及實現(xiàn)了可講本地圖片、視頻投影到盒子上面。
具體的代碼見gitHubDemo里面的具體的包括實現(xiàn)都有具體的實現(xiàn)
我們從upnp中文文檔,可大致可得出下面的流程
1.尋址
2.發(fā)現(xiàn)
3.描述
4.控制、事件、展示
下面我結合悅me盒子來做具體的描述
1.尋址:設備通過尋址來獲得一個網(wǎng)絡地址 (具體的說明見upnp中文文檔)
這是設備和路由完成的
2.發(fā)現(xiàn)
當設備已經有自己的ip地址(步驟1),那么怎么樣才能獲取到設備呢?
我們可以通過udp請求,來喊話
發(fā)現(xiàn)設備:搜索請求消息字符串
NSData * sendData = [[self getSearchString] dataUsingEncoding:NSUTF8StringEncoding];
[_udpSocket sendData:sendData toHost:ssdpAddres port:ssdpPort withTimeout:-1 tag:1];
其中:getSearchString為:
[NSString stringWithFormat:
@"M-SEARCH * HTTP/1.1\r\nHOST: %@:%d\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: %@\r\nUSER-AGENT: iOS UPnP/1.1 mccree/1.0\r\n\r\n",
ssdpAddres,
ssdpPort,
serviceType_AVTransport];
-----
ssdpAddres --> @"239.255.255.250";
ssdpPort --> 1900;
serviceType_AVTransport -->@"urn:schemas-upnp-org:service:AVTransport:1";
通過upd來發(fā)送消息,此時在同一個局域網(wǎng)的設備,會收到該消息,然后返回自己的設備信息,下面是悅me盒子返回的示例
HTTP/1.1 200 OK
Location: http://192.168.124.43:1266/
Cache-Control: max-age=1800
Server: UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2
EXT:
USN: uuid:skyworth&208B3756FFED&192.168.124.43::urn:schemas-upnp-org:service:AVTransport:1
ST: urn:schemas-upnp-org:service:AVTransport:1
Date: Thu, 24 Jan 2019 02:38:18 GMT
3.描述 我們發(fā)現(xiàn)了設備,看第2步只會返回一些基本的信息,我們還需要去獲取設備的詳細的信息
我們通過向步驟2拿到的location發(fā)送get請求
get:http://192.168.124.43:1266/
返回信息如下:
<html>
<head></head>
<body>
{type:1 name:root xml:"
<root xmlns="urn:schemas-upnp-org:device-1-0" xmlns:dlna="urn:schemas-dlna-org:device-1-0">
<specversion>
<major>
1
</major>
<minor>
0
</minor>
</specversion>
<device>
<devicetype>
urn:schemas-upnp-org:device:MediaRenderer:1
</devicetype>
<friendlyname>
YuemeTV
</friendlyname>
<manufacturer>
GeniusGitHub
</manufacturer>
<manufacturerurl>
https://github.com/geniusgithub
</manufacturerurl>
<modeldescription>
GeniusGitHub AV Media Renderer Device
</modeldescription>
<modelname>
Genius Software
</modelname>
<modelurl>
https://github.com/geniusgithub
</modelurl>
<modelnumber>
20130520
</modelnumber>
<serialnumber />
<udn>
uuid:skyworth&208B3756FFED&192.168.124.43
</udn>
<dlna:x_dlnadoc xmlns:dlna="urn:schemas-dlna-org:device-1-0">
DMR-1.50
</dlna:x_dlnadoc>
<servicelist>
<service>
<servicetype>
urn:schemas-upnp-org:service:AVTransport:1
</servicetype>
<serviceid>
urn:upnp-org:serviceId:AVTransport
</serviceid>
<scpdurl>
/AVTransport/skyworth&208B3756FFED&192.168.124.43/scpd.xml
</scpdurl>
<controlurl>
/AVTransport/skyworth&208B3756FFED&192.168.124.43/control.xml
</controlurl>
<eventsuburl>
/AVTransport/skyworth&208B3756FFED&192.168.124.43/event.xml
</eventsuburl>
</service>
<service>
<servicetype>
urn:schemas-upnp-org:service:ConnectionManager:1
</servicetype>
<serviceid>
urn:upnp-org:serviceId:ConnectionManager
</serviceid>
<scpdurl>
/ConnectionManager/skyworth&208B3756FFED&192.168.124.43/scpd.xml
</scpdurl>
<controlurl>
/ConnectionManager/skyworth&208B3756FFED&192.168.124.43/control.xml
</controlurl>
<eventsuburl>
/ConnectionManager/skyworth&208B3756FFED&192.168.124.43/event.xml
</eventsuburl>
</service>
<service>
<servicetype>
urn:schemas-upnp-org:service:RenderingControl:1
</servicetype>
<serviceid>
urn:upnp-org:serviceId:RenderingControl
</serviceid>
<scpdurl>
/RenderingControl/skyworth&208B3756FFED&192.168.124.43/scpd.xml
</scpdurl>
<controlurl>
/RenderingControl/skyworth&208B3756FFED&192.168.124.43/control.xml
</controlurl>
<eventsuburl>
/RenderingControl/skyworth&208B3756FFED&192.168.124.43/event.xml
</eventsuburl>
</service>
</servicelist></device>
</root>"}
</body>
</html>
這個格式很清晰地描述了設備的詳細信息,比如設備的名字:YuemeTV,設備類型是媒體渲染播放器、制造商相關信息、UUID、以及它提供的服務列表,每個服務都有serviceType, serviceId, SCPDURL, controlURL和eventSubURL等
比如:serviceType為urn:schemas-upnp-org:service:AVTransport:1,表示這個服務提供的是音視頻傳輸服務,版本號是1
4.接下來:我們怎么使用這些服務呢?
SCPDURL這個字段的內容就是提供的使用路徑
將:前面拿到的設備 ip和端口 以及SCPDURL字段的內容,拼接成url即可
以 /AVTransport/skyworth&208B3756FFED&192.168.124.43/scpd.xml為例
發(fā)送請求:
<html>
<head></head>
<body>
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<specversion>
<major>
1
</major>
<minor>
0
</minor>
</specversion>
<actionlist>
<action>
<name>
GetCurrentTransportActions
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Actions
</name>
<direction>
out
</direction>
<relatedstatevariable>
CurrentTransportActions
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
GetDeviceCapabilities
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
PlayMedia
</name>
<direction>
out
</direction>
<relatedstatevariable>
PossiblePlaybackStorageMedia
</relatedstatevariable>
</argument>
<argument>
<name>
RecMedia
</name>
<direction>
out
</direction>
<relatedstatevariable>
PossibleRecordStorageMedia
</relatedstatevariable>
</argument>
<argument>
<name>
RecQualityModes
</name>
<direction>
out
</direction>
<relatedstatevariable>
PossibleRecordQualityModes
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
GetMediaInfo
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
NrTracks
</name>
<direction>
out
</direction>
<relatedstatevariable>
NumberOfTracks
</relatedstatevariable>
</argument>
<argument>
<name>
MediaDuration
</name>
<direction>
out
</direction>
<relatedstatevariable>
CurrentMediaDuration
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentURI
</name>
<direction>
out
</direction>
<relatedstatevariable>
AVTransportURI
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentURIMetaData
</name>
<direction>
out
</direction>
<relatedstatevariable>
AVTransportURIMetaData
</relatedstatevariable>
</argument>
<argument>
<name>
NextURI
</name>
<direction>
out
</direction>
<relatedstatevariable>
NextAVTransportURI
</relatedstatevariable>
</argument>
<argument>
<name>
NextURIMetaData
</name>
<direction>
out
</direction>
<relatedstatevariable>
NextAVTransportURIMetaData
</relatedstatevariable>
</argument>
<argument>
<name>
PlayMedium
</name>
<direction>
out
</direction>
<relatedstatevariable>
PlaybackStorageMedium
</relatedstatevariable>
</argument>
<argument>
<name>
RecordMedium
</name>
<direction>
out
</direction>
<relatedstatevariable>
RecordStorageMedium
</relatedstatevariable>
</argument>
<argument>
<name>
WriteStatus
</name>
<direction>
out
</direction>
<relatedstatevariable>
RecordMediumWriteStatus
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
GetPositionInfo
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Track
</name>
<direction>
out
</direction>
<relatedstatevariable>
CurrentTrack
</relatedstatevariable>
</argument>
<argument>
<name>
TrackDuration
</name>
<direction>
out
</direction>
<relatedstatevariable>
CurrentTrackDuration
</relatedstatevariable>
</argument>
<argument>
<name>
TrackMetaData
</name>
<direction>
out
</direction>
<relatedstatevariable>
CurrentTrackMetaData
</relatedstatevariable>
</argument>
<argument>
<name>
TrackURI
</name>
<direction>
out
</direction>
<relatedstatevariable>
CurrentTrackURI
</relatedstatevariable>
</argument>
<argument>
<name>
RelTime
</name>
<direction>
out
</direction>
<relatedstatevariable>
RelativeTimePosition
</relatedstatevariable>
</argument>
<argument>
<name>
AbsTime
</name>
<direction>
out
</direction>
<relatedstatevariable>
AbsoluteTimePosition
</relatedstatevariable>
</argument>
<argument>
<name>
RelCount
</name>
<direction>
out
</direction>
<relatedstatevariable>
RelativeCounterPosition
</relatedstatevariable>
</argument>
<argument>
<name>
AbsCount
</name>
<direction>
out
</direction>
<relatedstatevariable>
AbsoluteCounterPosition
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
GetTransportInfo
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentTransportState
</name>
<direction>
out
</direction>
<relatedstatevariable>
TransportState
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentTransportStatus
</name>
<direction>
out
</direction>
<relatedstatevariable>
TransportStatus
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentSpeed
</name>
<direction>
out
</direction>
<relatedstatevariable>
TransportPlaySpeed
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
GetTransportSettings
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
PlayMode
</name>
<direction>
out
</direction>
<relatedstatevariable>
CurrentPlayMode
</relatedstatevariable>
</argument>
<argument>
<name>
RecQualityMode
</name>
<direction>
out
</direction>
<relatedstatevariable>
CurrentRecordQualityMode
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
Next
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
Pause
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
Play
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Speed
</name>
<direction>
in
</direction>
<relatedstatevariable>
TransportPlaySpeed
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
Previous
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
Seek
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Unit
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_SeekMode
</relatedstatevariable>
</argument>
<argument>
<name>
Target
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_SeekTarget
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
SetAVTransportURI
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentURI
</name>
<direction>
in
</direction>
<relatedstatevariable>
AVTransportURI
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentURIMetaData
</name>
<direction>
in
</direction>
<relatedstatevariable>
AVTransportURIMetaData
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
SetPlayMode
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
NewPlayMode
</name>
<direction>
in
</direction>
<relatedstatevariable>
CurrentPlayMode
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
Stop
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
</argumentlist>
</action>
</actionlist>
<servicestatetable>
<statevariable sendevents="no">
<name>
CurrentPlayMode
</name>
<datatype>
string
</datatype>
<defaultvalue>
NORMAL
</defaultvalue>
<allowedvaluelist>
<allowedvalue>
NORMAL
</allowedvalue>
<allowedvalue>
REPEAT_ONE
</allowedvalue>
<allowedvalue>
REPEAT_ALL
</allowedvalue>
<allowedvalue>
SHUFFLE
</allowedvalue>
<allowedvalue>
SHUFFLE_NOREPEAT
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
RecordStorageMedium
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
NOT_IMPLEMENTED
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="yes">
<name>
LastChange
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
RelativeTimePosition
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
CurrentTrackURI
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
CurrentTrackDuration
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
CurrentRecordQualityMode
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
NOT_IMPLEMENTED
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
CurrentMediaDuration
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
AbsoluteCounterPosition
</name>
<datatype>
i4
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
RelativeCounterPosition
</name>
<datatype>
i4
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
A_ARG_TYPE_InstanceID
</name>
<datatype>
ui4
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
AVTransportURI
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
TransportState
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
STOPPED
</allowedvalue>
<allowedvalue>
PAUSED_PLAYBACK
</allowedvalue>
<allowedvalue>
PLAYING
</allowedvalue>
<allowedvalue>
TRANSITIONING
</allowedvalue>
<allowedvalue>
NO_MEDIA_PRESENT
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
CurrentTrackMetaData
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
NextAVTransportURI
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
PossibleRecordQualityModes
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
NOT_IMPLEMENTED
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
CurrentTrack
</name>
<datatype>
ui4
</datatype>
<allowedvaluerange>
<minimum>
0
</minimum>
<maximum>
65535
</maximum>
<step>
1
</step>
</allowedvaluerange>
</statevariable>
<statevariable sendevents="no">
<name>
AbsoluteTimePosition
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
NextAVTransportURIMetaData
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
PlaybackStorageMedium
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
NONE
</allowedvalue>
<allowedvalue>
UNKNOWN
</allowedvalue>
<allowedvalue>
CD-DA
</allowedvalue>
<allowedvalue>
HDD
</allowedvalue>
<allowedvalue>
NETWORK
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
CurrentTransportActions
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
RecordMediumWriteStatus
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
NOT_IMPLEMENTED
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
PossiblePlaybackStorageMedia
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
NONE
</allowedvalue>
<allowedvalue>
UNKNOWN
</allowedvalue>
<allowedvalue>
CD-DA
</allowedvalue>
<allowedvalue>
HDD
</allowedvalue>
<allowedvalue>
NETWORK
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
AVTransportURIMetaData
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
NumberOfTracks
</name>
<datatype>
ui4
</datatype>
<allowedvaluerange>
<minimum>
0
</minimum>
<maximum>
65535
</maximum>
</allowedvaluerange>
</statevariable>
<statevariable sendevents="no">
<name>
A_ARG_TYPE_SeekMode
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
REL_TIME
</allowedvalue>
<allowedvalue>
TRACK_NR
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
A_ARG_TYPE_SeekTarget
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
PossibleRecordStorageMedia
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
NOT_IMPLEMENTED
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
TransportStatus
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
OK
</allowedvalue>
<allowedvalue>
ERROR_OCCURRED
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
TransportPlaySpeed
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
1
</allowedvalue>
</allowedvaluelist>
</statevariable>
</servicestatetable>
</scpd>
</body>
</html>
該服務提供了一個actionList即動作列表,一個服務會包含一個或多個功能請求動作,如actionList下這個SetAVTransportURI,顧名思義,這個請求的功能是將一個音視頻資源的URI發(fā)送給渲染端。一個動作(Action)就好比一個API請求,你還需要傳遞一些要求的參數(shù),這時就會用到該Action后面argumentList里規(guī)定的一些Argument。比如根據(jù)第一個參數(shù)<name>CurrentURI</name>,表示的就是你想發(fā)送的URI;同時<direction>in</direction>表示的是這是一個傳入?yún)?shù),如果為out則表示該Action會返回給你這個參數(shù)的值. action如:play播放指令,pause暫停指令,獲取播放的媒體的信息GetTransportInfo指令等等
5.控制服務controlurl具體的信息
同理4
<html>
<head></head>
<body>
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<specversion>
<major>
1
</major>
<minor>
0
</minor>
</specversion>
<actionlist>
<action>
<name>
GetMute
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Channel
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_Channel
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentMute
</name>
<direction>
out
</direction>
<relatedstatevariable>
Mute
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
GetVolume
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Channel
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_Channel
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentVolume
</name>
<direction>
out
</direction>
<relatedstatevariable>
Volume
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
GetVolumeDB
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Channel
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_Channel
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentVolume
</name>
<direction>
out
</direction>
<relatedstatevariable>
VolumeDB
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
GetVolumeDBRange
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Channel
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_Channel
</relatedstatevariable>
</argument>
<argument>
<name>
MinValue
</name>
<direction>
out
</direction>
<relatedstatevariable>
VolumeDB
</relatedstatevariable>
</argument>
<argument>
<name>
MaxValue
</name>
<direction>
out
</direction>
<relatedstatevariable>
VolumeDB
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
ListPresets
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
CurrentPresetNameList
</name>
<direction>
out
</direction>
<relatedstatevariable>
PresetNameList
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
SelectPreset
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
PresetName
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_PresetName
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
SetMute
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Channel
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_Channel
</relatedstatevariable>
</argument>
<argument>
<name>
DesiredMute
</name>
<direction>
in
</direction>
<relatedstatevariable>
Mute
</relatedstatevariable>
</argument>
</argumentlist>
</action>
<action>
<name>
SetVolume
</name>
<argumentlist>
<argument>
<name>
InstanceID
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_InstanceID
</relatedstatevariable>
</argument>
<argument>
<name>
Channel
</name>
<direction>
in
</direction>
<relatedstatevariable>
A_ARG_TYPE_Channel
</relatedstatevariable>
</argument>
<argument>
<name>
DesiredVolume
</name>
<direction>
in
</direction>
<relatedstatevariable>
Volume
</relatedstatevariable>
</argument>
</argumentlist>
</action>
</actionlist>
<servicestatetable>
<statevariable sendevents="yes">
<name>
LastChange
</name>
<datatype>
string
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
A_ARG_TYPE_Channel
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
Master
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
A_ARG_TYPE_InstanceID
</name>
<datatype>
ui4
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
Volume
</name>
<datatype>
ui2
</datatype>
<allowedvaluerange>
<minimum>
0
</minimum>
<maximum>
100
</maximum>
<step>
1
</step>
</allowedvaluerange>
</statevariable>
<statevariable sendevents="no">
<name>
Mute
</name>
<datatype>
boolean
</datatype>
</statevariable>
<statevariable sendevents="no">
<name>
PresetNameList
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
FactoryDefaults
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
A_ARG_TYPE_PresetName
</name>
<datatype>
string
</datatype>
<allowedvaluelist>
<allowedvalue>
FactoryDefaults
</allowedvalue>
</allowedvaluelist>
</statevariable>
<statevariable sendevents="no">
<name>
VolumeDB
</name>
<datatype>
i2
</datatype>
<allowedvaluerange>
<minimum>
-32767
</minimum>
<maximum>
32767
</maximum>
</allowedvaluerange>
</statevariable>
</servicestatetable>
</scpd>
</body>
</html>
里面包含了:設置音量的動作指令:SetVolume、快退進Seek、獲取音量GetVolume等等
下面具體怎么控制的呢?詳見 DLNA(二)
友情鏈接: