Nex Gen Media Server (NGMS) API’sı ile mobil görüntülü sohbet çerçevesi oluşturma

Ana Sayfa / Nex Gen Media Server (NGMS) API’sı ile mobil görüntülü sohbet çerçevesi oluşturma

Nex Gen Media Server (NGMS) API’sı ile mobil görüntülü sohbet çerçevesi oluşturma

Turk Muhabbet     26-04-20     sohbet     Nex Gen Media Server (NGMS) API’sı ile mobil görüntülü sohbet çerçevesi oluşturma     82 Defa Okundu

Nex Gen Media Server (NGMS) API’sı ile mobil görüntülü sohbet çerçevesi oluşturma

tanıtım

Nex Gen Media Server, en çok gerçek zamanlı ve kaydedilmiş videoyu birçok cihaza aktaran çok amaçlı bir medya akışı sunucusu olarak bilinir. Aynı medya sunucusu, gerçek zamanlı video iletişimini kolaylaştırmak için bir mobil uygulamaya gömülebilir. Burada, Android Yazılım Geliştirici Kiti (SDK) ve Google Android Doğal Geliştirici Kiti (NDK) kullanılarak Android cihazlar için görüntülü sohbet istemcisi oluşturulmasını kolaylaştırmak için NGMS API’sini kullanıyoruz.

Tüm ağ aktarım RTP hizmetlerini, video karesi sıkıştırmasını ve açma işlemini sağlamak için NGMS kullanıyoruz. NGMS, Android uygulamamız tarafından kullanılan yerel olarak derlenmiş bir paylaşılan nesne üzerinde çalışır.Java uygulama kodundan yerel yöntemleri çağırmak için Java Natural Interface (JNI) köprü katmanını kullanırız.

Ön requisistes

Bu makalede, Android uygulamaları oluşturma ve en azından orta düzeyde deneyim konusunda temel bilgilere sahip olduğunuz varsayılmaktadır. Eclipse gibi bir IDE’de, Android projesinin yapılandırması ve yapılandırması hakkında ayrıntılara girmeyeceğim. Zaten Android uygulamaları oluşturduysanız veya en azından bazı örnek eğitimler deneyimlediyseniz, gerçek zamanlı bir video akışı istemcisi oluşturmak için bu öğreticiyi kullanabilmeniz gerekir.

Henüz yapmadıysanız, Google Android SDK’sını (Yazılım Geliştirme Kiti) indirmeniz gerekir. Bu örnekte, Linux 32 bitlik bir makinede Revizyon 15’i kullandım. Java uygulama katmanı, gerçek Android uygulamasını oluşturmak için kullanılır. Uygulama kodu, NGMS API rutinini çağırmak için JNI katmanına eklenir.

Ayrıca Google Android NDK’yı (doğal geliştirici kiti) indirmeniz gerekir. Bu örnekte, Linux 32 bit makinede Revision 6b kullandım. NDK, doğal kod ve Java uygulama kodu arasında yapıştırıcı görevi gören bir doğal arayüz katmanı oluşturmak için kullanılır. Ayrıca C programlama dili hakkında temel bilgiye sahip olmalısınız.

İlk olarak bir iskelet kullanarak Eclipse gibi bir IDE kullanan bir Android uygulaması oluşturmalısınız. Bu örnekte uygulamaya ngmsclient adı verilmektedir. Java paketine com.example.ngmsclient denir ve Android OS 2.3 veya üstünü hedefler. Kök proje dizini, Java uygulama koduyla arabirim oluşturmak için kullanılan yerel kaynakları içeren “jni” adlı bir klasör içermelidir. Aşağıdaki örnekte bir Android uygulama iskeleti çalıştırdığınız varsayılmaktadır ve örnek bir Chat sınıfını Android projenize nasıl entegre edeceğinizi gösterir.

Antik katman

Katıştırılmış NGMS çekirdeği C biçiminde yazılır ve paylaşılan bir nesne dosyası olarak sıkıştırılır. Android işletim sistemi Linux tabanlı olduğundan, NGMS çekirdeği Android uygulama alanınızda yerel olarak çalışır. Ngmsvid.com adresinden Android işletim sistemi için NGMS çekirdek koleksiyonunu almanız gerekiyor. Önemli bileşenler libngms.so, libxcode.so kütüphane dosyaları ve ngmslib.h başlık dosyasıdır. Ngms ile birlikte gelen dosyalar, görüntülü sohbet hizmetleri sağlamak için video ngmsclient.apk ile sıkıştırılır.

JNI katmanı

Ngmsglue.so adında, ngms API’sı ile Java uygulama kodumuz arasında bir arayüz görevi gören ortak bir kütüphane oluşturuyoruz. Ngmsclient proje dizininizdeki Java Yerel Arabirimi (JNI) dizin yapısı şöyle görünmelidir.


