Introducción
Brightcove se ha asociado con NAGRA para proporcionar marcas de agua forenses como una función en la plataforma Video Cloud. Esto ayudará a proteger su contenido premium de la piratería y el intercambio de contenido no autorizado. Esta función también ayuda a identificar rápidamente la fuente de una fuga de contenido, de modo que se puedan tomar medidas.
El siguiente diagrama muestra una descripción general:
- preparación de contenido
- La marca de agua forense es una marca de agua invisible incrustada en el video durante la transcodificación con el SDK de Nagra.
- La ingestión crea 2 representaciones de VOD, una con marca de agua A y otra con marca de agua B; ambas versiones son parte del mismo título en Video Cloud
- Entrega
- Al reproducir el contenido, el token de Forensic Watermark se proporciona al reproductor y luego se incluye en la URL utilizada para solicitar contenido de la CDN.
- La CDN interpreta el token y entrega el video con la secuencia correcta de segmentos A/B al espectador.
Configuración
Se necesita la siguiente configuración para admitir la solución de marca de agua forense de Brightcove:
-
Comuníquese con su gerente de éxito del cliente:
- Asegúrese de que su cuenta esté habilitada para Dynamic Delivery.
- Habilite su cuenta para la marca de agua forense; Este es un complemento de pago de Video Cloud.
- Obtenga su clave de licencia de NAGRA.
- Genere un par de claves pública-privada que será utilizada por el JWT de marca de agua forense y descifrada por la CDN. (vea abajo)
- Utilice el script proporcionado por NAGRA para generar un token web JSON (JWT) para la marca de agua forense. Asegúrese de administrar cómo se vinculan el token de marca de agua forense y cada visor. Lo necesitarás cuando configures tus reproductores y en el caso de hacer un servicio de detección para saber qué espectador filtró el contenido ilegalmente.
Hay muchas formas de generar el par de claves pública-privada. Aquí hay unos ejemplos:
Ejemplo de script de bash:
Script de ejemplo para generar el par de claves:
#!/bin/bash
set -euo pipefail
NAME=${1:-}
test -z "${NAME:-}" && NAME="brightcove-forensic-watermarking-key-$(date +%s)"
mkdir "$NAME"
PRIVATE_PEM="./$NAME/private.pem"
PUBLIC_PEM="./$NAME/public.pem"
PUBLIC_TXT="./$NAME/public_key.txt"
ssh-keygen -t rsa -b 2048 -m PEM -f "$PRIVATE_PEM" -q -N ""
openssl rsa -in "$PRIVATE_PEM" -pubout -outform PEM -out "$PUBLIC_PEM" 2>/dev/null
openssl rsa -in "$PRIVATE_PEM" -pubout -outform DER | base64 > "$PUBLIC_TXT"
rm "$PRIVATE_PEM".pub
echo "Public key to saved in $PUBLIC_TXT"
Ejecute el script:
$ bash keygen.sh
Ejemplo usando Go
Ejemplo usando el Go lenguaje de programación para generar el par de claves:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"flag"
"fmt"
"io/ioutil"
"os"
"path"
"strconv"
"time"
)
func main() {
var out string
flag.StringVar(&out, "output-dir", "", "Output directory to write files into")
flag.Parse()
if out == "" {
out = "rsa-key_" + strconv.FormatInt(time.Now().Unix(), 10)
}
if err := os.MkdirAll(out, os.ModePerm); err != nil {
panic(err.Error())
}
priv, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err.Error())
}
privBytes := x509.MarshalPKCS1PrivateKey(priv)
pubBytes, err := x509.MarshalPKIXPublicKey(priv.Public())
if err != nil {
panic(err.Error())
}
privOut, err := os.OpenFile(path.Join(out, "private.pem"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
panic(err.Error())
}
if err := pem.Encode(privOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: privBytes}); err != nil {
panic(err.Error())
}
pubOut, err := os.OpenFile(path.Join(out, "public.pem"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
panic(err.Error())
}
if err := pem.Encode(pubOut, &pem.Block{Type: "PUBLIC KEY", Bytes: pubBytes}); err != nil {
panic(err.Error())
}
var pubEnc = base64.StdEncoding.EncodeToString(pubBytes)
var pubEncOut = path.Join(out, "public_key.txt")
if err := ioutil.WriteFile(pubEncOut, []byte(pubEnc+"\n"), 0600); err != nil {
panic(err.Error())
}
fmt.Println("Public key saved in " + pubEncOut)
}
Ejemplo usando node.js
Ejemplo usando node.js para generar el par de claves:
var crypto = require("crypto");
var fs = require("fs");
var now = Math.floor(new Date() / 1000);
var dir = "rsa-key_" + now;
fs.mkdirSync(dir);
crypto.generateKeyPair(
"rsa",
{modulusLength: 2048},
(err, publicKey, privateKey) => {
fs.writeFile(
dir + "/public.pem",
publicKey.export({ type: "spki", format: "pem" }),
err => {}
);
fs.writeFile(
dir + "/public_key.txt",
publicKey.export({ type: "spki", format: "der" }).toString("base64") +
"\n",
err => {}
);
fs.writeFile(
dir + "/private.pem",
privateKey.export({ type: "pkcs1", format: "pem" }),
err => {}
);
}
);
console.log("Public key saved in " + dir + "/public_key.txt");
Implementación
Puede implementar la marca de agua forense con Video Cloud Studio o puede hacerlo manualmente mediante las API de Brightcove. Los métodos se detallan en las siguientes secciones.
Video Cloud Studio
Siga estos pasos para utilizar la marca de agua forense con Video Cloud Studio:
-
La marca de agua forense no está vinculada a un perfil de ingesta específico. Puede utilizar cualquier perfil de codificación sensible al contexto o de entrega dinámica.
- Proporcione a Brightcove su clave de licencia NAGRA. Esta clave de licencia se utilizará durante la transcodificación para generar la marca de agua.
- En el Subir módulo, seleccione su perfil de ingesta.
-
Comprobar el Habilitar marca de agua forense opción.
-
Agregar la etiqueta
watermarked
al video, ya que esto hará que sea mucho más fácil identificar los videos con marcas de agua forenses y generar informes analíticos sobre ellos: -
Arrastra o busca tu video para iniciar la transferencia.
-
Configura tu reproductor.
Aquí es donde pasará el token de marca de agua NAGRA y el ID de espectador al jugador. Puede utilizar el reproductor web Brightcove o los reproductores Native SDK:
- Reproduzca contenido que se haya ingerido para la marca de agua forense.
Informes analíticos
Los informes de análisis sobre los espectadores de videos forenses con marca de agua están disponibles a través de la API de análisis solamente. Los informes se pueden devolver en formato JSON, CSV o XLXS
En los datos de Analytics:
1 Transaction = 1 unique Viewer per video in 24 hours
Ejemplo 1: espectadores de un video por fecha
Para este ejemplo, consultaremos el video
, viewer
y date
dimensiones y recuperar el informe en formato CSV.
Solicitud de muestra
https://analytics.api.brightcove.com/v1/data?accounts=4800266849001&from=2021-06-23&to=2021-06-25&dimensions=date,viewer&limit=10&where=video==70702952720202&fields=video,viewer,video_view&format=csv
Respuesta
"date","video","viewer","video_view"
"2021-06-25","70702952720202","3f46037f932b0c5a","1"
"2021-06-24","70702952720202","3f46037f932b0c5a","2"
Tenga en cuenta que el viewer
es generado por el reproductor Brightcove y configurado en una cadena única basada en el agente de usuario y la IP. Lo ideal sería que usted mismo estableciera el identificador de espectador en función de una identificación de inicio de sesión; consulte este tema para obtener información sobre cómo hacerlo. Su identificador se basará en la información que se puede recuperar a través de JavaScript.
Ejemplo 2: recuento de espectadores
En este ejemplo, asumiremos que todos los videos con marca de agua forense tienen la etiqueta watermarked
. Nuevamente consultaremos el video
, viewer
y date
dimensiones y solo devuelva un artículo, ya que es el resumen que nos interesa aquí:
Solicitud de muestra
https://analytics.api.brightcove.com/v1/data?accounts=4800266849001&from=2021-06-23&to=2021-06-25&dimensions=date,viewer&limit=1&where=video.q==tags:watermarked
Respuesta
{
"item_count": 7,
"items": [
{
"date": "2021-06-25",
"viewer": "07B1489C-5786-400E-945B-ABB3559B3897",
"video_view": 1
}
],
"summary": {
"video_view": 25
}
}
API
Aquí están las API y los campos relacionados con la marca de agua forense:
API de ingesta dinámica
Una vez que una cuenta está habilitada para marcas de agua forenses, puede agregar marcas de agua forenses a un video agregando el forensic_watermarking
campo a su solicitud de ingesta, y configurándolo en true
. Esto se puede hacer para la ingestión original, reemplazando o retranscodificando el video.
Cuerpo de solicitud de muestra
{
"master": {
"url": "https://solutions.brightcove.com/video/Walking_Dead_609.mp4",
"audio_tracks": [
{
"language": "en",
"variant": "main"
}
]
},
"profile": "multi-platform-standard-static-with-mp4",
"forensic_watermarking": true,
"capture-images": true
}
También hay una forensic_watermarking_stub_mode
bandera que, cuando se establece en true
produce marcas de agua forenses visibles:
forensic_watermarking
también debe establecerse en true
para habilitar las marcas de agua visibles.
Use marcas de agua visibles en un video para probar integraciones (debe probar con un video de al menos 10 minutos de duración). Una vez que haya verificado que las marcas de agua forenses están presentes, querrá eliminarlas para tener solo marcas de agua forenses invisibles. Para hacer esto, deberá enviar otra solicitud de Ingesta dinámica para retranscodificar el video, esta vez configurada forensic_watermarking_stub_mode
para false
.
Cuerpo de solicitud de muestra para marcas de agua forenses visibles
{
"master": {
"url": "https://solutions.brightcove.com/video/Walking_Dead_609.mp4",
"audio_tracks": [
{
"language": "en",
"variant": "main"
}
]
},
"profile": "multi-platform-standard-static-with-mp4",
"forensic_watermarking": true,
"forensic_watermarking_stub_mode": true,
"capture-images": true
}
Cuerpo de solicitud de muestra para eliminar marcas de agua forenses visibles
{
"profile": "multi-platform-standard-static-with-mp4",
"forensic_watermarking": true,
"forensic_watermarking_stub_mode": false,
"capture-images": true
}
API de CMS
De forma predeterminada, las versiones forenses con marca de agua se entregarán si se solicitó la marca de agua forense durante la ingestión. La presencia de marcas de agua forenses se indicará mediante el campo de solo lectura forensic_watermarking
. Si el campo tiene un valor de ACTIVE
, la marca de agua forense se agregó a VOD. Si el campo tiene un valor de UNAVAILABLE
o null
, el VOD no tiene la marca de agua forense.
Zencoder
Para generar salidas con marca de agua forense en Zencoder, debe especificar 2 salidas por video, una con "forensic_watermark": "A"
y el otro con "forensic_watermark": "B"
(estos son los dos únicos valores que forensic_watermark
el campo puede tener).
Solicitud de muestra (solo salidas)
{
"outputs": [
{
"base_url": "s3://urlTest",
"filename": "contextAwareEncoding1_A.m4f",
"public": false,
"format": "m4f",
"label": "m4f-contextAwareEncoding1-A-b30e1",
"generate_mp4_atom_map": true,
"Mp4_atom_map_filename": "contextAwareEncod-A-atom_map.json",
"skip_audio": true,
"forensic_watermark": "A",
"dynamic_profile_rendition": 1,
"skip": {
"require_video": true
},
"fragment_duration": 2000,
"segment_seconds": 2,
"headers": {
"x-amz-server-side-encryption": "AES256"
}
},
{
"base_url": "s3://urlTest",
"filename": "contextAwareEncoding1_B.m4f",
"public": false,
"format": "m4f",
"label": "m4f-contextAwareEncoding1-B-e348",
"generate_mp4_atom_map": true,
"mp4_atom_map_filename": "contextAwareEncod-B-atom_map.json",
"skip_audio": true,
"forensic_watermark": "B",
"dynamic_profile_rendition": 1,
"skip": {
"require_video": true
},
"fragment_duration": 2000,
"segment_seconds": 2,
"headers": {
"x-amz-server-side-encryption": "AES256"
}
}
]
}
Marcas de agua visibles para realizar pruebas
Para fines de prueba, para verificar que la marca de agua forense esté presente, puede forzar la marca de agua forense visible agregando "forensic_watermark_stub_mode":true
a las salidas como se muestra en el ejemplo siguiente:
{
"outputs": [
{
"base_url": "s3://urlTest",
"filename": "contextAwareEncoding1_A.m4f",
"public": false,
"format": "m4f",
"label": "m4f-contextAwareEncoding1-A-b30e1",
"generate_mp4_atom_map": true,
"Mp4_atom_map_filename": "contextAwareEncod-A-atom_map.json",
"skip_audio": true,
"forensic_watermark": "A",
"forensic_watermark_stub_mode":true,
"dynamic_profile_rendition": 1,
"skip": {
"require_video": true
},
"fragment_duration": 2000,
"segment_seconds": 2,
"headers": {
"x-amz-server-side-encryption": "AES256"
}
},
{
"base_url": "s3://urlTest",
"filename": "contextAwareEncoding1_B.m4f",
"public": false,
"format": "m4f",
"label": "m4f-contextAwareEncoding1-B-e348",
"generate_mp4_atom_map": true,
"mp4_atom_map_filename": "contextAwareEncod-B-atom_map.json",
"skip_audio": true,
"forensic_watermark": "B",
"forensic_watermark_stub_mode":true,
"dynamic_profile_rendition": 1,
"skip": {
"require_video": true
},
"fragment_duration": 2000,
"segment_seconds": 2,
"headers": {
"x-amz-server-side-encryption": "AES256"
}
}
]
}
Funciones admitidas
- HEVC
- Escalas de interpretación de códec mixto
- Audio 5.1
- DRM
- Restricciones de reproducción
- Re-transcodificación
- Reemplazo del archivo de origen
- CAE
- Descarga sin conexión
- Chromecast
- Salida en antena
Limitaciones
- En este momento, solo se admite VOD. No se admite la marca de agua forense para transmisiones en vivo.
- Los videos deben durar al menos cinco minutos para que se apliquen marcas de agua forenses.
- Actualmente, no se admiten videos HLS cifrados (HLSe).
- SSAI no es compatible con Forensic Watermarking. Si se utiliza SSAI en un activo con marca de agua forense, la marca de agua forense no se entregará.
- Esta función requiere una clave de licencia NAGRA.
- Los jugadores necesitarán un JWT de marca de agua forense que creará utilizando un script proporcionado por NAGRA.
- Reglas de entrega no se puede usar con reproductores que se usan para entregar videos con marcas de agua forenses.
- Debe utilizar el CDN de Brightcove. BYO CDN no es compatible.
- Brightcove no manejará el análisis de detección. Para esto, comuníquese con NAGRA.
- La marca de agua forense no es compatible con la protección de claves de licencia .