Mã hoá nội dung nghe nhìn

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Trong phần này, chúng tôi sẽ đề cập đến hai chiến lược mã hoá khác nhau nội dung đa phương tiện của bạn, cùng một số ví dụ thiết thực về cách sử dụng chúng với FFmpeg và Shaka Packager. Hai chiến lược mã hóa mà chúng ta sẽ thảo luận là Xóa khóa và bằng cách sử dụng một dịch vụ như Google Widevine. Cả hai chiến lược đều là một dạng kỹ thuật số quản lý quyền (DRM) để kiểm soát những việc người dùng có thể thực hiện với nội dung nghe nhìn của bạn. Tuy nhiên, một thiết bị về bản chất kém an toàn hơn so với cái còn lại do cách các khoá được truyền cho và đó là lý do dịch vụ DRM có thể phù hợp hơn.

Các dịch vụ DRM chính dành cho web là Google Widevine, Microsoft PlaySẵn sàngApple FairPlay, nhưng chúng tôi sẽ không đề cập đến tất cả các giải pháp đó trong bài viết này. Tuy nhiên, nếu nhắm đến tất cả các trình duyệt hiện đại, bạn có thể sử dụng cả ba dịch vụ DRM.

Quá trình chuyển đổi và mã hoá được thực hiện bằng các ứng dụng sau:

Xoá khoá mã hoá

Trước tiên, bạn phải hiểu rõ về Xoá Key là gì và chưa rõ ràng trước đây đang sử dụng nó. Khi bạn không muốn sử dụng một dịch vụ DRM hiện có và cảm thấy mã hoá cơ bản cho nội dung nghe nhìn của bạn là một phương án khả thi, bạn nên dùng Xoá khoá. Tuy nhiên, hãy lưu ý rằng loại mã hoá này không cung cấp cùng một mức độ bảo mật khi sử dụng một trong các dịch vụ DRM. Điều này là do cặp khoá-giá trị không được mã hoá bằng một khoá khác, không giống như khoá được mã hoá do khoá giải mã được lưu trữ trên máy chủ cấp phép. Ngoài ra, tính năng Xoá khoá sẽ gửi cặp khoá-giá trị dưới dạng văn bản thuần tuý, vì vậy trong khi mã hoá phương tiện, khoá để thì đó không phải là bí mật.

Tạo khoá

Bạn có thể sử dụng cùng một phương pháp để tạo khoá cho cả DASH và HLS. Thực hiện việc này bằng OpenSSL. Thao tác sau đây sẽ tạo một khoá mã hoá gồm 16 giá trị hex.

openssl rand -hex 16 > media.key

Tạo một IV

