Makale Özeti

Bu yazımızda Silverlight ile beraber video yayınlama noktasında kullanacağımız ve farklı bant genişliklerindeki kullanıcılara hitap eden video altyapıları oluşturmamızı sağlayacak Smooth Streaming teknolojisini inceliyoruz.

Makale

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...