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

Derek Herman
Derek Herman
Joe Medley
Joe Medley

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

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

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

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

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

สร้างคีย์

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

openssl rand -hex 16 > media.key

สร้าง IV

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

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

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

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

สําหรับ Flag key ให้ใช้คีย์ที่สร้างไว้ก่อนหน้านี้ ซึ่งจัดเก็บไว้ในไฟล์ media.key อย่างไรก็ตาม เมื่อป้อนคำสั่งในบรรทัดคำสั่ง ให้ตรวจสอบว่าคุณได้ลบเว้นวรรคออกแล้ว สําหรับ Flag 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

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

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

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

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

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

  1. แยกไฟล์ (แยก) เสียงและวิดีโอ เข้ารหัสไฟล์ใหม่ และแสดงผลไฟล์คำอธิบายงานนำเสนอสื่อ (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. รีมิกซ์ (รวม) สตรีมเสียงและวิดีโอ คุณอาจไม่จําเป็นต้องดำเนินการนี้หากใช้เฟรมเวิร์กวิดีโอ

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

ลำดับการเปลี่ยนรูปแบบสื่อ

ส่วนนี้จะแสดงคำสั่งตามลำดับที่จำเป็นในการนำไฟล์ .mov ดิบไปไว้ที่ชิ้นงานที่เข้ารหัสซึ่งแพ็กเกจสำหรับ DASH หรือ HLS เราจะแปลงไฟล์ต้นทางเป็นอัตราบิต 8 Mbs ที่ความละเอียด 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. สร้างคีย์การเข้ารหัส Clear Key

    openssl rand -hex 16 > media.key
    
  3. แยกไฟล์ (แยก) เสียงและวิดีโอ เข้ารหัสไฟล์ใหม่ และแสดงผลไฟล์คำอธิบายงานนำเสนอสื่อ (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. รีมิกซ์ (รวม) สตรีมเสียงและวิดีโอ คุณอาจไม่จําเป็นต้องดำเนินการนี้หากใช้เฟรมเวิร์กวิดีโอ

    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. สร้างคีย์การเข้ารหัส Clear Key

    openssl rand -hex 16 > media.key
    
  3. แยกไฟล์ (แยก) เสียงและวิดีโอ เข้ารหัสไฟล์ใหม่ และแสดงผลไฟล์คำอธิบายงานนำเสนอสื่อ (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. รีมิกซ์ (รวม) สตรีมเสียงและวิดีโอ คุณอาจไม่จําเป็นต้องดำเนินการนี้หากใช้เฟรมเวิร์กวิดีโอ

    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. สร้างคีย์การเข้ารหัส Clear Key

    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
    

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