2011-07-03 31 views
9

EDIT: Cambié mi pregunta para aclarar mejor el problema. ¿Cómo es posible reproducir un video desde una matriz de bytes (tomada del recurso incrustado) usando la biblioteca DirectShow.Net?Reproducir recurso de video incrustado como secuencia

Como voy a evitar que los usuarios accedan al archivo de video, necesito incrustar el archivo de video como recurso y reproducirlo.

Gracias de antemano.

+0

Los recursos se pueden extraer fácilmente de los ensamblados de .Net. Puede encriptar los datos, pero la clave debe estar en su código, y nuevamente el código fuente puede extraerse fácilmente de su ensamblado .Net. – habakuk

+0

Voy a utilizar protectores como SmartAssembly. –

Respuesta

4

Es un poco no estándar, pero podría usar algo como WCF para autoevaluar un punto final dentro de su aplicación de escritorio. A continuación, configure la fuente de la entrada de video para que sea la "URL" de su punto final alojado automáticamente. Eso funcionaría para WPF o WinForms. No estoy seguro acerca de Silverlight sin embargo.

El punto extremo alojado automáticamente podría extraer los medios de sus recursos incrustados y transmitirlos desde allí.

+0

Gracias, esa es una idea genial. ¿Es posible utilizar WCF RIA Services para interactuar entre la aplicación Silverlight y la aplicación de Windows? –

+1

No estoy seguro. ¿Puedes describir esto un poco más? ¿Desea que una aplicación de escritorio aloje el servicio WCF RIA y luego una aplicación Silverlight ejecutándose también en el cliente? En teoría, creo que esto funcionaría, pero definitivamente es un caso de uso no estándar. Es posible que tenga algunos problemas con el dominio cruzado también. – NathanAW

+0

Como mencioné, voy a reproducir un recurso de video como transmisión. Como no encontré una solución fácil, pensé que podría ser práctico usar el control Silverlight MediaElement en la aplicación de Windows, porque MediaElement acepta un medio de fuente de tipo Stream. –

1

Me parece que el problema no es tanto cómo usar la biblioteca de DirectShow (the `DirectShow.Net Forum está específicamente diseñado para eso), sino más bien cómo usar un recurso incrustado.

Me encontré con algo similar hace unos años en un contrato de trabajo donde un empleador estaba preocupado de que algún cliente podría robar su información de propiedad. Mi información estaba en cientos de documentos PDF, pero la idea funciona igual para los archivos de video.

Así es como he abordado el problema:

  • En primer lugar, colocar el archivo de video en su lista de recursos: Consumo Visual Studio, así que vaya a las propiedades del Project 's, haga clic en la ficha Recursos, seleccione la opción archivos y elija Add Resource>Add Existing File...

  • Agregar los dos siguientes namespaces en el fichero de código que va a utilizar:

using System.IO; 
using System.Diagnostics; 
  • Por último, en el que desea reproducir el archivo de vídeo, acaba de hacer algo similar a lo siguiente:
Process player = null; 
string tempFile = "~clip000.dat"; 
try { 
    File.WriteAllBytes(tempFile, Properties.Resources.MyMovie_AVI); 
    player = Process.Start(tempFile); 
    player.WaitForExit(); 
} finally { 
    File.Delete(tempFile); 
} 

más probable es que lo hará no llame al método Process.Start, sino la aplicación método DirectShow ropriate. La idea sigue siendo la misma: Extraiga sus recursos como una matriz byte, escríbalos en un nuevo archivo temporal, utilice el archivo y elimínelo siempre que haya terminado.

Asegúrese de poner la declaración Delete en el bloque finally de manera que si se produce algún error o el usuario cierra el programa, mientras que el archivo todavía está jugando, su aplicación sigue siendo limpia el archivo antiguo.

EDIT:

Creo que esto podría ser una forma viable de hacer esto:

using (MemoryStream ms = new MemoryStream(Properties.Resources.MyMovie_AVI)) { 
    // Now you have to find a way in `DirectShow` to use a Stream 
} 
+0

Gracias, pero esa no es una solución segura. El usuario aún puede copiar el archivo de video del directorio temporal. Quiero hacer el trabajo sin necesidad de escribir el contenido del recurso en el disco duro. –

+0

Ver la edición anterior. Agregué una opción 'MemoryStream'. ¿'DirectShow' tiene algo que toma una secuencia? – jp2code

+0

Gracias, sé cómo usar MemoryStream para leer el archivo de video del recurso incrustado. El problema es "¿Cómo reproducir un video desde una matriz de bytes?". –

1

Se puede utilizar una biblioteca diferente?

Utilicé el WPF MediaKit para hacer una transmisión no estándar de un flujo de video h264 en vivo y seguro. El desarrollador (Jermiah Morill) fue muy receptivo, y la personalización que pude realizar fue extensa (ya que obtiene la fuente).

En ese momento, podría incrustar el video como un recurso incrustado, cargar la matriz de bytes (quizás parte de ella a la vez o todo el archivo) en la memoria y reproducir desde la memoria.

+0

Gracias, ¿Qué son los códecs compatibles incorporados? –

+0

Usted apuesta. Ha pasado un tiempo, pero no creo que incluya ningún otro códec; usa los que ya están instalados en el sistema. – Jason

Cuestiones relacionadas