Kamera girdisini yakalama

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

Harici video dosyalarına ek olarak, kullanıcının bilgisayarına takılı bir kamera, ActionScript kullanarak görüntüleyip işleyebileceğiniz bir video verisi kaynağı görevi görebilir. Camera sınıfı, bilgisayar kamerasıyla çalışılması için ActionScript'te yerleşik bulunan bir mekanizmadır.

Camera sınıfını anlama

Camera nesnesi, kullanıcının yerel kamerasına bağlanmanıza ve yerel olarak (geri kullanıcıya) veya uzaktan bir sunucuya (örn. Flash Media Server) videoyu yayınlamanıza olanak sağlar.

Camera sınıfını kullanarak, kullanıcının kamerası hakkında şu tür bilgilere erişebilirsiniz:

  • Kullanıcının bilgisayarında takılı olan hangi kameraların kullanılabilir olduğu

  • Bir kameranın takılmış olup olmadığı

  • Flash Player uygulamasının kullanıcının kamerasına erişime izin verdiği veya erişimi reddettiği

  • Hangi kameranın geçerli olarak etkin olduğu

  • Yakalanan videonun genişliği ve yüksekliği

Camera sınıfı, kamera nesneleriyle çalışılmasına yönelik çok sayıda yararlı yöntem ve özellik içerir. Örneğin, statik Camera.names özelliği, kullanıcının bilgisayarında geçerli olarak takılı olan kamera adlarının dizisini içerir. Geçerli olarak etkin olan kameranın adını görüntülemek için name özelliğini de kullanabilirsiniz.

Not: Ağ içinde kamera videosu akışı gerçekleştirirken, her zaman ağ kesintileriyle ilgilenmeniz gerekir. Ağ kesintileri özellikle mobil aygıtlarda çeşitli nedenlerden dolayı meydana gelebilir.

Ekranda kamera içeriğini görüntüleme

Bir kameraya bağlanılması, video yüklemek için NetConnection ve NetStream sınıflarının kullanılmasından daha az kod gerektirebilir. Flash Player ile bir kullanıcının kamerasına erişmek için öncelikle kullanıcıdan kameraya bağlanma izni almanız gerektiğinden, kamera sınıfı hemen incelikli de olabilir.

Şu kod, kullanıcının yerel kamerasına bağlanmak için, Camera sınıfını nasıl kullanabileceğinizi gösterir:

var cam:Camera = Camera.getCamera(); 
var vid:Video = new Video(); 
vid.attachCamera(cam); 
addChild(vid);
Not: Camera sınıfı bir yapıcı yöntemine sahip değildir. Yeni bir Camera örneği oluşturmak için, statik Camera.getCamera() yöntemini kullanırsınız.

Kamera uygulamanızı tasarlama

Bir kullanıcının kamerasına bağlanan uygulama yazarken kodunuzda şunları açıklamanız gerekir:

  • Kullanıcının geçerli olarak takılı bir kameraya sahip olup olmadığını kontrol edin. Durumu kameranın mevcut olmadığı durumlarda işleyin.

  • Yalnızca Flash Player için, kullanıcının açıkça kameraya erişilmesine izin verip vermediğini kontrol edin. Güvenlik nedenleriyle oynatıcı, kullanıcının kamerasına erişilmesine izin vermesine veya erişilmesini reddetmesini sağlayan Flash Player Ayarları iletişim kutusunu görüntüler. Bu da Flash Player uygulamasının bir kullanıcının kamerasına bağlanıp kullanıcının izni olmadan bir video akışını yayınlamasını önler. Kullanıcı izin verme seçeneğini tıklatırsa, uygulamanız kullanıcının kamerasına bağlanabilir. Kullanıcı reddetme seçeneğini tıklatırsa, uygulamanız kullanıcının kamerasına erişemez. Uygulamalarınızın her zaman her iki durumu da düzgün biçimde işlemesi gerekir.

  • Yalnızca AIR için, Camera sınıfının uygulamanız tarafından desteklenen aygıt profilleri tarafından desteklenip desteklenmediğini kontrol edin.

  • Camera sınıfı mobil tarayıcılarda desteklenmez.

  • Camera sınıfı GPU oluşturma modunu kullanan mobil AIR uygulamalarında desteklenmez.

  • iOS'ta bir kerede yalnızca bir kamera etkin olabilir. Android'de yalnızca ön tarafa bakan kameraya erişilebilir.

