Expression Encoder

Buenas!

 

Lo primero: Saludaros a todos ya que este es mi primer post. Bienvenidos!

 

Lo segundo: Me gustaría hacer de este un blog útil. A que me refiero con esto:

 

Este blog está orientado a gente que esta en las trincheras como yo, tragando polvo y picando código.

Intentare que haya cierto contenido técnico para explicar el contexto de los ejemplos, pero al final, lo que busco, es que el ejemplo le resulte útil a alguien en su día a día, en ese momento desesperado en el que hemos querido tirar el monitor por la ventana y convertirnos en ermitaños.

 

Bueno, a lo que nos interesa.

Hace poco he tenido que trabajar en VS con Expression Encoder para emitir video y audio capturado de la webcam y el micro del portátil. La verdad es que ha sido bastante mas sencillo de lo que en un primer momento me parecía. Excepto la pantalla de preview..ahora os contaré porque. Primero un poco de código (más abajo lo tenéis explicado trozo a trozo, esto es por si alguno quiere hacer copy-paste).

private void StartEncoder()

{

//Buscar dispositivos

var videoDevices = EncoderDevices.FindDevices(EncoderDeviceType.Video);

var audioDevices = EncoderDevices.FindDevices(EncoderDeviceType.Audio);

if (videoDevices.Count != 0 && audioDevices.Count != 0)

{

//Cargar origenes de datos archivo – dispositivos

LiveFileSource firstFileSource = liveJob.AddFileSource(Path.Combine(Mypath, firstVideoSource));

LiveDeviceSource firstDeviceSource = liveJob.AddDeviceSource(videoDevices[0], audioDevices[0]);

firstFileSource.PlaybackMode = FileSourcePlaybackMode.Loop;

//Pantalla de previsualizacion

if (previewWindow == null)

{

previewWindow = new PreviewWindow(windowHandle);

}

firstDeviceSource.PreviewWindow = previewWindow;

firstDeviceSource.ResizeMode = VideoResizeMode.Stretch;

//Logica push – pull para streaming de origen de datos

if (mainEvent.PushTrue_PullFalse)

{

SetPushStream();

}

else

{

SetPullStream();

}

//definir origen como activo y comenzar streaming

liveJob.ActivateSource(liveJob.DeviceSources[0]);

liveJob.StartEncoding();

}

}

 

Explicación (coged fuerzas):

 liveJob es una variable de tipo LiveJob.  LiveJob podríamos decir que es el evento de retransmisión, tiene los datos de lo que queremos emitir, como lo queremos emitir..pero ya cruzaremos cada puente cuando lleguemos.

Lo primero que hacemos es recuperar una lista de las cámaras instaladas en el equipo, para ello llamamos a la función FindDevices() diciéndole que queremos dispositivos de captura de video. Hacemos lo mismo con el audio y almacenamos ambos en listas.


var videoDevices = EncoderDevices.FindDevices(EncoderDeviceType.Video);

var audioDevices = EncoderDevices.FindDevices(EncoderDeviceType.Audio);



Para mi ejemplo lo que hago es comprobar que haya al menos una cámara y un micro instalados, esto en cada caso podrá tratarse de distinta forma.

Tras esto cargo :



LiveFileSource firstFileSource: Este objeto se utiliza cuando queremos retransmitir un video, por ejemplo, algún elemento que no queremos capturar de dispositivos.

LiveDeviceSource firstDeviceSource: Este, sin embargo, se utiliza en los casos en los queramos capturar la señal de algún dispositivo.



Lo que hago es bastante sencillo, cargo el firstFileSourcecon un archivo que cojo de un path y el firstDeviceSource con la primera cámara y  micro que haya encontrado la función FindDevices() . Para este ejemplo no necesitamos más.



LiveFileSource firstFileSource = liveJob.AddFileSource(Path.Combine(Mypath, firstVideoSource));

LiveDeviceSource firstDeviceSource = liveJob.AddDeviceSource(videoDevices[0], audioDevices[0]);

 


Establecemos el video como loop, para que cuando termine empiece de nuevo automáticamente.

Si la ventana de preview no esta inicializada, lo hacemos ahora, con el handle (windowHandle) del control que queramos y asociamos el PreviewWindow del firstDeviceSource al PreviewWindow que acabamos de inicializar, para ver en el control deseado el preview de la cámara. Y aquí es donde he tenido la mayor parte de los problemas.



if (previewWindow == null)

{

previewWindow = new PreviewWindow(windowHandle);

}

firstDeviceSource.PreviewWindow = previewWindow;

firstDeviceSource.ResizeMode = VideoResizeMode.Stretch;

 


La aplicación estaba desarrollada en WPF, y a la hora de coger el handle de un control siempre me cogía el de la ventana en la que dicho control se encontraba. No tengo mucha experiencia con WPF , lo que me dificultó la labor de saber que estaba pasando..tras varias pruebas comenzaba a desesperarme…

Start

..vamos..

Difficult

..vamos..

Difficult

Y…

fuuuu

 

Al final (gracias a la inestimable ayuda de Josue Yeray) insertamos un WindowsHost y listo, pero ojo con esto a quien trabaje con WPF. Quizás haya formas mejores, estoy abierto a sugerencias :) .

Volviendo al código, la función SetPullStream() :



PullBroadcastPublishFormat pullFormat = new PullBroadcastPublishFormat();

pullFormat.BroadcastPort = defaultPort;

liveJob.PublishFormats.Add(pullFormat);



De esta manera le decimos al liveJob que tiene que realizar el streaming por pull en el puerto indicado (defaultPort, en cada caso el necesario/deseado). La versión por push es bastante parecida a nivel de codigo:



PushBroadcastPublishFormat pushFormat = new PushBroadcastPublishFormat();

pushFormat.PublishingPoint = publishingPoint;

pushFormat.UserName = user;

pushFormat.Password = password;

liveJob.PublishFormats.Add(pushFormat);



En este caso tenemos que especificar mas información. El publishing point representa la dirección a la que se tienen que conectar otros equipos para poder consumir lo que este en streaming. User y password seran necesarios para poder establecer un publishing point válido. (Si queréis algo más de información sobre las propiedades pinchad aquí).

Se que esta siendo duro pero falta poco.



liveJob.ActivateSource(liveJob.DeviceSources[0]);
liveJob.StartEncoding();



ActivateSource activa la fuente que deseemos (en nuestro caso el video o la cámara + micro. En el ejemplo activamos el DeviceSources, por lo tanto cámara + micro).

StartEncoding() retransmite el source que hemos activado vía pull o push, lo que le hayamos configurado.

Listo! ya tenemos nuestro video retransmitiendo!.

Ya que ha sido un primer post tan denso dejaré para el próximo como cambiar de source, como parar nuestro streaming y algunas cosas más.

Espero que os resulte útil y os haya ahorrado algún que otro quebradero de cabeza.

 

Un saludo y hasta la próxima!.

P.D: Aquí debajo os dejo un link a msdn sobre como comenzar a trabajar con Expression Encoder SDK (referencias, usings, etc… )

http://msdn.microsoft.com/en-us/library/cc761462(v=Expression.40).aspx