Introduction
Brightcove s'est associé à NAGRA fournir un filigrane médico-légal en tant que fonctionnalité de la plate-forme Video Cloud. Cela aidera à protéger votre contenu premium contre le piratage et le partage de contenu non autorisé. Cette fonctionnalité permet également d'identifier rapidement la source d'une fuite de contenu, afin que des mesures puissent être prises.
Le diagramme suivant en donne une vue d'ensemble :
- Préparation du contenu
- Le Forensic Watermark est un filigrane invisible incorporé dans la vidéo lors du transcodage à l'aide du SDK de Nagra
- L'ingestion crée 2 rendus VOD, l'un avec le filigrane A et l'autre avec le filigrane B ; les deux rendus font partie du même titre dans le nuage vidéo
- Livraison
- Lors de la lecture du contenu, le jeton Forensic Watermark est fourni au lecteur, puis inclus dans l'URL utilisée pour demander le contenu au CDN
- Le CDN interprète le jeton et diffuse la vidéo avec la bonne séquence de segments A/B au spectateur
Configuration
La configuration suivante est nécessaire pour prendre en charge la solution Forensic Watermarking de Brightcove :
-
Contactez votre Customer Success Manager :
- Assurez-vous que votre compte est activé pour la livraison dynamique.
- Activez votre compte pour Forensic Watermarking ; Il s'agit d'un module complémentaire payant de Video Cloud.
- Obtenez votre clé de licence auprès de NAGRA.
- Générez une paire de clés publique-privée qui sera utilisée par le JWT Forensic Watermarking et déchiffrée par le CDN. (voir ci-dessous)
- Utilisez le script fourni par NAGRA pour générer un jeton Web JSON (JWT) pour le tatouage légal. Assurez-vous de gérer la manière dont le jeton de filigrane médico-légal et chaque visionneuse sont liés. Vous en aurez besoin lorsque vous configurer vos joueurs et dans le cas de faire un service de détection pour savoir quel téléspectateur a divulgué le contenu illégalement.
Il existe de nombreuses façons de générer la paire de clés publique-privée. Voici quelques exemples:
Exemple de script bash :
Exemple de script pour générer la paire de clés :
#!/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"
Exécutez le script :
$ bash keygen.sh
Exemple d'utilisation Go
Exemple d'utilisation du langage Go de programmation pour générer la paire de clés :
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)
}
Exemple utilisant node.js
Exemple utilisant node.js pour générer la paire de clés :
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");
Mise en œuvre
Vous pouvez implémenter le filigrane judiciaire avec Video Cloud Studio ou vous pouvez le faire manuellement à l'aide des API Brightcove. Les méthodes sont détaillées dans les sections suivantes.
Video Cloud Studio
Suivez ces étapes pour utiliser Forensic Watermarking avec Video Cloud Studio :
-
Forensic Watermarking n'est pas lié à un profil d'ingestion spécifique. Vous pouvez utiliser n'importe quel profil de livraison dynamique ou d'encodage contextuel.
- Fournissez à Brightcove votre clé de licence NAGRA. Cette clé de licence sera utilisée lors du transcodage pour générer le filigrane.
- Dans le Télécharger module, sélectionnez votre profil d'ingestion.
-
Vérifier la Activer le filigrane judiciaire option.
-
Ajouter la balise
watermarked
à la vidéo, car cela rendra beaucoup plus facile d'identifier les vidéos avec un filigrane médico-légal et de générer des rapports d'analyse sur eux: -
Faites glisser ou recherchez votre vidéo pour commencer l'ingestion.
-
Configurez votre lecteur.
C'est là que vous passerez le jeton de filigrane NAGRA et l'identifiant de la visionneuse au joueur. Vous pouvez utiliser le lecteur Web Brightcove ou les lecteurs SDK natifs :
- Lire le contenu qui a été ingéré pour le filigrane judiciaire.
Rapports analytiques
Les rapports d'analyse sur les téléspectateurs pour les vidéos avec filigrane médico-légale sont disponibles via le API d'analyse seul. Les rapports peuvent être renvoyés au format JSON, CSV ou XLXS
Dans les données Analytics :
1 Transaction = 1 unique Viewer per video in 24 hours
Exemple 1 : spectateurs pour une vidéo par date
Pour cet exemple, nous interrogerons le video
, viewer
et date
dimensions et récupérer le rapport au format CSV.
Demande d'échantillon
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
Réponse
"date","video","viewer","video_view"
"2021-06-25","70702952720202","3f46037f932b0c5a","1"
"2021-06-24","70702952720202","3f46037f932b0c5a","2"
Notez que le viewer
est généré par le lecteur Brightcove et défini sur une chaîne unique basée sur l'agent utilisateur et l'IP. Idéalement, vous devriez définir vous-même l'identifiant du spectateur en fonction d'un identifiant de connexion - voir ce sujet pour savoir comment procéder. Votre identifiant sera basé sur des informations pouvant être récupérées via JavaScript.
Exemple 2 : nombre de téléspectateurs
Dans cet exemple, nous supposerons que toutes les vidéos avec filigrane médico-légal ont la balise watermarked
. Nous interrogerons à nouveau le video
, viewer
et date
dimensions et ne retourner qu'un article, car c'est le résumé qui nous intéresse ici :
Demande d'échantillon
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
Réponse
{
"item_count": 7,
"items": [
{
"date": "2021-06-25",
"viewer": "07B1489C-5786-400E-945B-ABB3559B3897",
"video_view": 1
}
],
"summary": {
"video_view": 25
}
}
API
Voici les API et les champs liés à Forensic Watermarking :
API d'ingestion dynamique
Une fois qu'un compte est activé pour le filigrane judiciaire, vous pouvez ajouter un filigrane judiciaire à une vidéo en ajoutant le forensic_watermarking
à votre demande d'ingestion et en le définissant sur true
. Cela peut être fait pour l'ingestion d'origine, le remplacement ou le retranscodage de la vidéo.
Exemple de corps de requête
{
"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
}
Il y a aussi forensic_watermarking_stub_mode
indicateur qui, lorsqu'il est défini sur true
produit des filigranes médico-légaux visibles :
forensic_watermarking
doit également être configuré pour true
activer les filigranes visibles.
Utilisez des filigranes visibles sur une vidéo pour tester les intégrations (vous devriez tester avec une vidéo d'au moins 10 minutes). Une fois que vous avez vérifié que les filigranes médico-légaux sont présents, vous souhaiterez les supprimer pour n'avoir que des filigranes médico-légaux invisibles. Pour ce faire, vous devrez soumettre une autre demande d'ingestion dynamique pour retranscoder la vidéo, cette fois en définissant forensic_watermarking_stub_mode
à false
.
Exemple de corps de demande pour les filigranes médico-légaux 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
}
Exemple de corps de demande pour supprimer les filigranes médico-légaux visibles
{
"profile": "multi-platform-standard-static-with-mp4",
"forensic_watermarking": true,
"forensic_watermarking_stub_mode": false,
"capture-images": true
}
API CMS
Par défaut, les rendus avec filigrane judiciaire seront fournis si le filigrane judiciaire a été demandé lors de l'ingestion. La présence de filigranes médico-légaux sera indiquée par le champ en lecture seule forensic_watermarking
. Si le champ a une valeur de ACTIVE
, le filigrane médico-légal a été ajouté à la VOD. Si le champ a une valeur de UNAVAILABLE
ou null
, la VOD n'a pas de filigrane médico-légal.
Zencoder
Pour générer des sorties avec un filigrane médico-légal dans Zencoder, vous devez spécifier 2 sorties par vidéo, l'une avec "forensic_watermark": "A"
et l'autre avec "forensic_watermark": "B"
(ce sont les deux seules valeurs que le forensic_watermark
champ peut avoir).
Exemple de demande (sorties uniquement)
{
"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"
}
}
]
}
Filigranes visibles pour les tests
À des fins de test, pour vérifier que le filigrane judiciaire est présent, vous pouvez forcer le filigrane judiciaire visible en ajoutant "forensic_watermark_stub_mode":true
aux sorties comme indiqué dans l'exemple ci-dessous :
{
"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"
}
}
]
}
Fonctionnalités prises en charge
- HEVC
- Échelles de rendu des codecs mixtes
- 5.1 Audio
- GDN
- Restrictions de lecture
- Re-transcodage
- Remplacement du fichier source
- CAE
- Téléchargement hors ligne
- Chromecast
- Airplay
Contraintes
- Seule la VOD est prise en charge pour le moment. Le filigrane judiciaire pour les diffusions en direct n'est pas pris en charge.
- Les vidéos doivent durer au moins cinq minutes pour qu'un filigrane médico-légal soit appliqué.
- Les vidéos HLS cryptées (HLSe) ne sont actuellement pas prises en charge.
- Le SSAI n'est pas pris en charge par le filigrane judiciaire. Si le SSAI est utilisé dans un bien avec un filigrane judiciaire, ce dernier ne sera pas délivré.
- Cette fonctionnalité nécessite une clé de licence NAGRA.
- Les joueurs auront besoin d'un JWT de filigrane judiciaire que vous créerez à l'aide d'un script fourni par NAGRA.
- Règles de livraison ne peut pas être utilisé avec des lecteurs utilisés pour diffuser des vidéos avec un filigrane médico-légal.
- Vous devez utiliser le CDN de Brightcove. BYO CDN n'est pas pris en charge.
- Brightcove ne gère pas l'analyse de détection. Pour cela, contactez NAGRA.
- Le filigrane judiciaire n'est pas pris en charge avec la protection des clés de licence.