Ozan Eren
6 min readJun 4, 2018

--

Wowza Streaming Engine ve MongoDB Entegrasyonu[Java API]

Merhabalar,bu yazımda bir streaming uygulaması olan Wowza Streaming Engine den bahsedeceğiz.Bununla beraber Wowza daki bir stream in bilgilerini MongoDB’ye nasıl yazıldığını göreceğiz.

Öncelikle…

Streaming Nedir?

Kısaca streaming,internet üzerinden sağlanan görüntülü ve sesli canlı yayınlardır diyebiliriz.Bugün kullandığımız Twitch,Youtube,Facebook,Instagram,canlı radyo ortamları ve daha birçok canlı yayın gerçekleştiren platformların da yaptığı tam olarak budur.Aşağıdaki resimdeki basitçe arkasındaki yapıyı anlayabiliriz:

Aslında bu yazımızda yukarıda gördüğünüz “Storage” ve “Program” arasındaki archive işleyişiyle alakalı yaptığımız bir uygulamayı size aktarmaya çalışıcaz.Biraz da spesifik olarak Wowza Streaming Engine ve MongoDB’ye bakalım:

Wowza Streaming Engine

Wowza, videoyu işleyip yayınlayacak Java diliyle yazılmış bir streaming motorudur. Kullanıcıların canlı akış(yayın) isteğini karşılamak için birçok cihaz dijital cihazlar tarafından desteklenmektedir. David Stubenvoll ve Charlie Good tarafından 2005 yılında kurulan Wowza, Java tabanlı platformda geliştirilen birçok ürüne ve çözüme sahiptir. Canlı yayınlar için mükemmel bir çözüm olduğundan kullanıcı Wowza Engine Server’ı bilgisayarına kurarak,Wowza Engine Server Manager ile kullanabilir ve istenirse bir web sitesine de entegre edilebilir.Daha fazla bilgi için buraya bakabilirsiniz.

MongoDB

MongoDB, C++ programlama dili ile geliştirilmiş, ölçeklenebilir, doküman tabanlı , NoSQL bir veritabanı uygulamasıdır. MongoDB, MongoDB şirketi tarafından geliştirilen açık kaynak kodlu bir veritabanıdır. İlişkisel veritabanlarından çok daha esnek ve kullanımı kolaydır.

İlişkisel veritabanları çok iyi ölçeklenebilir ancak gelişim sırasında çok fazla değişiklik olması durumunda çok esneklik sağlamazlar.

MongoDB, verileri JSON benzeri belgelerde saklar, bu veriler üzerinde hızlı sorgulama yapmanız için tasarlanmıştır. Ayrıca dinamik şemalar kullanır; yani alan isimleri veya veri türleri gibi yapıyı ilk tanımlamadan kayıtlar oluşturabilirsiniz.Kayıtların yapısını (belgeler dediğimiz) yalnızca yeni alanlar ekleyerek veya mevcut alanları silerek değiştirebilirsiniz. Bu veri modeli, hiyerarşik ilişkileri, dizileri depolamak ve diğer daha karmaşık yapıları kolayca gösterebilme becerisi kazandırır.

Uygulama

Bu tarz bir uygulamayı internet üzerinde bulamadığımdan ve Türkçe kaynak sıkıntısı olduğundan dolayı sizlere aktarmak istedim.Elimden geldiğince basit ama ayrıntılı anlatmaya çalıştım.

Yapacağımız uygulamada amacımız Live bir uygulamanın(stream) adını alarak MongoDB’ye kaydetmek…

(Anlatım kısmında Wowza ayarlarını konunun uzamaması için kısaca-yaptığınızı varsayarak geçiyoruz.)

Eğer isterseniz buraya tıklayarak Wowza için Java dilinde yazılmış diğer metodlarını öğrenip, istediğinize göre projeye ekleyebilir ve gerekli düzenlemeleri yaparak kolayca kullanabilirsiniz.

Bölüm 1: Java

Bu uygulamayı yaparken Eclipse IDE’sini kullandık.Size de tavsiyem bunu kullanmanızdır.Öncelikle Eclipse içerisinde bir Wowza Streaming Engine Project oluşturabilmek için 1 aylık ücretsiz olarak Wowza’ya kayıt olup Wowza kurulumunu yapmamız gerekiyor.Bunları yaptığınızı varsayıyoruz.Daha sonra ise Eclipse içerisinde gereken kurulum için aşağıdaki adımları uygulayıp kurulumu yapıyoruz:

Help -> Install New Software -> Add -> Name: Wowza -> Location: http://www.wowza.com/wowzaide4/ -> OK

Daha detaylı bilgi ve herhangi bir sorunla karşılaştıysanız bu makaleye bakabilirsiniz.

Herşey tamam olduktan sonra Eclipse üzerinde yeni bir Wowza Streaming Engine Project açıyoruz.Proje adını isteğinize göre girebilirsiniz.Fakat burada dikkat etmeniz gereken package ismini Wowza içerisinde “Modules” kısmında ayarlarken packageismi.ClassAdı(yani Name) şeklinde yapmanız :

