Descripción general: Marca de agua forense

En este tema, obtendrá una descripción general de alto nivel de la función Forensic Watermarking de Brightcove.

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.
Diagrama general
Introducción a las marcas de agua forenses

Configuración

Se necesita la siguiente configuración para admitir la solución de marca de agua forense de Brightcove:

  1. Comuníquese con su gerente de éxito del cliente:
    1. Asegúrese de que su cuenta esté habilitada para Dynamic Delivery.
    2. Habilite su cuenta para la marca de agua forense; Este es un complemento de pago de Video Cloud.
  2. Obtenga su clave de licencia de NAGRA.
  3. 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)
  4. 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:

  1. 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.

    1. Proporcione a Brightcove su clave de licencia NAGRA. Esta clave de licencia se utilizará durante la transcodificación para generar la marca de agua.
    2. En el Subir módulo, seleccione su perfil de ingesta.
    3. Comprobar el Habilitar marca de agua forense opción.

      Habilitar la opción de marca de agua
      Habilitar la opción de marca de agua
    4. 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:
      Añadir etiqueta
      Añadir etiqueta
    5. Arrastra o busca tu video para iniciar la transferencia.

  2. 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:

  3. 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:

Marcas de agua forenses visibles
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 .