View MJPG Video Streaming in Xamarin.Android
View MJPG Video Streaming in Xamarin.Android
Hey today we learn how to implement a simple view over a simple binding(https://bitbucket.org/neuralassembly/simplemjpegview/overview) to show an streaming of a IP Cam (MJPEG) lets start:
First add a new Android App Project like the snapshot:
Then add an "Android Java Bindings Library":
In the binding project we add an Jar library, you can download a compiled jar from here (https://app.box.com/s/1o558pfmacy65fv07mk1)
After this you can add our binding library to Android App Project
The library uses a "libImageProc" Native Library to process video data we need to add all of this .so files (https://app.box.com/s/6fydrwwc9ac9esn0fu0o), I Recommend to add it in a new "Lib" folder
After adding the native library we need to change BuildAction for each of .so files to "AndroidNativeLibrary"
After this configuration steps now yes now we continue with the CODE, Fuck Yeah¡¡¡
Here a simple layout implementing a MJPEG view
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText1"
android:text="http://webcam.st-malo.com/axis-cgi/mjpg/video.cgi?resolution=640x480" />
<Button
android:id="@+id/myButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="watch" />
<com.camera.simplemjpeg.MjpegView
android:id="@+id/mv"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
Now here the code of MainActitivy.cs
using Com.Camera.Simplemjpeg; using System.Threading.Tasks;
[Activity (Label = "MJPGApp", MainLauncher = true)]
public class MainActivity : Activity
{
//MjpegView instance
private MjpegView mv = null;
//Play button
Button button=null;
//UI EditText with URL
EditText txturl=null;
//Streaming URL
String URL = "http://webcam.st-malo.com/axis-cgi/mjpg/video.cgi?resolution=640x480";
//Layout sizes for video view
private int width = 640;
private int height = 480;
//Suspendign straming bool variable
private bool suspending = false;
//OnCreate Method
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
//initialize mjpeg view with UI Android XML
mv = FindViewById<MjpegView>(Resource.Id.mv);
//check if the instance is valid
if (mv != null)
{
//set the resolution of streaming
mv.SetResolution(width, height);
}
//assignation of UI items
button = FindViewById<Button> (Resource.Id.myButton);
txturl = FindViewById<EditText> (Resource.Id.editText1);
//button click event
button.Click += delegate {
//take URL from txturl(EditText) field
URL = txturl.Text;
//Begin a task method to streaming
BeginStreaming(URL);
};
//Begin a task method to streaming
BeginStreaming(URL);
}
//OnResume Method check if streaming is suspending and continue with the streaming
protected override void OnResume()
{
base.OnResume();
if (mv != null)
{
if (suspending)
{
BeginStreaming(URL);
suspending = false;
}
}
}
//OnDestroy Free Memory of a streaming
protected override void OnDestroy()
{
base.OnDestroy();
if (mv != null)
{
mv.FreeCameraMemory();
}
}
//OnPause put the streaming suspending
protected override void OnPause()
{
base.OnPause();
if (mv != null)
{
if (mv.IsStreaming)
{
mv.StopPlayback();
suspending = true;
}
}
}
///
/// Begins the streaming.
/// with a parallel task we start the streaming
///
/// URL.
public void BeginStreaming(string url)
{
//Create a new task with a MjpegInputStream return
Task.Factory.StartNew(() =>
{
try
{
//inicialize streaming
return MjpegInputStream.Read(url);
}
catch (Exception e)
{
//if something was wrong return null
Console.WriteLine(e.Message);
}
return null;
}).ContinueWith((t) =>
{
//check if the result was fine
mv.SetSource(t.Result);
if (t.Result != null)
{
//set skip to result
t.Result.SetSkip(1);
Title = "Connected";
}
else
{
Title = "Disconnected";
}
//set display mode
mv.SetDisplayMode(MjpegView.SizeFullscreen);
//set if you need to see FPS
mv.ShowFps(false);
});
}
}
Now you can add a ip camera to your Xamarin.Android Apps:
The library page source: https://bitbucket.org/neuralassembly/simplemjpegview/overview
Full Example at GitHub: https://github.com/AlejandroRuiz/Mono/tree/master/MJPGApp
IP Camera sources: http://www.ttrix.com/apple/iphone/ipvision/ipvisionpubcameras.html
Now just relaxed, we finish for today:















Que tal buen dia, estoy intentando replicar tu ejemplo en una app que estoy realizando pero me marca algunos errores al intentar compilarla ya que no me reconoce algunas clases y quisiera ver si existe posibilidad de que ayudes.
ResponderEliminarRaro acabo de bajar el proyecto y me compila sin problemas verifica la version de android y si tienes instalada las tools correctas
EliminarSegún yo estaba siguiendo al pie de la letra tu proyecto y al compilar no me reconoce la clase Mjpeg y yo buscaba el proyecto para descargar para probarlo igual si me lo puedes enviar en rar o zip te lo agradecería mucho.
EliminarDe hecho hace un momento ya pude descargar el proyecto pero si quizas me falte alguna herramienta o plugin pero ya nose que mas instalar, tu que me sugieres?
https://app.box.com/s/nwo5gay9lee6ffsghvkytge7muzg89tz baja la solucion de aqui practicamente es compilar y listo deberia de funcionar
EliminarMuchas gracias, lo descargo y lo pruebo y ya te digo si logro hacerlo correr
EliminarPhenomenal Blog!!! thanks for your post and awaiting for your new updates...
ResponderEliminarXamarin Developers in Frisco