Bir kullanıcının kamerasına bağlanma

Bir kullanıcının kamerasına bağlanırken birinci adım, Camera türünde bir değişken oluşturup bu değişkeni statik Camera.getCamera() yönteminin döndürme değerine başlatarak yeni bir kamera örneği oluşturulmasıdır.

Sonraki adım ise, yeni bir video nesnesi oluşturulup buna Camera nesnesinin eklenmesidir.

Üçüncü adım, görüntüleme listesine video nesnesinin eklenmesidir. Camera sınıfı DisplayObject sınıfını genişletmeyip söz konusu sınıf doğrudan görüntüleme listesine eklenemediğinden, adım 2 ve 3'ü uygulamanız gerekir. Kameranın yakalanan videosunu görüntülemek için yeni bir video nesnesi oluşturup attachCamera() yöntemini çağırırsınız.

Aşağıdaki kod bu üç adımı gösterir:

var cam:Camera = Camera.getCamera(); 
var vid:Video = new Video(); 
vid.attachCamera(cam); 
addChild(vid);

Bir kullanıcının kamerası takılı değilse, uygulamanın herhangi bir şey görüntülemeyeceğini unutmayın.

Gerçek yaşamda, uygulamanız için ek adımlar uygulamanız gerekir. Daha fazla bilgi için, bkz. Kameraların takılı olduğunu doğrulama ve Kamera erişimi için izinleri algılama.

Kameraların takılı olduğunu doğrulama

Bir kamera örneğinde herhangi bir yöntemi veya özelliği kullanmaya çalışmadan önce, kullanıcının bir kamera taktığını doğrulamak istersiniz. Kullanıcının takılı bir kameraya sahip olup olmadığını kontrol etmenin iki yolu vardır:

  • Kullanılabilir kamera adlarının bir dizisini içeren statik Camera.names özelliğini kontrol edin. Çoğu kullanıcı aynı anda birden çok kamera takmayacağından, genellikle bu dizi bir veya daha az dize içerir. Şu kod, kullanıcının kullanılabilir kameraya sahip olup olmadığını görmek için Camera.names özelliğini nasıl kontrol edebileceğinizi gösterir:

    if (Camera.names.length > 0) 
    { 
        trace("User has at least one camera installed."); 
        var cam:Camera = Camera.getCamera(); // Get default camera. 
    } 
    else 
    { 
        trace("User has no cameras installed."); 
    }
  • Statik Camera.getCamera() yönteminin döndürme değerini kontrol edin. Herhangi bir kamera kullanılabilir veya takılı değilse, bu yöntem null değerini, aksi takdirde Camera nesnesinin bir başvurusunu döndürür. Şu kod, kullanıcının kullanılabilir kameraya sahip olup olmadığını görmek için Camera.getCamera() yöntemini nasıl kontrol edebileceğinizi gösterir:

    var cam:Camera = Camera.getCamera(); 
    if (cam == null) 
    { 
        trace("User has no cameras installed."); 
    } 
    else 
    { 
        trace("User has at least 1 camera installed."); 
    }

Camera sınıfı, DisplayObject sınıfını genişletmediğinden, addChild() yöntemi kullanılarak doğrudan görüntüleme listesine eklenemez. Kameranın yakalanan videosunu görüntülemek için yeni bir Video nesnesi oluşturmanız ve Video örneğinde attachCamera() yöntemini çağırmanız gerekir.

Bu kod parçası, varsa, kamerayı nasıl ekleyebileceğinizi gösterir; kamera yoksa, uygulama herhangi bir şey görüntülemez:

var cam:Camera = Camera.getCamera(); 
if (cam != null) 
{ 
    var vid:Video = new Video(); 
    vid.attachCamera(cam); 
    addChild(vid); 
}

Kamera erişimi için izinleri algılama

AIR uygulama sanal alanında, uygulama kullanıcının izni olmadan herhangi bir kameraya erişebilir. Ancak, Android'de uygulama uygulama açıklayıcısında Android CAMERA iznini belirtmelidir.