jni/Android.mk
jni/ngmsglue.c
jni/ngms/include/ngmslib.h
jni/ngms/lib/libngms.so
jni/ngms/lib/libxcode.so

ngmsglue.c, NGMS çıkış ve giriş işlevlerini kontrol etmek için kod içerir. Kod, biri akış çıkış parametreleri ve diğeri akış giriş parametreleri için olmak üzere iki ayrı NGMS API bağlamını korur. Her bir işlevin adlandırma kurallarının, yerel kodu çağırdığınız Java paketinin ve sınıfının adıyla eşleşmesi gerektiğini unutmayın.

ngmsStartReceiver, bağlantı noktası 5004 aracılığıyla MPEG-2 TS kapsüllenmiş ağ video akışını dinlemek için NGMS Capture giriş API’sını sıfırlamak üzere çağrılır. Her başarılı video karesi otomatik olarak dağıtılır ve RGB565 piksel biçiminde kodu çözülür. Tüm çerçeve ngmsReceptionFrame çağrılarak okunabilir.

ngmsStartSender, NGMS akış çıkış API’sını sıfırlamak için çağrılır böylece kodlanmış video çerçeveleri 5004 bağlantı noktası üzerinden sunucuya gönderilir. ngmsTransmitFrame, bir ham çerçeveyi NV21 piksel biçiminde kodlamak ve iletmek için çağrılır.


/*
* ngmsglue.c
*
* JNI layer to access the NGMS streaming and capture API
*
*/

#include
#include
#include
#include
#include "ngmslib.h"

/**
* Holds the configuration for the NGMS RTP receiver and decoder
*/
static NGMSLIB_STREAM_PARAMS_T ngmsReceiver;

/**
* Holds the configuration for the NGMS RTP sender and encoder
*/
static NGMSLIB_STREAM_PARAMS_T ngmsSender;

/**
* Starts the NGMS capture service
*/
jint Java_com_example_ngmsclient_ExampleChat_ngmsStartReceiver (JNIEnv* _env, jobject _thiz)

char xcoderConfig[512];
char sdpConfig[512];
int i;

/*
* Before doing anything call ngmslib_open to open the NGMS service
*/
i = ngmslib_open(&ngmsReceiver);
if (i!= NGMS_RC_OK)

__android_log_print(ANDROID_LOG_ERROR, "ngms", "ngmslib_open failed with error %d", i);
return -1;

/*
* Construct an xcoder configuration key value string
*/
sprintf(xcoderConfig, "vc=rgb565,vx=320,vy=240");

/*
* Construct an SDP configuration for the RTP receiver
* Here we setup NGMS to read data over a MPEG-2 Transport Stream.
*/
sprintf(sdpConfig, "sdp://"
"m=video 5004 RTP/AVP 33n"
"a=rtpmap:33 MP2T/90000n"
"a=fmtp:33n");

/*
* Customize the capture configuration parameters
*/
ngmsReceiver.inputs[0] = sdpConfig;
ngmsReceiver.strxcode = xcoderConfig;
ngmsReceiver.islive = 1;
ngmsReceiver.noaud = 1;

/*
* Start the RTP receiver
*/
i = ngmslib_stream(&ngmsReceiver);

if (i!= NGMS_RC_OK)

__android_log_print(ANDROID_LOG_ERROR, "ngms", "ngmslib_stream failed with error %d", i);
ngmslib_close(&ngmsReceiver);
return -1;

return 0;

/**
* Stops the NGMS RTP capture service
*/
jint Java_com_example_ngmsclient_ExampleChat_ngmsStopReceiver (JNIEnv* _env, jobject _thiz)

/*
* Stop the RTP receiver
*/
ngmslib_close(&ngmsReceiver);

return 0;

/**
* NGMS Callback operation which blocks until a complete video frame has been received and decoded
*/
jint Java_com_example_ngmsclient_ExampleChat_ngmsReceiveFrame (JNIEnv* _env, jobject _thiz, jbyteArray frameBytes)

jstring str;

jboolean copy;
jbyte* buffer = (*_env)->GetByteArrayElements(_env, frameBytes, ©);
jsize max = (*_env)->GetArrayLength(_env, frameBytes);
int frameSize;

frameSize = ngmslib_readVidFrame(&ngmsReceiver, buffer, max, NULL);

(*_env)->ReleaseByteArrayElements(_env, frameBytes, buffer, JNI_ABORT);

return frameSize;

/**
* Starts the NGMS streaming service
*/
jint Java_com_example_ngmsclient_ExampleChat_ngmsStartSender (JNIEnv* _env, jobject _thiz, jstring remoteAddress)

