การเข้ารหัสสื่อ

เดเร็ก เฮอร์แมน
เดเร็ก เฮอร์แมน
โจ เมดเลย์
โจ เมดเลย์

ในส่วนนี้ เราจะกล่าวถึงกลยุทธ์ 2 แบบในการเข้ารหัสสื่อ และตัวอย่างที่นำไปใช้ได้จริงเกี่ยวกับวิธีใช้ FFmpeg และ Shaaka Packager กลยุทธ์การเข้ารหัส 2 แบบที่เราจะพูดถึงคือ Clear Key และการใช้บริการอย่างเช่น Google Widevine ทั้ง 2 กลยุทธ์เป็นการจัดการสิทธิ์ดิจิทัล (DRM) รูปแบบหนึ่งที่มีการควบคุมสิ่งที่ผู้ใช้ทำกับสื่อของคุณ อย่างไรก็ตาม หนึ่งในนั้นมีความปลอดภัยน้อยกว่าอีกแบบหนึ่ง เนื่องจากการส่งผ่านคีย์สำหรับการตรวจสอบสิทธิ์และเป็นเหตุผลที่บริการ DRM อาจเหมาะสมกว่า

บริการ DRM หลักสำหรับเว็บ ได้แก่ Google Widevine, Microsoft Play Ready และ Apple FairPlay แต่เราจะไม่กล่าวถึงบริการดังกล่าวทั้งหมดในบทความนี้ อย่างไรก็ตาม หากคุณกำหนดเป้าหมายเบราว์เซอร์สมัยใหม่ทั้งหมด คุณก็น่าจะจะใช้บริการ DRM ทั้ง 3 แบบ

การแปลงและการเข้ารหัสนั้นทำได้ด้วยแอปพลิเคชันต่อไปนี้

ล้างการเข้ารหัสคีย์

ก่อนอื่น คุณควรเข้าใจเป็นอย่างดีว่า "ล้างคีย์" คืออะไรและไม่ควรใช้ก่อนใช้งาน เมื่อคุณไม่ต้องการใช้บริการ DRM ที่มีอยู่และรู้สึกว่าการเข้ารหัสสื่อพื้นฐานเป็นตัวเลือกที่ใช้ได้ คุณควรใช้ "คีย์ล้าง" แต่โปรดทราบว่าการเข้ารหัสประเภทนี้ไม่ได้ให้ความปลอดภัยในระดับเดียวกับการใช้บริการ DRM เนื่องจากคู่คีย์-ค่าไม่ได้เข้ารหัสภายใต้คีย์อื่น ซึ่งจะต่างจากคีย์ที่เข้ารหัสซึ่งสร้างขึ้นโดยคีย์การถอดรหัสที่เก็บไว้ในเซิร์ฟเวอร์ใบอนุญาต นอกจากนี้ คีย์-ค่ายังส่งคู่คีย์-ค่าเป็นข้อความธรรมดา ดังนั้นขณะที่คุณเข้ารหัสสื่อ คีย์เพื่อถอดรหัสนั้นไม่เป็นความลับ

สร้างคีย์

คุณใช้วิธีการเดียวกันเพื่อสร้างคีย์สำหรับทั้ง DASH และ HLS ได้ ดำเนินการนี้โดยใช้ OpenSSL รายการต่อไปนี้จะสร้างคีย์การเข้ารหัสที่ประกอบด้วยค่าฐานสิบหก 16 ค่า

openssl rand -hex 16 > media.key

สร้าง IV

จากนั้น เราสามารถสร้างเวกเตอร์การเริ่มต้น (IV) ได้

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

เข้ารหัสด้วยคีย์ล้าง

ตัวอย่างต่อไปนี้ใช้ Shaka Packager ที่มีคีย์ดิบ โดยมีการระบุ keys และ key_ids กับ Shaka Packager โดยตรง ดูตัวอย่างเพิ่มเติมได้ในเอกสารประกอบ

