Pregunta

Lo que quiero hacer es lo siguiente: necesitamos proteger el contenido de video (cifrarlo) y poder reproducirlo.

La parte difícil es que no queremos cargar todo en la memoria a la vez y descifrar allí. (Aunque también es una opción)

Lo que esencialmente estoy buscando es la solución para que reproduzcamos contenido de video Encrpyted, de HDD, de modo que solo nuestra aplicación pueda reproducir ese video.

Sin embargo, debe leer el archivo desde el bloque por bloque (porque si estamos tratando con el archivo de 2 GB, no debe cargarse en la memoria de una vez).

Háganos saber, ¿cuáles son las formas posibles?

  • Silverlight4 DRM - Bien, esto parece una solución razonable, lo suficientemente flexible para nuestras necesidades. Sin embargo, el SDK de PlayReady cuesta alrededor de $ 30,000 y no queremos usar Silverlight. Presumiblemente C# o C ++

  • Bueno, una idea que tuvimos, es dividir un archivo de video grande para separar archivos de video cifrados (como secuencia) y luego cargar cada archivo ("bloqueo") para memoria directa/descifrarlo y reproducirlo desde la memoria (y alternar entre archivos de secuencia), Este parece ser el más fácil hasta ahora y probablemente el que realmente podría hacerse. Sin embargo, ¿qué libs son capaces de reproducir un archivo de video desde MemoryStream? Creo que VLC debería poder hacerlo ...?

  • Otra idea era simplemente tomar AVI sin comprimir, procesar el cuadro de video por cuadro, modificar cada cuadro (cifrarlo de alguna manera), ahora cuando reproducimos el video, reprocesamos el marco en la memoria y lo descifraremos.

  • Tratar solo con un códec específico y escribir una solución personalizada para ello: en realidad, esto suena bastante bien, pero me temo que nos llevará demasiado tiempo, pero háganos saber sobre este enfoque

  • El otro, que usa VLC para reproducir la transmisión encriptada de LocalHost (por ejemplo, la aplicación está transmitiendo el archivo HDD encriptado al localhost: 800/blahblah) y la misma aplicación tiene control de VLC allí para descifrar la secuencia cifrada. Todavía no sabemos si el archivo en HDD también se puede encriptar (por lo que el usuario no podría reproducir ese archivo en otro jugador), además de VLC es GPL, lo cual no es bueno para nosotros.

¿Fue útil?

Solución

La tubería de reproducción suele ser un conjunto de componentes conectados. En DirectShow, una de las API y la más popular, uno usa el lector, el divisor, los códecs, el procesamiento posterior y las partes de presentación conocidas como filtros y todo se reproduce. Es posible sustituir al lector con su propio reemplazo que lee contenido cifrado y decodes sobre la marcha. Se puede decodificar fácilmente a pedido, no es necesario decodificar todo el bloque de 2 GB para, por ejemplo, obtener un primer cuadro o una miniatura.

Al haber conectado la parte del lector, es libre de elegir el método de cifrado, entre el algoritmo personalizado, uno de la biblioteca de API o externa bien conocida.

Aún así, creo que esta y otras formas (al menos la mayoría de las otras) no le dan una garantía a prueba de balas de que el contenido codificado no puede revertirse. Alguien más aún puede conectarse a la tubería y obtener contenido decodificado desde allí. Si está contento de que esto al menos requiera complejidad y experiencia para implementar, entonces dicho cifrado funcionará bastante bien.

Otros consejos

Casi todos los algoritmo de cifrado ampliamente utilizado funcionan en bloques de tamaños entre 128 y 256 bits, y felizmente descifrarán solo unos pocos de estos a la vez, bien para la transmisión. Echa un vistazo, por ejemplo, Cripto ++ para una biblioteca de software que tiene interfaces de transmisión. (Es decir, solo abres un archivo, pones un filtro de descifrado alrededor de eso y luego continúas más o menos como con cualquier otro archivo).

Ok, así es como lo hice. (Androide)

El video cifrado se coloca en SD-Card. RC4 encriptado, por lo que se puede convertir en la mosca mientras se transmite. Luego creé un servidor de archivos local que se ejecuta en el dispositivo (como un servicio). La transmisión de salida hace algo extra antes de enviar datos: lo filtra a través de un DecryPter RC4 antes de escribirlo en el búfer. Luego solo apunte al reproductor multimedia a la URL del video (http: // localhost: puerto/abc.3gp "). Como resultado, el video de la tarjeta sd sigue siendo segura, no puede reproducirlo a menos que tenga la clave, que usted Debería diferir para cada video para seguridad adicional.

Gracias a todos por los respiradores. Soy un tipo que pasó por muchos enfoques diferentes.

Escribí mi propio VideoPlayer usando OpenGL+FFMPEG que podría reproducir MP4 y descifrar cada cuadro en la GPU usando sombreadores. También experimenté con otras posibles soluciones, como la transmisión de un servidor web que usa VLC. (VLC ofrece algún tipo de cifrado/descifrado cuando se trata de corrientes), y yada yada yada.

Además, una solución era usar 4 MediaElements (WPF) y el video real se dividió prácticamente en 4 áreas y cada área se giró para que el video no fuera visible. Una vez que cargó el video en 4 medias, podría trazar qué parte quería mostrar y también girarlo. Pero con toda honestidad, la medieve es malo.

Sin embargo, terminé exactamente con lo que dijo Romanr. Construí el gráfico directo de DirectShow con MP4Splitter, FFDShow, VideoRenderer y modifiqué MP4Splitter SourceFilter. La lectura ocurre en BasesSitter/AsynCreader.cpp (simplemente modifique la función SynCread) que usa MP4Splitter.

Si desea implementarlo usted mismo, simplemente use el proyecto MPC-HC y modifique los filtros como desee. Me tomó algún tiempo sortear el concepto directo, pero una vez que lo entiendes, se convierte en un gran arma.

http://sourceforge.net/apps/trac/mpc-hc/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top