Burada sadece “onAppStart” methodunu kullanacağım için sadece onu seçip “Finish” diyorum.Eğer siz isterseniz farklı methodları da ekleyebilirsiniz.Projemiz hazır.

Java kodunun çalışması için MongoDB kütüphanesini projemize import etmeliyiz.Aşağıdaki linkten gerekli jar dosyasını bulabilirsiniz:

https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/3.5.0/mongo-java-driver-3.5.0.jar

NOT:Bu jar dosyasını ayrıca Wowza’nın kurulu olduğu klasörün (default olarak “Program Files” içerisinde “Wowza Media Systems”) içerisindeki “lib” klasörüne atmanız gerekmektedir.

Şimdi biraz kod yazalım:

ToltekObject.java

Var olan proje üzerinde yeni bir java class’ı açıyoruz.Burada properties tanımlayarak işleri kolay-doğru hale getireceğiz.

Github(ToltekObject.java)

packagecom.toltek.wowza;import com.wowza.wms.amf.*;import com.wowza.wms.application.*;import com.wowza.wms.client.*;import com.wowza.wms.module.*;import com.wowza.wms.request.*;import com.wowza.wms.stream.*;import sun.util.calendar.BaseCalendar.Date;public class ToltekObject{//Alan değişkenleri tanımlanıyor.public String app_version=“0.1“;private String AppName;private String StreamName;

// İstenirse kullanılabilinecek diğer değişkenler.

//Buna göre ToltekWowzaLogger içerisinde gerekli methodlar da düzenlenmeli.//private Date date;//private IApplicationInstance AppName;//private IMediaStream stream;

//Yapıcı methodlar ToltekWowzaLogger daki methodlardan gelen nesne türlerine göre

//parametrelere ayrılmış olarak oluşturuluyor.

//IApplicationInstance nesnesi alır.

public ToltekObject(IApplicationInstance appInstance){ setAppName(appInstance); }

//IMediaStream nesnesi alır.

public ToltekObject(IMediaStream stream){ setStreamName(stream); }

//AppName için getApplication().getName() Wowza’nın isim getirmek için

//yazdığı metodlardır.
private void setAppName(IApplicationInstance appInstance){ AppName=appInstance.getApplication().getName(); }public String getAppName(){ return AppName; }

//getName() Wowza tarafından yazılmış bir metodtur.

private void setStreamName(IMediaStream stream){ StreamName=stream.getName(); }public String getStreamName(){ return StreamName; }}

ToltekMongoLogger.java

Burada MongoDB işlemlerini yapmak için gerekli kodlar bulunmakta.

Github(ToltekMongoLogger.java)

