소개
브라이트코브는나그라 Video Cloud 플랫폼의 기능으로 포렌식 워터마킹을 제공합니다. 이렇게 하면 불법 복제 및 무단 콘텐츠 공유로부터 프리미엄 콘텐츠를 보호하는 데 도움이 됩니다. 이 기능은 또한 콘텐츠 유출의 원인을 신속하게 식별하여 조치를 취할 수 있도록 도와줍니다.
설정
Brightcove의 포렌식 워터마킹 솔루션을 지원하려면 다음 설정이 필요합니다.
-
계정 관리자에게 문의:
- 귀하의 계정이 Dynamic Delivery에 대해 활성화되어 있는지 확인하십시오.
- 귀하의 계정에서 포렌식 워터마킹을 활성화하십시오. 이것은 Video Cloud에 대한 유료 추가 기능입니다.
- 에서 라이센스 키를 받으십시오. 나그라 .
- Forensic Watermarking JWT에서 사용하고 CDN에서 해독할 공개-개인 키 쌍을 생성합니다. (아래 참조)
- NAGRA에서 제공하는 스크립트를 사용하여 포렌식 워터마킹을 위한 JSON 웹 토큰(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
사용 예가다
사용 예가다키 쌍을 생성하는 프로그래밍 언어:
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에서 포렌식 워터마킹을 사용하려면 다음 단계를 따르십시오.
-
포렌식 워터마킹은 특정 수집 프로필에 연결되지 않습니다. Dynamic Delivery 또는 Context Aware Encoding 프로필을 사용할 수 있습니다.
- Brightcove에 NAGRA 라이센스 키를 제공하십시오. 이 라이센스 키는 트랜스코딩 중에 워터마크를 생성하는 데 사용됩니다.
- 에서업로드모듈에서 수집 프로필을 선택합니다.
-
을 체크 해봐포렌식 워터마크 활성화옵션.
-
태그 추가
watermarked
이렇게 하면 포렌식 워터마킹으로 비디오를 훨씬 쉽게 식별하고그들에 대한 분석 보고서 생성 : -
비디오를 드래그하거나 탐색하여 처리를 시작하세요.
-
플레이어를 구성합니다.
여기에서 NAGRA 워터마크 토큰과 뷰어 ID를 플레이어에게 전달합니다. Brightcove 웹 플레이어 또는 기본 SDK 플레이어를 사용할 수 있습니다.
- 포렌식 워터마킹을 위해 수집된 콘텐츠를 재생합니다.
분석 보고서
포렌식 워터마크가 있는 비디오 시청자에 대한 분석 보고서는Analytics API오직. 보고서는 JSON, CSV 또는 XLXS 형식으로 반환될 수 있습니다.
애널리틱스 데이터에서:
1 거래 = 24시간 동안 동영상당 1명의 고유 뷰어
예 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"
참고로viewer
Brightcove 플레이어에 의해 생성되고 사용자 에이전트 및 IP를 기반으로 고유한 문자열로 설정됩니다. 이상적으로는 로그인 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 및 필드는 다음과 같습니다.
Dynamic Ingest API
계정이 포렌식 워터마킹에 대해 활성화되면 다음을 추가하여 비디오에 포렌식 워터마킹을 추가할 수 있습니다. forensic_watermarking
필드를 수집 요청에 추가하고 다음으로 설정합니다. true
. 이것은 비디오의 원래 수집, 교체 또는 재변환에 대해 수행할 수 있습니다.
샘플 요청 본문
{
"master": {
"url": "http://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
로 설정해야 합니다. 진실
눈에 보이는 워터마크를 활성화합니다.
비디오에 눈에 보이는 워터마크를 사용하여 통합을 테스트합니다(최소 10분 길이의 비디오로 테스트해야 함). 포렌식 워터마크가 있는지 확인한 후에는 해당 워터마크를 제거하여 보이지 않는 포렌식 워터마크만 남기고 싶을 것입니다. 이렇게 하려면 이번에는 설정인 비디오를 다시 코드 변환하기 위해 다른 Dynamic Ingest 요청을 제출해야 합니다. forensic_watermarking_stub_mode
에게false
.
가시적인 포렌식 워터마크에 대한 샘플 요청 본문
{
"master": {
"url": "http://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 API
기본적으로 포렌식 워터마킹이 수집 중에 요청된 경우 포렌식 워터마크 변환이 제공됩니다. 포렌식 워터마크의 존재는 읽기 전용 필드로 표시됩니다. forensic_watermarking
. 필드에 값이 있는 경우ACTIVE
, 포렌식 워터마크가 VOD에 추가되었습니다. 필드에 값이 있는 경우UNAVAILABLE
또는null
, VOD에는 포렌식 워터마크가 없습니다.
Playback API
Playback API GET 비디오 응답에는forensic_watermarking
(계정이 포렌식 워터마킹에 대해 활성화된 경우). 값이ACTIVE
, 포렌식 워터마크가 있는 변환은 플레이어에게 소스로 전달됩니다. 그렇지 않으면 워터마크가 없는 변환이 전달됩니다.
젠코더
Zencoder에서 포렌식 워터마킹으로 출력을 생성하려면 비디오당 2개의 출력을 지정해야 합니다. "forensic_watermark": "NS"
그리고 다른 "forensic_watermark": "NS"
(이 두 값은포렌식 워터마크
필드가 있을 수 있음).
샘플 요청(출력만 해당)
{
"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"
}
}
]
}
지원되는 기능
- DRM
- Playback Restrictions
- 재변환
- 소스 파일 교체
- CAE
- 오프라인 다운로드
- 크롬캐스트
- 에어플레이
제한 사항
- 현재 VOD만 지원됩니다. 라이브 스트림에 대한 포렌식 워터마킹은 지원되지 않습니다.
- 포렌식 워터마킹을 적용하려면 동영상 길이가 5분 이상이어야 합니다.
- HLSv7은 지원되지 않습니다. HLSv7은 HEVC, 혼합 코덱 및 5.1 오디오를 제공하는 데 사용되므로 HEVC, 혼합 코덱 비디오 및 5.1 오디오는 현재 지원되지 않습니다.
- 암호화된 HLS 비디오(HLSe)는 현재 지원되지 않습니다.
- 이 기능을 사용하려면 NAGRA 라이선스 키가 필요합니다.
- 플레이어는 NAGRA에서 제공하는 스크립트를 사용하여 생성할 포렌식 워터마킹 JWT가 필요합니다.
- 배달 규칙포렌식 워터마킹이 있는 비디오를 제공하는 데 사용되는 플레이어에는 사용할 수 없습니다.
- Brightcove의 CDN을 사용해야 합니다. BYO CDN은 지원되지 않습니다.
- Brightcove는 탐지 분석을 처리하지 않습니다. 이를 위해 NAGRA에 문의하십시오.