簡介
Brightcove 與 NAGRA 合作,提供取證水印作為視頻雲平台中的一項功能。這將有助於保護您的優質內容免遭盜版和未經授權的內容共享。此功能還有助於快速識別內容洩漏的來源,以便採取措施。
下圖顯示了一個概覽:
- 內容準備
- Forensic Watermark 是在使用 Nagra 的 SDK 轉碼期間嵌入到視頻中的不可見水印
- Ingestion 創建了 2 個 VOD 再現,一個帶有水印 A,另一個帶有水印 B;兩種演繹都是 Video Cloud 中同一標題的一部分
- 送貨
- 播放內容時,Forensic Watermark 令牌會提供給播放器,然後包含在用於從 CDN 請求內容的 URL 中
- CDN 解釋令牌並將具有正確 A/B 片段序列的視頻傳送給觀眾
設定
需要以下設置來支持 Brightcove 的取證水印解決方案:
-
聯繫您的客戶成功經理:
- 確保您的帳戶已啟用動態交付。
- 為您的帳戶啟用取證水印;這是 Video Cloud 的付費插件。
- 從 NAGRA獲取許可證密鑰。
- 生成公私密鑰對,供取證水印 JWT 使用並由 CDN 解密。 (見下文)
- 使用 NAGRA 提供的腳本生成用於取證水印的 JSON Web 令牌 (JWT)。請務必管理取證水印令牌與每個查看器的鏈接方式。當您 配置您的播放器 時,您將需要它,並且在進行檢測服務時,您將需要它來了解哪個觀眾非法洩露了內容。
有很多方法可以產生公開私密金鑰組。以下是一些範例:
bash 腳本示例:
產生金鑰配對的範例指令碼:
#!/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"
執行指令碼:
$ bash keygen.sh
使用範例Go
使用Go編程語言生成密鑰對的示例:
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)
}
使用 node.js 的範例
使用 node.js 生成密鑰對的示例:
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");
實作
您可以使用 Video Cloud Studio 實施取證水印,也可以使用 Brightcove API 手動完成。這些方法在以下部分中詳細介紹。
視訊雲端工作室
按照以下步驟將取證水印與 Video Cloud Studio 結合使用:
-
取證水印未鏈接到特定的攝取配置文件。您可以使用任何動態交付或上下文感知編碼配置文件。
- 向 Brightcove 提供您的 NAGRA 許可證密鑰。此許可證密鑰將在轉碼期間用於生成水印。
- 在 上傳 模塊中,選擇您的攝取配置文件。
-
選中啟用 取證水印 選項。
-
將標記添加
watermarked
到視頻中,因為這樣可以更輕鬆地識別帶有法醫水印的視頻並生成有關它們的分析報告: -
拖動或瀏覽您的視頻以開始攝取。
-
配置您的播放器。
這是您將 NAGRA 水印令牌和查看器 ID 傳遞給播放器的地方。您可以使用 Brightcove 網絡播放器或本機 SDK 播放器:
- 播放為取證水印而攝取的內容。
分析報告
僅可通過 Analytics API 獲取有關取證水印視頻觀眾的分析報告。報告可以 JSON、CSV 或 XLXS 格式返回
在分析數據中:
1 Transaction = 1 unique Viewer per video in 24 hours
示例 1:視頻的觀看者(按日期)
對於這個例子,我們將查詢video
, viewer
和date
尺寸並以 CSV 格式返回報告。
樣本請求
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
響應
"date","video","viewer","video_view"
"2021-06-25","70702952720202","3f46037f932b0c5a","1"
"2021-06-24","70702952720202","3f46037f932b0c5a","2"
請注意,由 Brightcove 播放程式產生,並設定為以使用者代理程式和 IP 為基礎的唯一字串。viewer
理想情況下,您應該根據登錄 ID 自己設置查看器標識符 - 請參閱 本主題 以了解有關如何執行此操作的信息。您的標識符將基於可通過 JavaScript 檢索的信息。
示例 2:觀眾人數
在此示例中,我們將假設所有帶有法醫水印的視頻都具有標籤watermarked
。我們將再次查詢video
, viewer
和date
尺寸,只返回一個項目, 因為它是我們感興趣在這裡的總結:
樣本請求
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
響應
{
"item_count": 7,
"items": [
{
"date": "2021-06-25",
"viewer": "07B1489C-5786-400E-945B-ABB3559B3897",
"video_view": 1
}
],
"summary": {
"video_view": 25
}
}
API
以下是與取證水印相關的 API 和字段:
動態內嵌 API
帳戶啟用法醫浮水印功能後,您可以將forensic_watermarking
欄位新增至您的擷取要求,並將其設定為,以便在影片中新增鑑識浮水印true
。這可以針對原始攝取、替換或重新轉碼視頻來完成。
請求主體範例
{
"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
}
還有一個forensic_watermarking_stub_mode
標誌,當設置為true
產生可見的取證水印:
forensic_watermarking
也必須將設定為以啟true
用可見浮水印。
在視頻上使用可見水印來測試集成(您應該使用至少 10 分鐘長的視頻進行測試)。一旦您確認存在取證水印,您將希望刪除它們以僅具有不可見的取證水印。若要這麼做,您必須提交另一個動態擷取要求,以重新轉碼視訊,此時設定forensic_watermarking_stub_mode
為false
。
可見取證水印的示例請求正文
{
"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
}
刪除可見取證水印的示例請求正文
{
"profile": "multi-platform-standard-static-with-mp4",
"forensic_watermarking": true,
"forensic_watermarking_stub_mode": false,
"capture-images": true
}
CMS 應用程式
默認情況下,如果在攝取期間請求取證水印,將提供取證水印再現。唯讀欄位會指示法醫浮水印的存在forensic_watermarking
。如果欄位的值為ACTIVE
,則會將鑑識浮水印新增至 VOD。如果欄位的值為UNAVAILABLE
或null
,則 VOD 沒有鑑識浮水印。
Zencoder
要在 Zencoder 中生成具有取證水印的輸出,您需要為每個視頻指定 2 個輸出,一個輸出"forensic_watermark": "A"
,另一個輸出"forensic_watermark": "B"
(這些是該forensic_watermark
字段可以具有的唯一兩個值)。
樣品請求(僅輸出)
{
"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"
}
}
]
}
用於測試的可見水印
為了測試目的,要驗證是否存在法醫水印,您可以通過添加"forensic_watermark_stub_mode":true
到輸出來強制可見的法醫水印,如下面的示例所示:
{
"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"
}
}
]
}
支持的功能
- HEVC
- 混合編解碼器再現階梯
- 5.1 音頻
- DRM
- 播放限制
- 重新轉碼
- 源文件替換
- CAE
- 離線下載
- 鉻
- 播放器