Tiếp theo, chúng ta có thể tạo vectơ khởi tạo (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Mã hoá bằng Khoá xoá

Ví dụ sau đây sử dụng Shaka Packager với khoá thô, trong đó keyskey_ids được cung cấp trực tiếp cho Shaka Packager. Đọc tài liệu về ví dụ khác.

Đối với cờ key, hãy sử dụng khoá đã tạo trước đó (được lưu trữ trong media.key) . Tuy nhiên, khi nhập mã vào dòng lệnh, hãy nhớ xoá khoảng trắng. Đối với cờ key_id, hãy lặp lại giá trị media.id hoặc sử dụng giá trị IV được tạo ở trên.

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

Tạo một tệp thông tin quan trọng

Để mã hoá cho HLS, bạn cần có tệp thông tin khoá ngoài tệp khoá. Đáp tệp thông tin chính là tệp văn bản có định dạng như dưới đây. Biểu trưng phải có tiện ích .keyinfo. Ví dụ: encrypt.keyinfo.

key URI
key file path
private key

URI chính là nơi sẽ chứa media.key (đã tạo ở trên) trên máy chủ của bạn. Đường dẫn tệp khoá là vị trí tương ứng với khoá tệp thông tin. Cuối cùng, khoá riêng tư là nội dung của media.key hoặc IV mà bạn đã tạo trước đó. Ví dụ:

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

Mã hoá cho 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/"

Lệnh này sẽ chấp nhận một khoá có 16 hoặc 32 ký tự.

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

Mã hoá Widevine

Bây giờ, bạn đã biết tính năng Xoá khoá mã hoá là gì và khi nào nên sử dụng tính năng này. Tuy nhiên, khi nào bạn nên sử dụng dịch vụ DRM để tăng cường bảo mật? Đây là nơi Widevine hoặc một dịch vụ khác, sẽ được dùng để mã hoá và giải mã nội dung nghe nhìn của bạn một cách an toàn. Widevine hỗ trợ MPEG-DASH và HLS và là một DRM của Google. Widevine được sử dụng trên web Google Chrome và Firefox trình duyệt, Android MediaDRM, Android TV và các thiết bị điện tử tiêu dùng khác sử dụng Tiện ích phương tiện đã mã hoá và Tiện ích nguồn phương tiện, trong đó Widevine giải mã nội dung.

Mã hoá bằng Widevine

Hầu hết các ví dụ trong bài viết này đều sử dụng tính năng Xoá khoá mã hoá. Tuy nhiên, đối với Widevine, sẽ muốn thay thế các tuỳ chọn sau.

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

Mọi thứ trong lệnh demultiplexer (demux) ngoại trừ tên tệp của bạn và Cờ --content-id phải được sao chép chính xác từ ví dụ. --content-id là 16 hoặc 32 chữ số hex ngẫu nhiên. Hãy sử dụng các khoá được cung cấp ở đây thay vì các khoá của bạn. Đọc Shaka Tài liệu về trình đóng gói về cách sử dụng Máy chủ khoá Widevine để xem thêm các ví dụ.

  1. Demux (tách riêng) âm thanh và video, mã hoá các tệp mới và xuất tệp mô tả bản trình bày nội dung nghe nhìn (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 (kết hợp) luồng âm thanh và video. Nếu bạn đang sử dụng video khung, bạn có thể không cần thực hiện việc này.

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

Trình tự chuyển đổi nội dung nghe nhìn

Phần này trình bày theo thứ tự các lệnh cần để chuyển từ tệp .mov thô đến thành phần đã mã hoá đóng gói cho DASH hoặc HLS. Để xác định mục tiêu minh hoạ, chúng tôi đang chuyển đổi tệp nguồn sang tốc độ bit 8Mbs ở độ phân giải 1080p (1920 x 1080). Hãy điều chỉnh các giá trị này tuỳ theo nhu cầu của bạn.

DASH/WebM

  1. Chuyển đổi loại tệp và bộ mã hoá và giải mã.

    Đối với lệnh này, bạn có thể sử dụng liborbis hoặc libopus cho bộ mã hoá và giải mã âm thanh.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Tạo khoá mã hoá Xoá khoá.

    openssl rand -hex 16 > media.key
    
  3. Demux (tách riêng) âm thanh và video, mã hoá các tệp mới và xuất tệp mô tả bản trình bày nội dung nghe nhìn (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 (kết hợp) luồng âm thanh và video. Nếu bạn đang sử dụng video khung, bạn có thể không cần thực hiện việc này.

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

DASH/MP4

  1. Chuyển đổi loại tệp, bộ mã hoá và giải mã video và tốc độ bit.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Tạo khoá mã hoá Xoá khoá.

    openssl rand -hex 16 > media.key
    
  3. Demux (tách riêng) âm thanh và video, mã hoá các tệp mới và xuất tệp mô tả bản trình bày nội dung nghe nhìn (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 (kết hợp) luồng âm thanh và video. Nếu bạn đang sử dụng video khung, bạn có thể không cần thực hiện việc này.

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

HLS/MP4

HLS chỉ hỗ trợ MP4, vì vậy trước tiên, bạn cần chuyển đổi sang vùng chứa MP4 và bộ mã hoá và giải mã được hỗ trợ.

  1. Chuyển đổi loại tệp, bộ mã hoá và giải mã video và tốc độ bit.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Tạo khoá mã hoá Xoá khoá.

    openssl rand -hex 16 > media.key
    
  3. Tạo một tệp thông tin quan trọng

    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
    

Bạn đã biết rất nhiều thông tin, nhưng hy vọng giờ đây bạn có thể mã hoá nội dung nghe nhìn của mình với sự tự tin. Tiếp theo, chúng tôi sẽ hướng dẫn bạn cách thêm nội dung nghe nhìn vào trang web của bạn.