char xcoderConfig[512];
char filter[512];
char destination[512];
const char *p;
int i;

/*
* Before doing anything call ngmslib_open to open the NGMS service
*/
i = ngmslib_open(&ngmsSender);

if (i!= NGMS_RC_OK)

__android_log_print(ANDROID_LOG_ERROR, "ngms", "ngmslib_open failed with error %d", i);
return -1;

/*
* Get the destination host string
*/
p = (*_env)->GetStringUTFChars(_env, remoteAddress, 0);

sprintf(destination, "rtp://%s:5004", p);

(*_env)->ReleaseStringUTFChars(_env, remoteAddress, p);

/*
* Customize the stream configuration parameters
*/
ngmsSender.output = destination;
sprintf(xcoderConfig, "vc=h264,vp=66,vb=250,vx=320,vy=240,vgmax=2000,vgmin=1500,vfr=15,vcfrout=-1,vth=1,vl=1,vsc=1,vf=2");
ngmsSender.strxcode = xcoderConfig;
sprintf(filter, "type=yuv420sp, ngmsSender.strfilters[0] = filter;
ngmsSender.inputs[0]= "/dev/dummyvideo";
ngmsSender.noaud = 1;

/*
* Start the RTP sender
*/
i = ngmslib_stream(&ngmsSender);

if (i!= NGMS_RC_OK)

__android_log_print(ANDROID_LOG_ERROR, "ngms", "ngmslib_stream failed with error %d", i);
ngmslib_close(&ngmsSender);
return -1;

return 0;

/**
* Stops the NGMS streaming service
*/
jint Java_com_example_ngmsclient_ExampleChat_ngmsStopSender (JNIEnv* _env, jobject _thiz)

/*
* Stop the RTP sender
*/
ngmslib_close(&ngmsSender);

return 0;

/**
* Encodes and transmits a single video frame using local RTP transport
*/
jint Java_com_example_ngmsclient_ExampleChat_ngmsTransmitFrame (JNIEnv* _env, jobject _thiz, jbyteArray frameBytes)

jboolean copy;
jbyte* buffer = (*_env)->GetByteArrayElements(_env, frameBytes, ©);
jsize size = (*_env)->GetArrayLength(_env, frameBytes);
int i;

i = ngmslib_onVidFrame(&ngmsSender, buffer, size);

(*_env)->ReleaseByteArrayElements(_env, frameBytes, buffer, JNI_ABORT);

return i;

Android NDK’nin ngmsglue kütüphanemizi oluşturmak için kullandığı Android.mk için bir makefile oluşturuyoruz.


#Example Android.mk Makefile

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:= ngmsglue
LOCAL_SRC_FILES:= ngmsglue.c
LOCAL_C_INCLUDES:= ngms/include
LOCAL_LDFLAGS:= -Lngms/lib
LOCAL_LDLIBS:= -llog -lm -lngms -lxcode

include $(BUILD_SHARED_LIBRARY)

Bir Ngmsglue.so paylaşılan kütüphanesi oluşturmak için şu adımları izleyin.


cd [YOUR NGMSCLIENT PROJECT DIR]/jni
$ANDROID_NDK_HOME/ndk-build

Bu bir çıktı dosyası sağlamalıdır [YOUR NGMSCLIENT PROJECT DIR]/libs/armeabi/ibngmsglue.so

Ngms / lib / libngms.so ve ngms / lib / libxcode.so kütüphanelerini libs / armeab çıkış dizinine manuel olarak kopyalamanız gerekebilir, çünkü bu dizinin içeriği otomatik olarak project.apk dosyasına sıkıştırılır.

Java uygulama katmanı

Java uygulama katmanı, geliştirdiğimiz Android uygulamasının uygulama düzeyi mantığından oluşur. Önceki bölümdeki kodu kullanmak için Android SDK’sını kullanarak basit bir uygulama oluşturmamız gerekiyor. Bu örnek, gerçek zamanlı etkileşimli video akışı sağlamak için kendi uygulamanız tarafından kullanılabilecek ClassChat kullanımını gösterir. Tam bir Android video akışı uygulaması oluşturmak için gereken tüm adımları göstermez. Orta düzey Android geliştiricisi, örneğin örnek temsil sınıfına dayalı olarak ve görevi tam uygulamaya dahil ederek görevi tamamlayabilmelidir.

Aşağıdaki örnek Chat sınıfı, bir NGMS akış vericisini ve bir NGMS akış alıcısını kontrol etmek için kullanılır. Fotoğraf makinesinin önizleme mekanizması kullanılarak yerel bir kameradan video akışını başlatmak için StartSender yöntemi çağrılabilir. Kameradan çıkan her video karesi NGMS API’sine iletilir ve burada yerel RTP kapsülleme ile kodlanır ve sunucu tarafına iletilir. StarReceiver yöntemi, aynı uygulamadaki uzak bir sunucudan video almaya başlamak için çağrılabilir. Bu iki yöntem, aynı uygulamanın iki uzak örneği arasında bir ağ üzerinde iki yönlü bir video akışı oluşturmak için kullanılabilir.


/*
* ExampleChat.java
*
*/

package com.example.ngmsclient;

import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback;
import android.graphics.ImageFormat;

public class ExampleChat
{
private boolean myReceiverRunning;
private Camera myCamera;
private PreviewCallback myCameraCallback;

/**
* Change this value to the destination where the video will be streamed
*/
private static final DESTINATION = "10.0.0.1";

/**
* method to initialize and start sending video from the local camera
*/
public void startSender () throws Exception

myCamera = Camera.open();

Parameters parameters = myCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPreviewFrameRate(15);
parameters.setPreviewSize(320, 240);

myCamera.setParameters(parameters);

/**
* Call the NGMS native method to perform streaming initialization
*/
ngmsStartSender(DESTINATION);

myCameraCallback = new PreviewCallback()

public void onPreviewFrame(byte[] frameBytes, Camera camera)

/**
* Call the NGMS native routine to encode and transmit the video frame
* to the remote destination using RTP transport.
*/
ngmsTransmitFrame(frameBytes);

myCamera.startPreview();
myCamera.setPreviewCallback(myCameraCallback);

/**
* method to stop sending video
*/
public void stopSender () throws Exception

ngmsStopSender();

/**
* method to start receiving remote video
*/
public void startReceiver () throws Exception

/**
* Call the NGMS native method to perform input initialization
*/
ngmsStartReceiver();

/**
* Start the thread which will poll for received video frames
*/
new Thread(myVideoFrameReceiver).start();

/**
* method to stop receiving remote video
*/
public void stopReceiver () throws Exception

myReceiverRunning = false;
ngmsStopReceiver();

/**
* Thread used to check for decoded video frames
* received by the NGMS native layer
*/
private Runnable myVideoFrameReceiver = new Runnable()

public void run()

/**
* Allocate a buffer to hold a video frame 320 x 240 pixels
* in RGB565 format, taking 16 bits (2 bytes) per pixel.
*/
byte[] frameBytes = new byte[ 320 * 240 * 2 ];
int size;
myReceiverRunning = true;

while(myReceiverRunning)

/**
* Block until a frame has been received and decoded by the native layer
*/
size = ngmsReceiveFrame(frameBytes);
if(size > 0)

/**
* The frameBytes array represents a video frame in RGB565 format.
* These bytes can be converted into a Bitmap object for display
* on the screen.
*/



/**
* Static initialization to load native libraries into address space
*/
static

System.loadLibrary("xcode");
System.loadLibrary("ngms");
System.loadLibrary("ngmsglue");

/**
* Define native method prototypes
*/
public native int ngmsStartReceiver ();
public native int ngmsStopReceiver ();
public native int ngmsReceiveFrame (byte[] frameBytes);

public native int ngmsStartSender (String remoteAddress);
public native int ngmsStopSender ();
public native int ngmsTransmitFrame (byte[] frameBytes);

}

Örneğin, kendi Android projenizi SampleChat sınıfına entegre ettiyseniz, üç yerel kütüphanenin de proje / libs dizininde olduğundan emin olun, böylece .apk çıktınıza dahil edilir.


libs/armeabi/libngms.so
libs/armeabi/libxcode.so
libs/armeabi/libngmsglue.so

Bu örnek, hedef IP adresi 10.0.0.1’e video çıkışı üretir. İki istemciden 2 yönlü video akışını başarıyla etkinleştirmek için IP adresini uzak istemcinize uyacak şekilde değiştirmeniz gerekir.

Sonuç

Yukarıdaki örnek, canlı nesne videolarının bir kamera nesnesinden gerçek zamanlı olarak nasıl aktarılacağını ve canlı olarak nasıl akış yapılacağını ve görüntülenecek her bir video kodunun nasıl ayrılacağını gösterir. Tam bir görüntülü sohbet uygulaması oluşturmak üzere ses akışı eklemek için aynı işlem akışı kullanılabilir. –

Katıştırılmış Nex Gen Media Server (NGMS) API kılavuzunu görüntülemek için şu adrese gidin: http://ngmsvid.com/develop.php

Etiketler:

Sende Paylaş:  Facebook    Tweet    Pinterest    Google+    Whatsapp  

Yazı hakkında görüşlerinizi belirtmek istermisiniz?


DMCA.com Protection Status