package com.toltek.wowza;import com.mongodb.client.MongoCollection;import com.mongodb.client.MongoDatabase;import com.wowza.wms.mediacaster.IMediaCaster;import com.wowza.wms.stream.IMediaStream;import java.lang.reflect.InvocationTargetException;import java.util.Calendar;import org.bson.Document;import com.mongodb.MongoClient;public class ToltekMongoLogger{
//ToltekWowzaLogger.java’da kullanılan LogaEkle methodu burada tanımlanıyor.public static void LogaEkle(ToltekObject log) throws InvocationTargetException{
//Java üzerinde görebileceğimiz bir çıktı mesajı ayarlanıyor.System.out.println(“DATABASE BAÐLANDI!!!“);
//Yeni bir MongoClient nesnesi oluşturuyoruz.//Daha sonra Ogrenciler adındaki database üzerinden//collection ı getiriyoruz.MongoClient mClient=new MongoClient( “localhost“ , 27017 );MongoDatabase database = mClient.getDatabase(“Ogrenciler“);MongoCollection<Document> collection = database.getCollection(“Ogrenciler“);

//Dokuman olusturuluyor ve yazılıyor.

Document document = new Document(“title“, “Wowza“).append(“id“, 2).append(“AppVersion“, “0.1“)//log.getAppName() ToltekObject.java dosyasında tanımladığımız metodtur..append(“AppName“,log.getAppName());
//istersek burada stream name için de aynı şeyi yapabilirdik.// .append(“StreamName”,log.getStreamName());
//Döküman collection a ekleniyor.collection.insertOne(document); }}

ToltekWowzaLogger.java

Wowza Streaming Engine projesi oluştururken seçtiğimiz metodlarımız buradadır.Aslında bu bizim main class ımızdır.Burada ToltekObject nesnesi oluşturuyoruz.Bunu ToltekObject yapıcı metodlarımız kullandığımız metoda göre bir parametre alarak yapmış oluyor.

Github(ToltekWowzaLogger.java)

package com.toltek.wowza;import com.wowza.wms.application.*;import java.lang.reflect.InvocationTargetException;import org.bson.Document;import com.mongodb.MongoClient;import com.mongodb.client.MongoCollection;import com.mongodb.client.MongoDatabase;import com.wowza.wms.amf.*;import com.wowza.wms.client.*;import com.wowza.wms.logging.WMSLogger;import com.wowza.wms.mediacaster.IMediaCaster;import com.wowza.wms.module.*;import com.wowza.wms.request.*;import com.wowza.wms.stream.IMediaStream;import com.wowza.wms.module.ModuleFunction;
public class ToltekWowzaLogger extends ModuleBase {
public void onAppStart(IApplicationInstance appInstance) throws InvocationTargetException{
//Wowza Streaming Engine Manager’a log aktaran bir methodtur.//Çıktısı Server-Logs kısmında debug loglarında görülebilir.

getLogger().info(“ Uygulama Basladi!!!“);
//ToltekObject nesnesi oluşturuluyor ve appInstance parametre veriliyor.ToltekObject Log=new ToltekObject(appInstance);
//Exception kontrolütry{ToltekMongoLogger.LogaEkle(Log);}catch(InvocationTargetException ie){ie.getCause().toString();}

getLogger().info(“MongoDB aktarýldý!!!“);

}
public void onAppStop(IApplicationInstance appInstance){getLogger().info(“ Uygulama Bitti!!!“);
ToltekObject Log=new ToltekObject(appInstance);try{ToltekMongoLogger.LogaEkle(Log);}catch(InvocationTargetException ie){ie.getCause().toString();}

getLogger().info(“MongoDB aktarýldý!!!“);

}
public void onStreamCreate(IMediaStream stream){getLogger().info(“Stream Olustu“);
ToltekObject Log=new ToltekObject(stream);try{ToltekMongoLogger.LogaEkle(Log);}catch(InvocationTargetException ie){ie.getCause().toString();}

getLogger().info(“MongoDB aktarýldý!!!“);

}

}

Bölüm 2: MongoDB

MongoDB’yi kurup hizmetlerde çalıştığından emin olmalısınız.Bu kısmı yapılmış olarak kabul ediyoruz.Daha sonra MongoDB veritabanını görüntülemek için Robo3T aracını kullanabilirsiniz.Bunu aşağıdaki linkten indirip kurabilirsiniz:

https://robomongo.org/

Burada da görüldüğü gibi “Ogrenciler” adlı database üzerinde “Ogrenciler” collection ını oluşturduk:

Daha sonra sonuç kısmında “Ogrenciler” collection ı içerisine istediğimiz verilerin kaydedildiğini göreceğiz.

Bölüm 3: Wowza

  • İlk önce yapmamız gereken Wowza Streaming Engine Manager üzerinde “Application” kısmından live application yaratmak.”Add Application” kısmından yeni bir tane ayarlayabiliriz.Ben burada “Deneme” adında örnek bir tane oluşturdum.

Burada önemli bir nokta var.”Modules” kısmında Java kodlarımızı yazdığımız projeyi,diğer gerekli classları ve kütüphaneleri(jar dosyaları) eklememiz gerekiyor.Bu kısmı görebilmek için öncelikle aşağıdaki ayarı yapmamız gerekli:

Server kısmında “Users” sekmesi altında “Actions” kısmına tıklıyoruz ve açılan ekranda “Preferences” kısmında “Allow access to advanced properties and features” seçeneğini işaretlenmiş olarak save etmeliyiz.Böylece ileri seviye yetki almış oluyoruz.Şimdi “Modules” kısmını görebilir ve düzenleyebiliriz.

Kodlarımızı “Deneme” live uygulamamızda “Modules” kısmına ekliyoruz.Dikkat etmemiz gereken “Modules” kısmında ayarlarken packageismi.ClassAdı şeklinde yapmanız

Burada bir önceki kısımlarda bahsettiğimiz MongoDB driver jar dosyasını Wowza’nın kurulu olduğu klasörün (default olarak “Program Files” içerisinde “Wowza Media Systems”) içerisindeki “lib” klasörüne atmanız gerekmektedir.Eğer indirmediyseniz Eclipse projesine ve Wowza içerisine atmak için aşağıdaki linkten indirebilirsiniz.

https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/3.5.0/mongo-java-driver-3.5.0.jar

SONUÇ…RUN..!

Son olarak projemizi çalıştırdığımızda “BUILD SUCCESSFULL” yazısının görülmesi gerekmektedir.

NOT:Eclipse Üzerinde “Access Denied” veya “Erişim Engellendi” hataları için hata loglarına göre dosyalara bulundukları dizinlerde “Everyone” olarak dosya izinleri verirseniz bu hataları giderebilirsiniz.

Wowza Streaming Engine ve Wowza Streaming Engine Manager düzgün çalışıyorsa eğer aşağıdaki gibi sonuçları görmüş olmanız gerekmektedir:

Eclipse üzerinde böyle gözükür:

Wowza Streaming Engine Manager içerisinde Server-Logs içinde Debug loglarında böyle gözükür:

MongoDB içerisindeki collection’da bu şekilde gözükür:

(Sarı ile çizili olan MongoDB tarafından verilen id,yeşiller ise kodu yazarken benim elle eklediklerim,mor renkte olan ise uygulamamızın asıl amacı olan AppName(uygulama adı) )

Projenin özet haline Github adresim üzerinden ulaşabilirsiniz:

Github PROJE ÖZETİ

Yazımızın burada sonuna geldik.Konuyla ilgili sorularınız ve tavsiyeleriniz için yorum yazabilirsiniz.

Herkese iyi günler…

--

--