สำหรับแฟล็ก key ให้ใช้คีย์ที่สร้างไว้ก่อนหน้านี้ซึ่งเก็บไว้ในไฟล์ media.key อย่างไรก็ตาม เมื่อป้อนข้อความในบรรทัดคำสั่งแล้ว โปรดตรวจสอบว่าคุณได้ลบช่องว่างแล้ว สําหรับแฟล็ก key_id ให้ใช้ค่า media.id ซ้ำหรือใช้ค่า IV ที่สร้างขึ้นด้านบน

packager \
  input=glocken.mp4,stream=audio,output=glockena.m4a \
  input=glocken.mp4,stream=video,output=glockenv.mp4 \
  --enable_fixed_key_encryption \
  --keys label=audio:key=INSERT_AUDIO_KEY_HERE:key_id=INSERT_AUDIO_KEY_ID_HERE,label=video:key=INSERT_VIDEO_KEY_HERE:key_id=INSERT_VIDEO_KEY_ID_HERE

สร้างไฟล์ข้อมูลสำคัญ

หากต้องการเข้ารหัส HLS คุณต้องมีไฟล์ข้อมูลสำคัญเพิ่มเติมจากไฟล์คีย์ ไฟล์ข้อมูลสำคัญเป็นไฟล์ข้อความที่มีรูปแบบด้านล่าง ซึ่งควรมีส่วนขยาย .keyinfo เช่น encrypt.keyinfo

key URI
key file path
private key

URI คีย์คือตำแหน่งของ media.key (ที่สร้างไว้ข้างต้น) บนเซิร์ฟเวอร์ เส้นทางไฟล์คีย์คือตำแหน่งที่ตั้งที่สัมพันธ์กับไฟล์ข้อมูลคีย์ สุดท้าย คีย์ส่วนตัวคือเนื้อหาของไฟล์ media.key หรือ IV ที่คุณสร้างขึ้นก่อนหน้านี้ เช่น

https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66

เข้ารหัสสำหรับ HLS

packager \
  'input=input.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
  'input=input.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
  --hls_master_playlist_output="master_playlist.m3u8" \
  --hls_base_url="http://localhost:5000/"

คำสั่งนี้จะยอมรับคีย์ที่มีความยาว 16 หรือ 32 อักขระ

ffmpeg -i myvideo.mov -c:v libx264 -c:a aac -hls_key_info_file encrypt.keyinfo myvideo.m3u8

การเข้ารหัส Widevine

ตอนนี้คุณก็รู้แล้วว่าการเข้ารหัสคีย์ล้างคืออะไรและควรใช้เมื่อใด แต่คุณควรใช้บริการ DRM เพื่อความปลอดภัยเพิ่มเติมเมื่อใด ช่องทางนี้เป็นที่ที่ Widevine หรือบริการอื่น จะใช้เพื่อเข้ารหัสและถอดรหัสสื่อของคุณอย่างปลอดภัย Widevine รองรับ MPEG-DASH และ HLS และเป็น DRM จาก Google Widevine ใช้งานโดยเว็บเบราว์เซอร์ Google Chrome และ Firefox , Android MediaDRM, Android TV และอุปกรณ์อิเล็กทรอนิกส์อื่นๆ สำหรับผู้บริโภคที่ใช้ ส่วนขยายสื่อที่เข้ารหัสและส่วนขยายแหล่งที่มาของสื่อ ซึ่ง Widevine ถอดรหัสเนื้อหา

เข้ารหัสด้วย Widevine

ตัวอย่างส่วนใหญ่ในบทความนี้ใช้การเข้ารหัสแบบล้างคีย์ อย่างไรก็ตาม สำหรับ Widevine คุณจะต้องแทนที่ตัวเลือกต่อไปนี้

--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE

