Silverlight ve Smooth Streaming

0 dakikada yazıldı

8608 defa okundu

Düzenle

Silverlight ilk çıktığı günden itibaren video konusunda ayrı bir iddaya
sahip oldu. 1.0 sürümünden başlayarak Silverlight'ın CPU ve RAM
kullanımındaki başarısı ister HD ister FullHD videoların oynatılmasında
olsun süper bir performans ile bizleri şaşırtmayı başardı. Bazen keşke
bu başarıyı Media Player'da da görsek diyerek kendi kendime
serzenişlerde bulunmuyor değilim.

Konumuza dönersek, Silverlight ile beraber gelen bir diğer ilginç video
çözümlerinden biri de Smooth Streaming adını taşıyor.  Peki nedir bu
Smooth Streaming? Elinizde var sayalım ki normal bir video dosyası var
ve bunu internetten paylaşmak istiyorsunuz. Fakat videonuzu
paylaştığınız kullanıcıların bir kısmı belki de 1Mbit bağlantıya
sahipken diğerleri çok daha yüksek hızlı bağlantılara sahipler.
Videomuzun kalitesini ayarlarken hangi kitleyi hedefleyeceğiz? Acaba
bağlantısı sağlam arkadaşlara göre mi encode etsek? Bu durumda 1Mbit ile
internete bağlananlar videoları neredeyse izleyemeyecektir. Peki gibi de
1Mbit'e göre ayarlasak? Bu sefer de bağlantısı sağlam olan kişilere
gerekli kalitede görüntüyü aktaramamış olacağız.

İşte bu iki ucu kokulu değnekten sağ salim kurtulmanın yolu Smooth
Streaming
. Gelin bir hayal kuralım ve diyelim ki kullanıcıların
standart bağlantı hızlarını da es geçip o anki bağlantı hızlarına göre
video kalitesini ayarlayabiliyoruz. Hatta ilk başka kullanıcılar videoyu
ilk izlemeye başlarken kalitesiz video ile buffer'ı tamamlayıp hemen
videoyu oynatsak sonrasında kullanıcının hattı sağlam ise kaliteliye
doğru geçip yapsak. En önemlisi tüm bunlar gerçekleşirken kullanıcı
hiçbirşeyin farkında olmasa ve videosunu izlemeye rahat bir şekilde
devam etse? Güzel bir hayal değil mi? Ama hayal değil, bunların hepsi
Smooth Streaming ile bir gerçek.

Nasıl çalışıyor?

Normalde video dosyalarını bir web sunucusu veya Windows Media Services
gibi özel altyapılar ile yayınlarız ve bu altyapılar tek bir video
dosyasını alarak yayınlamaya uygun şekilde düzenlenmiştir. Oysa elimizde
aynı videonun farklı bitrate'ler ile encode edilmiş hali olsa
kullanıcılara seçme şansı tanıyabiliriz. Fakat iki soru var; birincisi
bant genişliği konusunda kullanıcı seçim yapmamalı. Söz konusu bant
genişliği seçimi otomatik olmalı. Bunun için Silverlight tarafında biraz
kod yazmak yeterli olacaktır. İkinci sorun ise bant genişliği ile ilgili
seçimi sadece video başlarken değil video oynatılırken de kullanıcı
farkında olmadan yapabilmek isteriz. Bant genişliği değiştikçe oynatıcı
anında daha kaliteli veya kalitesize hızlı bir şekilde geçmeli. İşte bu
noktada farklı bir taktik uygulama zorunda olacağımız kesin.

Smooth Streaming ile beraber video dosyaları birden çok bitrate'lerde
encode edilerek paketlenip sunucuya yerleştiriliyor. Bu süreçte ayrıca
bahsedeceğiz. Sonrasında bu paket IIS üzerine yüklenen IIS Media
Services içerisinde Smooth Streaming sistemi tarafından tanınıyor ve
kullanıcıdan gelen isteği göre uygun video gönderiliyor. IIS Media
Services sadece bu kadarı ile kalmıyor ve video verilerimiz artık 2 ile
4 saniye arasındaki HTTP paketleri ile gönderiliyor. Böylece duruma göre
gönderilecek olan 2. veya 4. paket farklı bitrate ile encode edilmiş
farklı dosyalardan olabiliyor.

Smooth Streaming mantığı.
Smooth Streaming mantığı.

