上篇我們對(duì)消息的格式和大部分的消息類型進(jìn)行了梳理,本編主要對(duì)命令消息其中的定義進(jìn)行梳理。
命令消息(Command Message) 用于在客戶端和服務(wù)器端傳輸AMF編碼的數(shù)據(jù)交換命令,客戶端或者服務(wù)端可以通過命令消息和對(duì)端通信的流完成請(qǐng)求遠(yuǎn)程方法調(diào)用(RPC)。當(dāng)消息使用 AMF0編碼時(shí),消息類型為20,使用AMF3編碼時(shí)為17。
命令消息使用場景基本都是——客戶端請(qǐng)求,服務(wù)端響應(yīng)
按來源分類
命令消息在客戶端和服務(wù)端中來回傳遞,為了方便區(qū)分,我根據(jù)請(qǐng)求和響應(yīng)根據(jù)場景將兩端為區(qū)分請(qǐng)求者和響應(yīng)者者。因此,請(qǐng)求者發(fā)出的就是請(qǐng)求命令信息,響應(yīng)者發(fā)出的就是響應(yīng)命令信息。
請(qǐng)求命令信息
請(qǐng)求者通過發(fā)送請(qǐng)求命令消息到對(duì)端,命令對(duì)端根據(jù)命令名執(zhí)行遠(yuǎn)程方法調(diào)用。例如發(fā)送connect(連接)、createStream(創(chuàng)建流)、pulish(發(fā)布)、play(播放)和pause(暫停)等命令。由于其消息數(shù)據(jù)進(jìn)行了 AMF 編碼,因此下面表格通過字段展示的是請(qǐng)求命令的結(jié)構(gòu):
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令名稱,設(shè)置為指定的命令,取值為 connect、 createStream、 pulish、play和pause等等 |
| Transaction ID | Number | 事務(wù)ID,該命令需要響應(yīng)則有指定ID,若不需要響應(yīng)填 0 即可 |
| Command Object | Object / Null | 命令對(duì)象,如果一些命令消息需要就用,否則置空即可 |
| Others | Unknow | 額外的參數(shù)值或?qū)ο?,根?jù)特定的命令來配置。若不需要,則省略整個(gè)字段即可。 |
響應(yīng)命令信息
響應(yīng)者接收到請(qǐng)求命令消息后,會(huì)對(duì)其消息進(jìn)行解析,并做相應(yīng)的處理。根據(jù)不同命令的要求,響應(yīng)者可能需要對(duì)請(qǐng)求者的請(qǐng)求進(jìn)行響應(yīng)。因此響應(yīng)者將發(fā)送相應(yīng)命令信息來完成響應(yīng)操作。響應(yīng)消息和請(qǐng)求消息類型,都是使用 AMF 編碼,因此通過字段來表示其命令的結(jié)構(gòu):
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令名稱,取值為_result、_error或onStatus
|
| Transaction ID | Number | 事務(wù)ID,響應(yīng)的目標(biāo)請(qǐng)求的事務(wù) ID |
| Command Object | Object / Null | 命令對(duì)象,如果一些命令消息需要就用,否則置空即可 |
| Others | Unknow | 額外的參數(shù)值或?qū)ο?,根?jù)特定的命令來配置。如果這個(gè)是結(jié)果命令,則該字段是指定的結(jié)果;如果這個(gè)是錯(cuò)誤命令,則該字段就是錯(cuò)誤信息。 |
由此可見,響應(yīng)命令其實(shí)就是一個(gè)結(jié)果命令、錯(cuò)誤命令或狀態(tài)命令。
小結(jié):命令消息通過
Command Name進(jìn)行區(qū)分,響應(yīng)命令通過Transaction ID與請(qǐng)求命令進(jìn)行關(guān)聯(lián)。
發(fā)送命令消息的類對(duì)象
NetConnection和NetStream是命令中常用的類對(duì)象,其含義如下:
- NetConnection:網(wǎng)絡(luò)連接,服務(wù)端和客戶端之間進(jìn)行網(wǎng)絡(luò)連接的一種高級(jí)表示形式。
- NetStream:網(wǎng)絡(luò)流,代表了發(fā)送音頻流,視頻流,或其他相關(guān)數(shù)據(jù)的頻道。當(dāng)然還有一些像播放,暫停之類的命令,用來控制數(shù)據(jù)流。
NetConnection 命令
NetConnection(網(wǎng)絡(luò)連接)管理著客戶端和服務(wù)端之間的雙向連接,另外,它也支持遠(yuǎn)程方法的異步調(diào)用。NetConnection允許使用的命令如下:
-
connect(連接) -
call(調(diào)用) -
createStrem(創(chuàng)建流) -
close(關(guān)閉)
對(duì)于
NetConnection Command,其響應(yīng)請(qǐng)求命令為結(jié)果命令(_result)和錯(cuò)誤命令(_error)。
connect 命令
客戶端發(fā)送connect命令給服務(wù)器,來獲取一個(gè)服務(wù)端應(yīng)用實(shí)例的連接(connection)。
請(qǐng)求命令結(jié)構(gòu)
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令名稱,設(shè)置為connect
|
| Transaction ID | Number | 總是設(shè)置為 1 |
| Command Object | Object | 具有鍵值對(duì)(name-value pairs)的命令信息對(duì)象,其結(jié)構(gòu)見表格下方的ConnectInfo
|
| Optional User Arguments | Object | 任意可選信息 |
ConnectInfo
connect命令的命令對(duì)象(Command Object)中的鍵值對(duì)說明:
屬性(Property) |
類型(Type) |
描述(Description) |
范例(Example Value) |
|---|---|---|---|
| app | String | 客戶端連接到服務(wù)端應(yīng)用的名字 | live |
| flashver | String | Flash Player 版本號(hào),和 ApplicationScript getversion ()方法返回的是用一個(gè)字符串 | FMSc/1.0 |
| swfUrl | String | 進(jìn)行當(dāng)前連接的 SWF 文件源地址 | file://C:/FlvPlayer.swf |
| tcUrl | String | 服務(wù)器 URL,具有以下格式:protocol://servername:port/ appName/appInstance | rtmp://localhost:1935/ testapp/instance1 |
| fpad | Boolean | 如果使用了代理就為true
|
true or false |
| audioCodecs | Number | 表示客戶端支持的音頻編碼 | SUPPORT_SND_MP3 |
| videoCodecs | Number | 表示客戶端支持的視頻編碼 | SUPPORT_VID_SORENSON |
| videoFunction | Number | 表示支持的特殊視頻函數(shù) | SUPPORT_VID_CLIENT_SEEK |
| pageUrl | String | SWF 文件所加載的網(wǎng)頁 URL | http://somehost/sample.html |
| objectEncoding | Number | AMF 編碼方法 | AMF3 |
audioCodecs
audioCodecs(音頻編碼屬性)的可選值:原始 PCM,ADPCM,MP3,NellyMoser(5,8,11,16,22,44kHz),AAC,Speex
| Codec Flag | Usage | Value |
|---|---|---|
| SUPPORT_SND_NONE | Raw sound, no compression | 0x0001 |
| SUPPORT_SND_ADPCM | ADPCM compression | 0x0002 |
| SUPPORT_SND_MP3 | mp3 compression | 0x0004 |
| SUPPORT_SND_INTEL | Not used | 0x0008 |
| SUPPORT_SND_UNUSED | Not used | 0x0010 |
| SUPPORT_SND_NELLY8 | NellyMoser at 8-kHz compression | 0x0020 |
| SUPPORT_SND_NELLY | NellyMoser compression(5, 11, 22, and 44 kHz) | 0x0040 |
| SUPPORT_SND_G711A | G711A sound compression(Flash Media Server only) | 0x0080 |
| SUPPORT_SND_G711U | G711U sound compression(Flash Media Server only) | 0x0100 |
| SUPPORT_SND_NELLY16 | NellyMouser at 16-kHz compression | 0x0200 |
| SUPPORT_SND_AAC | Advanced audio coding (AAC) codec | 0x0400 |
| SUPPORT_SND_SPEEX | Speex Audio | 0x0800 |
| SUPPORT_SND_ALL | All RTMP-supported audio codecs | 0x0FFF |
videoCodecs
videoCodecs(視頻編碼屬性)的可選值:Sorenson,V1,On2,V2,H264
| Codec Flag | Usage | Value |
|---|---|---|
| SUPPORT_VID_UNUSED | Obsolete value | 0x0001 |
| SUPPORT_VID_JPEG | Obsolete value | 0x0002 |
| SUPPORT_VID_SORENSON | Sorenson Flash video | 0x0004 |
| SUPPORT_VID_HOMEBREW | V1 screen sharing | 0x0008 |
| SUPPORT_VID_VP6 (On2) | On2 video (Flash 8+) | 0x0010 |
| SUPPORT_VID_VP6ALPHA(On2 with alpha channel) | On2 video with alpha channel | 0x0020 |
| SUPPORT_VID_HOMEBREWV(screensharing v2) | Screen sharing version 2 (Flash 8+) | 0x0040 |
| SUPPORT_VID_H264 | H264 video | 0x0080 |
| SUPPORT_VID_ALL | All RTMP-supported video codecs | 0x00FF |
videoFunction
videoFunction(視頻函數(shù)屬性)的可選值:
| Function Flag | Usage | Value |
|---|---|---|
| SUPPORT_VID_CLIENT_SEEK | Indicates that the client can perform frame-accurate seeks. | 1 |
objectEncoding
objectEncoding(編碼屬性)的可選值:
| Encoding Type | Usage | Value |
|---|---|---|
| AMF0 | AMF0 object encoding supported by Flash 6 and later | 0 |
| AMF3 | AMF3 encoding from Flash 9 (AS3) | 3 |
響應(yīng)命令結(jié)構(gòu)
即服務(wù)器到客戶端的命令結(jié)構(gòu):
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 表示響應(yīng)的是結(jié)果(result)還是錯(cuò)誤(error),取值為_result或_error
|
| Transaction ID | Number | 對(duì)于connect響應(yīng),取值為 1 |
| Properties | Object | 描述連接屬性的鍵值對(duì),其結(jié)構(gòu)見表格下方的ConnectResp
|
| Information | Object | 描述來自服務(wù)端的響應(yīng)的鍵值對(duì),即連接事件。包code,level,description,ObjectEncoding信息 |
ConnectResp
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| fmsVer | String | Flash Media Server 版本號(hào) |
| capabilities | Number | 功能數(shù)量? |
(※)命令執(zhí)行消息流
connect命令執(zhí)行過程中的消息流如下:
+--------------+ +-------------+
| Client | | | Server |
+------+-------+ | +------+------+
| Handshaking done |
| | |
| | |
| | |
| | |
|-----------1.Command Message(connect)------->|
| |
|<-------2.Window Acknowledgement Size--------|
| |
|<-----------3.Set Peer Bandwidth-------------|
| |
|-------- Window Acknowledgement Size ------->|
| |
|<------ User Control Message(StreamBegin) ---|
| |
|<------------ Command Message ---------------|
| (_result- connect response) |
| |
Message flow in the connect command
- 客戶端發(fā)送
connect命令到服務(wù)端以請(qǐng)求對(duì)服務(wù)端應(yīng)用實(shí)例的連接 - 收到
connect命令后,服務(wù)端發(fā)送協(xié)議消息“窗口確認(rèn)大小”到客戶端。同時(shí),服務(wù)端也會(huì)連接到connect命令中提到的應(yīng)用 - 服務(wù)端發(fā)送協(xié)議消息“設(shè)置對(duì)端寬帶”到客戶端
- 客戶端在處理完協(xié)議消息“設(shè)置對(duì)端寬帶”之后,發(fā)送協(xié)議消息“窗口確認(rèn)大小”到服務(wù)端。
- 服務(wù)端發(fā)送用戶控制消息(
StreamBegin)類型的協(xié)議消息到客戶端 - 服??器端發(fā)送結(jié)果命令??消息告知客戶端連接狀態(tài) (success/fail),并攜帶指定信息。
call 方法
NetConnection對(duì)象的call方法執(zhí)行接收端遠(yuǎn)程方法的調(diào)用(RPC),被調(diào)用的 RPC 名字作為一個(gè)參數(shù)傳給調(diào)用命令。
請(qǐng)求命令結(jié)構(gòu)
發(fā)送端發(fā)給接收端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Procedure Name | String | 被調(diào)用遠(yuǎn)程程序的名字 |
| Transaction ID | Number | 如果需要遠(yuǎn)程程序給予回復(fù)我們需要傳遞一個(gè)transaction Id,否則傳0即可 |
| Command Object | Object | 如果一些命令消息需要就用,否則置空即可 |
| Optional Arguments | Object | 任意要提供的可選參數(shù) |
響應(yīng)命令結(jié)構(gòu)
接收端回復(fù)的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令的名字 |
| Transaction ID | Number | 響應(yīng)所屬的命令的ID |
| Command Object | Object | 如果一些命令消息需要就用,否則置空即可 |
| Response | Object | 調(diào)用方法的回復(fù) |
createStream 命令
客戶端發(fā)送這一命令到服務(wù)端為消息連接創(chuàng)建一條邏輯通道——消息流。音頻、視頻和元數(shù)據(jù)使用createStream命令創(chuàng)建的流通道傳輸。
NetConnection是默認(rèn)的通信通道,信息流ID為0。協(xié)議消息和一些命令消息,包括createStream,使用默認(rèn)的通信通道。
請(qǐng)求命令結(jié)構(gòu)
客戶端發(fā)送給服務(wù)器端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令名,這里取值為createStream
|
| Transaction ID | Number | 命令的事務(wù) ID |
| Command Object | Object | 如果一些命令消息需要就用,否則置空即可 |
響應(yīng)命令結(jié)構(gòu)
服務(wù)端回復(fù)客戶端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 表示響應(yīng)的是結(jié)果(result)還是錯(cuò)誤(error),取值為_result或_error
|
| Transaction ID | Number | 響應(yīng)所屬的命令的 ID |
| Command Object | Object | 如果一些命令消息需要就用,否則置空即可 |
| Stream ID | Number | 返回值要么是一個(gè)流 ID,要么是一個(gè)錯(cuò)誤信息對(duì)象 |
該處的流ID(
Stream ID)表示的是NetConnection的流ID,與塊流和消息流沒有直接關(guān)系
NetStream 命令
NetStream(網(wǎng)絡(luò)流)命令定義了傳輸通道,通過這個(gè)通道,音頻流、視頻流以及數(shù)據(jù)消息流可以通過連接客戶端到服務(wù)端的NetConnection傳輸。以下命令可以由客戶端使用 NetStream 往服務(wù)端發(fā)送:
-
play(播放) -
play2(播放2) -
deleteStream(刪除流) -
closeStream(關(guān)閉流) -
receiveAudio(接收音頻) -
receiveVideo(接收視頻) -
publish(發(fā)布) -
seek(定位) -
pause(暫停)
對(duì)于
NetStream Command,其響應(yīng)請(qǐng)求命令為狀態(tài)命令(onStatus)
狀態(tài)命令(響應(yīng))
對(duì)于NetStream命令,服務(wù)端使用onStatus命令向客戶端發(fā)送NetStream狀態(tài):
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令名,取值為onStatus
|
| Transaction ID | Number | 事務(wù)ID,取值為 0 |
| Command Object | Null |
onStatus消息沒有命令對(duì)象 |
| Info Object | Object | 一個(gè) AMF 對(duì)象至少要有“l(fā)evel”、“code”和“description”三個(gè)屬性 |
AMF 對(duì)象屬性字段要求:
-
level(String):消息等級(jí),取值為“warning”、“status”、“error”; -
code(String):消息碼,例如"NetStream.Play.Start";- 構(gòu)成:類名.方法名.狀態(tài)
-
description(String):關(guān)于這個(gè)消息的可讀描述。
play 命令
客戶端發(fā)送這一命令到服務(wù)端用來播放流,也可以多次使用這一命令創(chuàng)建一個(gè)播放列表。
如果你想要?jiǎng)?chuàng)建一個(gè)可以在不同的直播流或者錄制流之間進(jìn)行切換播放的動(dòng)態(tài)的播放列表,那么你就需要多次調(diào)用
play方法,并在每次調(diào)用時(shí)傳遞重置字段為false。相反的,如果你想要立即播放指定流,則需要將其他等待播放的流清空,并用true進(jìn)行重置。
請(qǐng)求命令結(jié)構(gòu)
客戶端發(fā)送到服務(wù)端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令名,取值為“play” |
| Transaction ID | Number | 事務(wù) ID,取值為 0 |
| Command Object | Null | 該命令不存在命令信息,取值為“null” |
| Stream Name | String | 播放流的名字,其命名規(guī)則見表格下方 |
| Start | Number | 表示開始的時(shí)間,以秒為單位,是一個(gè)可選參數(shù)。默認(rèn)值為 -2,其值含義見表格下方 |
| Duration | Number | 表示回放的持續(xù)時(shí)間,以秒為單位,是一個(gè)可選參數(shù),默認(rèn)值為 -1,其值含義見表格下方 |
| Reset | Boolean | 表示重置操作,即是否對(duì)之前的播放列表進(jìn)行flush操作,是一個(gè)可選參數(shù)。 |
Stream Name 規(guī)范
根據(jù)不同的文件播放需求,會(huì)有不同的 Stream 命名規(guī)范,如下:
- 對(duì)于 FLV 文件(
sample.flv):不需要文件擴(kuò)展名,例如:sample - 對(duì)于 MP3 或 ID3 文件(
sample.mp3):需要在名字前添加mp3:,例如:mp3:sample - 對(duì)于 H.264/ACC 文件(
sample.m4v):需要在名字前添加mp4:,并且在名字后面指定文件擴(kuò)展名,例如:mp4:sample.m4v
Start 含義
Start 表示流名(Stream Name)的播放方式,主要用于區(qū)分播放的是直播流還是錄制流。
-
start = -2:表示用戶首次嘗試播放流名字段中定義的直播流- 如果沒有此名的直播流,則會(huì)播放流名相同的錄制流;
- 如果沒有此名的錄制流,則會(huì)等待此名新的直播流。
-
start = 0:表示播放此流名指定的錄制流- 如果沒有此名的錄制流,則會(huì)播放播放列表的下一項(xiàng)
-
start = -1:表示播放此流名指定的直播流
Duration 含義
默認(rèn)值為 -1,表示直播流會(huì)播放至不可用,錄制流會(huì)播放到結(jié)束;如果
Duration值為 0,那么只會(huì)播放從錄制流開始時(shí)間的一幀;如果Duration值為大于 0 的正數(shù),那么NetStream將會(huì)變?yōu)榭刹シ艩顟B(tài),或者播放指定的時(shí)間段內(nèi)的錄制流。(如果流在賦值的時(shí)間段內(nèi)結(jié)束,那么回放也會(huì)隨之結(jié)束);如果Duration為 -1 以外的負(fù)數(shù),將會(huì)被當(dāng)成 -1 處理。
Duration 表示回放的持續(xù)時(shí)間,其值的含義如下:
-
Duration = -1:表示直播流播到?jīng)]有了,或錄制流播放結(jié)束; -
Duration = 0:表示只會(huì)播放從錄制流開始時(shí)間的一幀; -
Duration > 0:表示在指定的時(shí)間內(nèi)播放直播流,或在指定的時(shí)間內(nèi)播放錄制流。- 如果該流在指定時(shí)間內(nèi)結(jié)束,那么播放也會(huì)隨之結(jié)束
-
Duration < 0 && Duration != -1:都會(huì)當(dāng)作-1的情況處理
play 命令執(zhí)行消息流
+-------------+ +----------+
| Play Client | | | Server |
+------+------+ | +-----+----+
| Handshaking and Application |
| connect done |
| | |
| | |
| | |
| | |
---+---- |-----1.Command Message(createStream) ---->|
Create| | |
Stream| | |
---+---- |<---------- Command Message --------------|
| (_result- createStream response) |
| |
---+---- |------2.Command Message (play)----------->|
| | |
| |<------------3.SetChunkSize --------------|
| | |
| |<----4.User Control (StreamIsRecorded)----|
Play | | |
| |<----5.User Control (StreamBegin)---------|
| | |
| |<--6.Command Message(onStatus-play reset)-|
| | |
| |<--6.Command Message(onStatus-play start)-|
| | |
| |<-------------Audio Message---------------|
| | |
| |<-------------Video Message---------------|
| | | |
|
Keep receiving audio and video stream till finishes
Message flow in the play command
- 當(dāng)客戶端與服務(wù)端握手完成,并進(jìn)行了連接建立后,客戶端便發(fā)送
createStream到客戶端,請(qǐng)求創(chuàng)建一條新的塊流。 - 當(dāng)客戶端從服務(wù)端接收到
createStream命令的結(jié)果是??success后,則發(fā)送play命令,請(qǐng)求后端開始播放。 - 一旦接收到
play命令,服務(wù)端會(huì)先發(fā)送一個(gè)協(xié)議消息來設(shè)置塊大小。 - 服務(wù)端隨后發(fā)送用戶控制消息,這個(gè)消息中定義了
StreamIsRecorded事件和流ID。消息在前兩個(gè)字節(jié)中保存事件類型,在后四個(gè)字節(jié)中保存流 ID。 - 服務(wù)端發(fā)送另一個(gè)用戶控制消息,這一消息包含
StreamBegin事件,用于發(fā)送給客戶端的流的起點(diǎn)。 - 如果客戶端
play命令執(zhí)行成功,服務(wù)端則發(fā)送????兩個(gè)onStatus命令消息,分別是NetStream.Play.Start和NetStream.Play.Reset。- 當(dāng)客戶端發(fā)送的
play命令設(shè)置了reset時(shí)服務(wù)端才會(huì)發(fā)送NetStream.Play.Reset狀態(tài)。 - 如果要播放的流沒有找到,服務(wù)端發(fā)送
onStatus消息為NetStream.Play.StreamNotFound狀態(tài)
- 當(dāng)客戶端發(fā)送的
之后,服務(wù)端開始發(fā)送視頻和音頻數(shù)據(jù),客戶端對(duì)其進(jìn)行播放。
play2 命令(碼表應(yīng)用)
不同于play命令,play2命令可以在不改變播放的時(shí)間軸的情況下切換不同的比特率(即碼率)。服務(wù)端維護(hù)了多個(gè)不同碼率的文件,客戶端可以通過play2命令來使用。
請(qǐng)求命令結(jié)構(gòu)
客戶端發(fā)給服務(wù)端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令名,取值為play2
|
| Transaction ID | Number | 事務(wù)ID,取值為 0 |
| Command Object | Null | 該命令不存在命令信息,取值為“null” |
| Command Object | Object | 一個(gè) AMF 編碼的對(duì)象,該對(duì)象的屬性是為公開的flash.net.NetStreamPlayOptions ActionScript對(duì)象所描述的屬性。 |
NetStreamPlayOptions對(duì)象的公開屬性在ActionScript 3語言指南[AS3]中有所描述
play2 命令執(zhí)行消息流
+--------------+ +-------------+
| Play2 Client | | | Server |
+--------+-----+ | +------+------+
| Handshaking and Application |
| connect done |
| | |
| | |
| | |
| | |
---+---- |---- Command Message(createStream) --->|
Create | | |
Stream | | |
---+---- |<---- Command Message (_result) -------|
| |
---+---- |------ Command Message (play) -------->|
| | |
| |<------------ SetChunkSize ------------|
| | |
| |<--- UserControl (StreamIsRecorded)----|
Play | | |
| |<------- UserControl (StreamBegin)-----|
| | |
| |<--Command Message(onStatus-playstart)-|
| | |
| |<---------- Audio Message -------------|
| | |
| |<---------- Video Message -------------|
| | |
| |
---+---- |-------- Command Message(play2) ------>|
| | |
| |<------- Audio Message (new rate) -----|
Play2 | | |
| |<------- Video Message (new rate) -----|
| | | |
| | | |
| Keep receiving audio and video stream till finishes
|
Message flow in the play2 command
deleteStream 命令
當(dāng) NetStream 對(duì)象銷毀時(shí),NetStream 發(fā)送 deleteStream 命令。
客戶端發(fā)送給服務(wù)端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令字,取值為“deleteStream” |
| Transaction ID | Number | 事務(wù)ID,取值為 0 |
| Command Object | Null | 該命令不存在命令信息,取值為“null” |
| Stream ID | Number | 服務(wù)端需要銷毀的流 ID |
服務(wù)端不會(huì)發(fā)送任何回復(fù)
receiveAudio 命令
NetStream 通過發(fā)送 receiveAudio 消息來通知服務(wù)端是否發(fā)送音頻到客戶端
客戶端發(fā)送給服務(wù)端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令字,取值為“receiveAudio” |
| Transaction ID | Number | 事務(wù)ID,取值為 0 |
| Command Object | Null | 該命令不存在命令信息,取值為“null” |
| Bool Flag | Boolean | 表明客戶端是否接受音頻數(shù)據(jù),取值 true 或 false |
- 如果發(fā)送來的
receiveAudio命令Bool Flag為false時(shí),服務(wù)端不發(fā)送任何回復(fù)。 - 如果發(fā)送來的
receiveAudio命令Bool Flag為true時(shí),服務(wù)端會(huì)以狀態(tài)消息NetStream.Seek.Notify和NetStream.Play.Start進(jìn)行回復(fù)
NetStream.Seek.Notify:進(jìn)度通知
NetStream.Play.Start:播放狀態(tài)(是否開始)
receiveVideo 命令
NetStream 通過發(fā)送 receiveVideo 消息來通知服務(wù)端是否發(fā)送視頻到客戶端
客戶端發(fā)送給服務(wù)端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令字,取值為“receiveVideo” |
| Transaction ID | Number | 事務(wù)ID,取值為 0 |
| Command Object | Null | 該命令不存在命令信息,取值為“null” |
| Bool Flag | Boolean | 表明客戶端是否接受視頻數(shù)據(jù),取值 true 或 false |
- 如果發(fā)送來的
receiveVideo命令Bool Flag為false時(shí),服務(wù)端不發(fā)送任何回復(fù)。 - 如果發(fā)送來的
receiveVideo命令Bool Flag為true時(shí),服務(wù)端會(huì)以狀態(tài)消息NetStream.Seek.Notify和NetStream.Play.Start進(jìn)行回復(fù)
publish 命令
客戶端通過發(fā)送給服務(wù)端這一命令來發(fā)布一個(gè)已命名的流。使用這個(gè)名字,任意客戶端都可以播放這個(gè)流,并接受發(fā)布的音頻、視頻和數(shù)據(jù)消息。
客戶端發(fā)送給服務(wù)端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令名,取值為“publish” |
| Transaction ID | Number | 事務(wù)ID,取值為 0 |
| Command Object | Null | 該命令不存在命令信息,取值為“null” |
| Publishing Name | String | 發(fā)布的流的名字 |
| Publishing Type | String | 表示發(fā)布類型,取值為“l(fā)ive”、“record”或者“append” |
發(fā)布類型:
- live:直播數(shù)據(jù)只被發(fā)布,并不對(duì)其進(jìn)行錄制
- record:流被發(fā)布后,數(shù)據(jù)被錄制到一個(gè)新的文件,新文件被存儲(chǔ)在服務(wù)器上包含服務(wù)應(yīng)用目錄的子路徑。如果文件已存在,則覆蓋。
- append:流被發(fā)布后,則添加數(shù)據(jù)到指定文件。如果文件不存在,則新建一個(gè)。
服務(wù)端回復(fù)onStatus命令以標(biāo)注發(fā)布的起始位置
seek 命令
客戶端通過發(fā)送seek命令查找一個(gè)多媒體文件或一個(gè)播放列表的偏移量,以毫秒為單位。
客戶端發(fā)送給服務(wù)端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令字,取值為“seek” |
| Transaction ID | Number | 事務(wù)ID,取值為 0 |
| Command Object | Null | 該命令不存在命令信息,取值為“null” |
| milliSeconds | Number | 查找的毫秒數(shù) |
seek命令執(zhí)行成功時(shí)服務(wù)端會(huì)發(fā)送一個(gè)狀態(tài)消息NetStream.Seek.Notify,失敗的話,服務(wù)端返回一個(gè)_error消息。
pause 命令
客戶端通過發(fā)送pause命令告知服務(wù)端當(dāng)前流是暫停還是重新播放。
客戶端發(fā)送給服務(wù)端的命令結(jié)構(gòu)如下:
字段名(Field Name) |
類型(Type) |
描述(Description) |
|---|---|---|
| Command Name | String | 命令字,取值為“命令字,取值為“pause” |
| Transaction ID | Number | 事務(wù)ID,取值為 0 |
| Command Object | Null | 該命令不存在命令信息,取值為“null” |
| Pause/Unpause Flag | Boolean | 表示暫停或重新播放,取值為"true"或"false" |
| milliSeconds | Number | 表示流暫停或者重新開始流所處的毫秒數(shù)。該值是客戶端暫停的當(dāng)前流時(shí)間,服務(wù)端會(huì)在重新播放的時(shí)候傳"timestamps"更大的消息出來 |
- 當(dāng)流暫停時(shí),服??器端發(fā)??一個(gè)
NetStream.Pause.Notify ??狀態(tài)消息 - 當(dāng)流重新播放時(shí),服??器端發(fā)??一個(gè)NetStream.Unpause.Notify` 狀態(tài)消息
- 失敗的話,服??器端返回一個(gè)
_error消息??