Flash Player uygulamasının kamera çıktısını görüntüleyebilmesi için öncelikle kullanıcının açıkça Flash Player'a kameraya erişme izni vermesi gerekir. attachCamera() yöntemi çağrıldığında, Flash Player uygulaması, Flash Player'ın kameraya veya mikrofona erişmesine izin verip vermeyeceğini kullanıcıya soran Flash Player Ayarları iletişim kutusunu görüntüler. Kullanıcı İzin Ver düğmesini tıklatırsa, Flash Player uygulaması Sahne Alanı'nda Video örneğinde kameranın çıktısını görüntüler. Kullanıcı Reddet düğmesini tıklatırsa, Flash Player kameraya bağlanamaz ve Video nesnesi herhangi bir şey görüntülemez.

Kullanıcının, Flash Player uygulamasının kameraya erişmesine izin verip vermediğini algılamak istiyorsanız, aşağıdaki kodda görüldüğü gibi kameranın status olayını (StatusEvent.STATUS) dinleyebilirsiniz:

var cam:Camera = Camera.getCamera(); 
if (cam != null) 
{ 
    cam.addEventListener(StatusEvent.STATUS, statusHandler); 
    var vid:Video = new Video(); 
    vid.attachCamera(cam); 
    addChild(vid); 
} 
function statusHandler(event:StatusEvent):void 
{ 
    // This event gets dispatched when the user clicks the "Allow" or "Deny" 
    // button in the Flash Player Settings dialog box. 
    trace(event.code); // "Camera.Muted" or "Camera.Unmuted" 
}

Kullanıcı İzin Ver veya Reddet öğesini tıklattığı anda statusHandler() işlevi çağrılır. İki yöntemden birini kullanarak, kullanıcının hangi düğmeyi tıklattığını algılayabilirsiniz:

  • statusHandler() işlevinin event parametresi, “Camera.Muted” veya “Camera.Unmuted” dizesini içeren bir kod özelliği içerir. Değer “Camera.Muted” ise, kullanıcı Reddet düğmesini tıklatmış olduğundan Flash Player kameraya erişemiyordur. Aşağıdaki kod parçasında buna bir örnek görebilirsiniz:

    function statusHandler(event:StatusEvent):void 
    { 
        switch (event.code) 
        { 
            case "Camera.Muted": 
                trace("User clicked Deny."); 
                break; 
            case "Camera.Unmuted": 
                trace("User clicked Accept."); 
                break; 
        } 
    }
  • Camera sınıfı, kullanıcının Flash Player Gizlilik panelinde kameraya erişilmesini reddettiğini (true) veya erişilmesine izin verdiğini (false) belirten muted adında salt okunur bir özellik içerir. Aşağıdaki kod parçasında buna bir örnek görebilirsiniz:

    function statusHandler(event:StatusEvent):void 
    { 
        if (cam.muted) 
        { 
            trace("User clicked Deny."); 
        } 
        else 
        { 
            trace("User clicked Accept."); 
        } 
    }

Gönderilecek durum olayını kontrol ederek, kameraya erişilmesini kabul eden veya reddeden kullanıcıyı işleyen kod yazabilir ve uygun şekilde kamerayı silebilirsiniz. Örneğin, kullanıcı Reddet düğmesini tıklatırsa, kullanıcıya video sohbetine katılmak istiyorsa İzin Ver'i tıklatması gerektiğini belirten bir mesaj görüntüleyebilir veya sistem kaynaklarında yer açmak için görüntüleme listesinde Video nesnesinin silindiğinden emin olabilirsiniz.

AIR'de, bir Camera nesnesi kamera kullanma izni dinamik olmadığı için durum olayları göndermez.

Video kalitesini en üst düzeye çıkarma