Yukarıdaki görselde de inceleyebileceğiniz üzere videonun sunucudan
istemciye yolculuğunda eski taktik alt kısımda gösterilmiş durumda. Üst
kısımdaki ise video 2sn'lik HTTP paketleri şeklinde gönderiliyor. Bu
paketli sistemin ilk avantajı arada kalitenin değiştirilebilmesi iken
ikinci bir avantaj ise bu paketlerin http paketlerini önbellekleyen bir
başka sunucu tarafından önbelleğe alınabilmesi. Böylece son kullanıcıya
aynı paketlerin aktarılması için bir noktaya kadar hız avantajı
sağlanabiliyor.

Peki Nasıl Yaparız?

İlk olarak tabi ki sunucunuzda IIS Media
Services
kurulu olmalı.
Doğrudan IIS7 üzerine yüklenen bu eklenti ile beraber artık sunucunuza
Smooth Streaming desteği gelecektir. Apache tarafında da
buradaki
downloadları deneyebilirsiniz. Bir sonraki adımda gerekli olan şey
elimizde Smooth Streaming'e uygun şekilde paketlenmiş birden çok
bitrate'te kaydedilmiş video dosyaları. Bu şekilde bir paket
hazırlamanın en kolay yolu Expression Encoder 3'ten geçiyor. Expression
Endoer 3 varsayılan ayarları ile Smooth Streaming tanıyor.

Expression Encoder 3 içerisinde Smooth Streaming ayarları.
Expression Encoder 3 içerisinde Smooth Streaming ayarları.

Expression Encoder içerisine bir video ekledikten sonra video
profillerinden Smooth Streaming altındaki profillerden birini
seçebilirsiniz. Söz konusu seçimi yaptıktan sonra encode etmek
istediğiniz ve kullanıcılarınıza ayrı ayrı sunmak istediğiniz her
bandwidth'i listeye eklemeniz gerekiyor. Ayarları tamamladıktan sonra
video dosyasını encode edebilirsiniz. Sonuçta elinize ism uzantısı
ile başlayan dosyalar gelecektir. Yapmış olduğunuz ayarlara göre her
encode edilen video dosyası ayrı bir ISMV dosyasında tutulabileceği gibi
hepsi bir dosyada da tutulabilir. Bunu Expression Encoder içerisinde
"Create separate file per stream" seçeneği ile ayarlayabilirsiniz.

[ISM Dosyası]

<?xml
version="1.0" encoding="utf-16"?>

<!--Created with Expression Encoder version
3.0.1332.0
-->

<smil
xmlns="http://www.w3.org/2001/SMIL20/Language">

  <head>

    <meta

      name="clientManifestRelativePath"

      content="Live stream
archive 17.08.2009 15.07.ismc
"
/>

  </head>

  <body>

    <switch>

      <video

        src="Live stream archive 17.08.2009
15.07_305.ismv
"

        systemBitrate="305000">

        <param

          name="trackID"

          value="2"

          valuetype="data" />

      </video>

      <video

        src="Live stream archive 17.08.2009
15.07_230.ismv
"

        systemBitrate="230000">

        <param

          name="trackID"

          value="2"

          valuetype="data" />

      </video>

      <audio

        src="Live stream archive 17.08.2009
15.07_1644.ismv
"

        systemBitrate="64000">

        <param

          name="trackID"

          value="1"

          valuetype="data" />

      </audio>

    </switch>

  </body>

</smil>

Yukarıdaki XML yapısı ISM dosyasının içinde saklı. Yapı ile beraber bu
pakette bulunan videoların bitrate'leri ve dosyaların adları bulunuyor.
Böylece IIS Media Services rahatlıkla bu dosya üzerinden bilgileri
alabilecek. Ayrıca istemci tarafında kullanılacak bilgileri içeren ayrı
bir manifest dosyası da ISMC uzantısı ile kayıtlıdır.

[ISMC Dosyası]

<?xml
version="1.0" encoding="utf-16"?>

<!--Created with Expression Encoder version
3.0.1332.0
-->

<SmoothStreamingMedia

  MajorVersion="2"

  MinorVersion="0"

  Duration="59730000">

  <StreamIndex

    Type="video"

    Chunks="1"

    QualityLevels="8"

    MaxWidth="640"

    MaxHeight="480"

    DisplayWidth="640"

    DisplayHeight="480"

    Url="QualityLevels({bitrate})/Fragments(video={start