ทุกอย่างในคำสั่ง demultiplexer (demux) ยกเว้นชื่อไฟล์และแฟล็ก --content-id ควรคัดลอกมาจากตัวอย่างทุกประการ --content-id เป็นเลขฐานสิบหกแบบสุ่ม 16 หรือ 32 หลัก ใช้คีย์ที่ระบุไว้ที่นี่แทนคีย์ของคุณเอง อ่านเอกสารประกอบของ ShakaPackager เกี่ยวกับการใช้เซิร์ฟเวอร์คีย์ Widevine เพื่อดูตัวอย่างเพิ่มเติม

  1. Demux (แยกกัน) เสียงและวิดีโอ เข้ารหัสไฟล์ใหม่ และส่งออกไฟล์คำอธิบายงานนำเสนอสื่อ (MPD)

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_widevine_encryption \
      --key_server_url "https://license.uat.widevine.com/cenc/getcontentkey/widevine_test" \
      --content_id "fd385d9f9a14bb09" \
      --signer "widevine_test" \
      --aes_signing_key "1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9" \
      --aes_signing_iv "d58ce954203b7c9a9a9d467f59839249"
    
  2. Remux (รวม) สตรีมเสียงและวิดีโอ หากคุณใช้เฟรมเวิร์กวิดีโอ คุณอาจไม่จำเป็นต้องดำเนินการนี้

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
    

ลำดับ Conversion สื่อ

ส่วนนี้จะแสดงตามลำดับคำสั่งที่ต้องใช้ในการดำเนินการกับไฟล์ .mov ที่เป็นข้อมูลดิบไปยังเนื้อหาที่เข้ารหัสซึ่งจัดเป็นแพ็กเกจสำหรับ DASH หรือ HLS เพื่อให้เห็นภาพ เราจะแปลงไฟล์ต้นฉบับเป็นอัตราบิต 8Mbs ที่ความละเอียด 1080p (1920 x 1080) ปรับค่าเหล่านี้ตามความต้องการของคุณ

DASH/WebM

  1. แปลงประเภทไฟล์และตัวแปลงรหัส

    สำหรับคำสั่งนี้ คุณสามารถใช้ liborbis หรือ libopus สำหรับตัวแปลงสัญญาณเสียง

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. สร้างคีย์การเข้ารหัสแบบล้างคีย์

    openssl rand -hex 16 > media.key
    
  3. Demux (แยกกัน) เสียงและวิดีโอ เข้ารหัสไฟล์ใหม่ และส่งออกไฟล์คำอธิบายงานนำเสนอสื่อ (MPD)

    packager \
      input=tmp_glocken.webm,stream=video,output=glocken_video.webm \
      input=tmp_glocken.webm,stream=audio,output=glocken_audio.webm \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_webm_vod.mpd
    
  4. Remux (รวม) สตรีมเสียงและวิดีโอ หากคุณใช้เฟรมเวิร์กวิดีโอ คุณอาจไม่จำเป็นต้องดำเนินการนี้

    ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
    

DASH/MP4

  1. แปลงประเภทไฟล์ ตัวแปลงรหัสวิดีโอ และอัตราบิต

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. สร้างคีย์การเข้ารหัสแบบล้างคีย์

    openssl rand -hex 16 > media.key
    
  3. Demux (แยกกัน) เสียงและวิดีโอ เข้ารหัสไฟล์ใหม่ และส่งออกไฟล์คำอธิบายงานนำเสนอสื่อ (MPD)

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_mp4_vod.mpd
    
  4. Remux (รวม) สตรีมเสียงและวิดีโอ หากคุณใช้เฟรมเวิร์กวิดีโอ คุณอาจไม่จำเป็นต้องดำเนินการนี้

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
    

HLS/MP4

HLS รองรับเฉพาะ MP4 เท่านั้น คุณจึงต้องแปลงเป็นคอนเทนเนอร์ MP4 และตัวแปลงรหัสที่รองรับก่อน

  1. แปลงประเภทไฟล์ ตัวแปลงรหัสวิดีโอ และอัตราบิต

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. สร้างคีย์การเข้ารหัสแบบล้างคีย์

    openssl rand -hex 16 > media.key
    
  3. สร้างไฟล์ข้อมูลสำคัญ

    packager \
      'input=glocken.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
      'input=glocken.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
      --hls_master_playlist_output="master_playlist.m3u8" \
      --hls_base_url="http://localhost:5000/" \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE
    

ข้อมูลข้างต้นมีรายละเอียดมาก แต่หวังว่าคุณจะเข้ารหัสสื่อได้อย่างมั่นใจแล้ว ต่อไปเราจะแสดงวิธีเพิ่มสื่อลงในเว็บไซต์