Varsayılan olarak, yeni Video sınıfı örnekleri 320 piksel genişlikte ve 240 piksel yüksekliktedir. Video kalitesini en üst düzeye çıkarmak için, her zaman video nesnenizin kamera nesnesiyle döndürülen videoyla aynı boyutlarda olduğundan emin olmanız gerekir. Aşağıdaki kod parçasında görüldüğü gibi, Camera sınıfının width ve height özelliklerini kullanarak kamera nesnesinin genişlik ve yüksekliğini alabilir, video nesnesinin width ve height özelliklerini kamera nesnelerinin boyutlarıyla eşleşecek şekilde ayarlayabilir veya kameranın genişlik ve yüksekliğini Video sınıfının yapıcı yöntemine iletebilirsiniz:

var cam:Camera = Camera.getCamera(); 
if (cam != null) 
{ 
    var vid:Video = new Video(cam.width, cam.height); 
    vid.attachCamera(cam); 
    addChild(vid); 
}

getCamera() yöntemi, kamera nesnesinin başvurusunu (veya kullanılabilir kamera yoksa null değerini) döndürdüğünden, kullanıcı kamerasına erişilmesini reddetse de kameranın yöntemlerine ve özelliklerine erişebilirsiniz. Böylece kameranın yerel yükseklik ve genişliğini kullanarak video örneğinin boyutunu ayarlayabilirsiniz.

var vid:Video; 
var cam:Camera = Camera.getCamera(); 
 
if (cam == null) 
{ 
    trace("Unable to locate available cameras."); 
} 
else 
{ 
    trace("Found camera: " + cam.name); 
    cam.addEventListener(StatusEvent.STATUS, statusHandler); 
    vid = new Video(); 
    vid.attachCamera(cam); 
} 
function statusHandler(event:StatusEvent):void 
{ 
    if (cam.muted) 
    { 
        trace("Unable to connect to active camera."); 
    } 
    else 
    { 
        // Resize Video object to match camera settings and  
        // add the video to the display list. 
        vid.width = cam.width; 
        vid.height = cam.height; 
        addChild(vid); 
    } 
    // Remove the status event listener. 
    cam.removeEventListener(StatusEvent.STATUS, statusHandler); 
}

Tam ekran modu hakkında bilgi almak için, Sahne Alanı özelliklerini ayarlama bölümündeki tam ekran modu konusuna bakın.

Oynatma koşullarını izleme

Kamera sınıfı, Camera nesnesinin geçerli durumunu izlemenize olanak sağlayan birçok özellik içerir. Örneğin, şu kod, bir Timer nesnesini ve görüntüleme listesindeki metin alanı örneğini kullanarak çok sayıda kamera özelliğini görüntüler:

var vid:Video; 
var cam:Camera = Camera.getCamera(); 
var tf:TextField = new TextField(); 
tf.x = 300; 
tf.autoSize = TextFieldAutoSize.LEFT; 
addChild(tf); 
 
if (cam != null) 
{ 
    cam.addEventListener(StatusEvent.STATUS, statusHandler); 
    vid = new Video(); 
    vid.attachCamera(cam); 
} 
function statusHandler(event:StatusEvent):void 
{ 
    if (!cam.muted) 
    { 
        vid.width = cam.width; 
        vid.height = cam.height; 
        addChild(vid); 
        t.start(); 
    } 
    cam.removeEventListener(StatusEvent.STATUS, statusHandler); 
} 
 
var t:Timer = new Timer(100); 
t.addEventListener(TimerEvent.TIMER, timerHandler); 
function timerHandler(event:TimerEvent):void 
{ 
    tf.text = ""; 
    tf.appendText("activityLevel: " + cam.activityLevel + "\n"); 
    tf.appendText("bandwidth: " + cam.bandwidth + "\n"); 
    tf.appendText("currentFPS: " + cam.currentFPS + "\n"); 
    tf.appendText("fps: " + cam.fps + "\n"); 
    tf.appendText("keyFrameInterval: " + cam.keyFrameInterval + "\n"); 
    tf.appendText("loopback: " + cam.loopback + "\n"); 
    tf.appendText("motionLevel: " + cam.motionLevel + "\n"); 
    tf.appendText("motionTimeout: " + cam.motionTimeout + "\n"); 
    tf.appendText("quality: " + cam.quality + "\n"); 
}

Saniyenin her 1/10'unda (100 milisaniyede) Timer nesnesinin timer olayı gönderilir ve timerHandler() işlevi görüntüleme listesinde metin alanını günceller.