time})
">

    <QualityLevel

      Index="0"

      Bitrate="1644000"

      FourCC="WVC1"

      MaxWidth="640"

      MaxHeight="480"

      CodecPrivateData="250000010FE3F213F0EF8A13F83BF1C0EFC80000010E5A0040" />

    <QualityLevel

      Index="1"

      Bitrate="1241000"

      FourCC="WVC1"

      MaxWidth="640"

      MaxHeight="480"

      CodecPrivateData="250000010FE3E613F0EF8A13F83BF1C0EFC80000010E5A0040" />

    <QualityLevel

      Index="2"

      Bitrate="937000"

      FourCC="WVC1"

      MaxWidth="640"

      MaxHeight="480"

      CodecPrivateData="250000010FE3DC13F0EF8A13F83BF1C0EFC80000010E5A0040" />

    <QualityLevel

      Index="3"

      Bitrate="708000"

      FourCC="WVC1"

      MaxWidth="428"

      MaxHeight="320"

      CodecPrivateData="250000010FE3D613F0EF8A13F83BF1C0EFC80000010E5A0040" />

    <QualityLevel

      Index="4"

      Bitrate="534000"

      FourCC="WVC1"

      MaxWidth="428"

      MaxHeight="320"

      CodecPrivateData="250000010FE3D013F0EF8A13F83BF1C0EFC80000010E5A0040" />

    <QualityLevel

      Index="5"

      Bitrate="403000"

      FourCC="WVC1"

      MaxWidth="428"

      MaxHeight="320"

      CodecPrivateData="250000010FE3CC13F0EF8A13F83BF1C0EFC80000010E5A0040" />

    <QualityLevel

      Index="6"

      Bitrate="305000"

      FourCC="WVC1"

      MaxWidth="364"

      MaxHeight="272"

      CodecPrivateData="250000010FE3C813F0EF8A13F83BF1C0EFC80000010E5A0040" />

    <QualityLevel

      Index="7"

      Bitrate="230000"

      FourCC="WVC1"

      MaxWidth="364"

      MaxHeight="272"

      CodecPrivateData="250000010FE3C613F0EF8A13F83BF1C0EFC80000010E5A0040" />

    <c

      n="0"

      d="58320001">

      <f

        i="0"

        s="438"

        q="7405" />

      <f

        i="1"

        s="327"

        q="5536" />

      <f

        i="2"

        s="237"

        q="4016" />

      <f

        i="3"

        s="195"

        q="3299" />

      <f

        i="4"

        s="137"

        q="2321" />

      <f

        i="5"

        s="101"

        q="1706" />

      <f

        i="6"

        s="75"

        q="1267" />

      <f

        i="7"

        s="63"

        q="1063" />

    </c>

  </StreamIndex>

  <StreamIndex

    Type="audio"

    Index="0"

    FourCC="WMAP"

    Chunks="3"

    QualityLevels="1"

    Url="QualityLevels({bitrate})/Fragments(audio={start
time})
">

    <QualityLevel

      Bitrate="64000"

      SamplingRate="44100"

      Channels="2"

      BitsPerSample="16"

      PacketSize="2973"

      AudioTag="354"

      CodecPrivateData="1000030000000000000000000000E00042C0" />

    <c

      n="0"

      d="39009523"
/>

    <c

      n="1"

      d="19504762"
/>

    <c

      n="2"

      d="1680045"
/>

  </StreamIndex>

</SmoothStreamingMedia>

Yukarıda gördüğünüz dosyaların yanında sadece farklı bitrate'ler ile
encode edilmiş videolar bulunuyor. Olay aslında bu kadar basit. İstemci
tarafına baktığımızda ise esas mesele bu yapıyı Silverlight nasıl
oynatacak veya kendi bant genişliğini algılayarak nasıl seçim yapacak
sorusu geliyor. İşte bu sorularla iglili cevapları içeren kodu sıfırdan
yazmamız gerekmiyor. Expression Encoder ile beraber gelen tüm
Silverlight şablonları hali hazırda Smooth Streaming desteğine sahip.
Unutmayın ki bu şablonların hepsinin kaynak kodları da yine Expression
Encoder'ın yüklü olduğu klasörde mevcut. Böylece oluşturulan yapıyı
kopyalayarak kendi projelerinizde de rahatlıkla ilerleyebilirsiniz.

Sonuç olarak...

Hemen Smooth Streaming'i denemek isterseniz aşağıdaki adresten örnek bir
videoyu izleyebilirsiniz. Hatta söz konusu sitede göreceğiniz
Silverlight uygulamalasında kendi bant genişliğinizi üst kısımdan
limitleyebilir ve alt solda da hangi kalitede videonun istemciye
indirildiğini test edebilirsiniz.

Hepiniz kolay gelsin...