MS-SMTH 是2009版的,其中沒有關于直播的描述,新版本協(xié)議為 MS-SSTR(2011版的 Smooth Streaming 協(xié)議) 本文之前寫的都是2009版的,2011版的更新用紅色字體標出。 1、微軟SmoothStreamIndexing協(xié)議規(guī)定了四種消息: (The IIS Smooth StreamIndexing Transport Protocol defines four types of messages: ) 1.Manifest Request 2.Manifest Response 3.Fragment Request 4.Fragment Response 1. Manifest Request ManifestRequest = [ "/" VirtualPath ] "/" PublishingPointName "." "ism" / VendorExtensionFileExtension "/" "Manifest" 注意上面的式子中有一個斜杠是沒有引號的,也就是VendorExtensionFileExtension前面那個,也就是說這個斜杠不是要出現(xiàn)在Request中的,這個斜杠表示或者的意思。 也就是說,"."后面既可以跟ism也可以跟提供商自己的擴展名,"ism"跟VendorExtensionFileExtensions是或的關系。 看來ManifestRequest中必須包含".",就是"/" "Manifest"的前一級必須包含"."。這樣看來我自己在lighttpd上搞的目錄實際是不符合協(xié)議的。 2. Manifest Response (Manifest 文件的格式) Manifest文件是個XML文本,遵循XML標準。注:XML 標簽對大小寫敏感,XML 的屬性值須加引號。 Manifest的根元素必須是<SmoothStreamIndexingMedia>,這個元素的意思是“客戶端為了播放節(jié)目(Presentation)所需的所有元數(shù)據(jù)”。 這個元素有4個屬性:MajorVersion,MinorVersion,TimeScale,Duration。 2011版新加入3個屬性:IsLive,LookaheadCount ,DVRWindowLength。這三個屬性都是直播相關的。 其中除了TimeScale之外都是必須的,TimeScale之所以不是必須,是因為他有默認值————10000000(1個1,7個0)。 TimeScale的意思是每秒鐘Duration屬性的增量,Duration就是節(jié)目長度的意思。也就是每一秒,Duration加幾,TimeScale就是個這數(shù)。 可以理解為TimeScale是劃分時間的粒度,10000000代表每秒鐘節(jié)目時長加10的7次方那么多,反過來理解就是,每10的負7次方秒,節(jié)目長度就要加1。 你看這默認值把視頻劃分的夠細的啊。 另外兩個屬性,描述版本用的:MajorVersion必須等于2,MajorVersion必須等于0,這沒啥好說的,規(guī)定。 這個元素屬性挺少的,到這兒就說完了。下邊說說這個元素的內容: 內容=[ ProtectionElement S?] 1* StreamIndexElement 注: *元素 表示0或多個元素,1*元素 表示1或多個元素,2*3元素 表示2或3個元素。 上面是協(xié)議里寫的,翻譯成漢語就是,由一個可選的<Protection>元素和若干個<StreamIndex>元素組成。接下來的任務就是看看這倆元素分別是啥了。 先看<StreamIndex>元素。 <StreamIndex>元素的意思“客戶端為了播放Stream所需的所有元數(shù)據(jù)”,跟前邊<SmoothStreamIndexingMedia>比,把節(jié)目(Presentation)換成了Stream。 其實一個節(jié)目一般可以分為兩個Stream,即視頻流和音頻流。以后就管Stream叫“流”了,漢語方便。 這
個元素有以下這12個屬
性:Type,Subtype,TimeScale,Name,Chunks,QualityLevels,Url,MaxWidth,MaxHeight,DisplayWidth,DisplayHeight,VendorExtension。 其
中Type是必須的,并且,如果這個<StreamIndex>元素中沒有插入<QualityLevel>元素,那么這3個元
素也是必須的:NumberOfFragments,
NumberOfTracks,Url。當然,常見的場景是<StreamIndex>元素中都插入
了<QualityLevel>元素。 下邊來看看這12個屬性都什么意思: Type:流的類型,可以是video, audio, or text。text有點特殊和不常見,今天先不說。 MaxWidth, MaxHeight, DisplayWidth, DisplayHeight:這4個屬性就是字面意思。注意只有當Type屬性的值為video時,這4個屬性才可以出現(xiàn)。 Subtype:當Type屬性的值為text時,這個屬性必須出現(xiàn)。這個屬性稍微復雜并不常用,今天先不說。 Name :流的名稱,沒啥好說的。 Chunks :流中Fragment的個數(shù),F(xiàn)ragment就是分片。 QualityLevels :流中Track的個數(shù),目前理解是,一個碼率就叫一個Track(對于視頻)。協(xié)議里說Track元素的名字就是QualityLevel。 Url:客戶端用以產生FragmentRequest的格式,這個屬性的值必須是UrlPattern: UrlPattern
= QualityLevels("{bitrate}" / "{Bitrate}" ["," "{CustomAttributes}"]
)"/"Fragments(TrackName "=" "{start time}" / "{start_time}" ) TimeScale:這個流中的TimeScale,跟前面的TimeScale具有相同的意義。 VendorExtension:內容提供商自己開發(fā)擴展用。 下邊說說這個元素的內容: StreamContent = 1*(TrackElement S?) *(StreamFragment S?) 翻譯成漢語就是,此元素的內容是一到多個Track元素(<QualityLevel>)與0到多個StreamFragment元素(<c>)組成的。下面正好開始看這兩個元素。 <QualityLevel>元素(Track元素)的意思是“客戶端為了播放Track所需的所有元數(shù)據(jù)”,跟前邊比,把stream換成了track。 這
個元素有以下這些屬
性:Index,Bitrate,MaxWidth,MaxHeight,CodecPrivateData,SamplingRate,Channels,BitsPerSample,PacketSize,AudioTag,NALUnitLengthField 這些屬性都是啥意思今天先不說。 這個元素的內容如下: TrackContent = CustomAttributes? 這個內容協(xié)議里描述的沒太看明白,而且也不咋重要,今天先不說。 <c>元素(StreamFragment元素)的意思是“分片(Fragments)元數(shù)據(jù)的集合”。這個元素很重要,今天好好說說。 這個元素有3個屬性:n,d,t。其中d和t至少要出現(xiàn)一個。 n:分片在流中的序號,隨時間遞增。非必須屬性。 d:(FragmentDuration)分片的持續(xù)時間。由包含這個分片的流的TimeScale屬性的值顯示的或隱含的指明。如果d屬性沒有出現(xiàn),那么他的隱含值要由客戶端按如下規(guī)則計算: 用本<c>元素的t屬性的值減去后面那個<c>元素的t屬性的值。翻譯成漢語就是,當前分片的開始時間減去后面分片的開時間。 如果一個分片沒有后續(xù)分片,那么他的d屬性隱含值為0.(注:這里協(xié)議原文貌似寫的有問題,我覺著只有按我這么理解才能解釋通) t:(FragmentTime)分片(開始)時間(點)。由包含這個分片的流的TimeScale屬性的值顯示的或隱含的指明。如果t屬性沒有出現(xiàn),那么他的隱含值要由客戶端按如下規(guī)則計算: 用本<c>元素前面那個<c>元素的d的值加上t的值。 如果一個分片前面沒有其他分片,那么他的t屬性隱含值為0. 下邊是個例子: <c t = "0" d = "19680000" /> <c t = "19680000" d="19680000" /> <c t = "39360000" d="19680000" /> 為了支持直播,新版協(xié)議給視頻分片加了兩個新的box(type=uiid):tfxdBox(本分片的t和d封裝在里面),tfrfBox(下一個或幾個分片的t和d封裝在里面)。 |
|