Trong phần này, chúng ta sẽ đề cập đến 2 chiến lược khác nhau để mã hoá nội dung nghe nhìn, cùng một số ví dụ thiết thực về cách sử dụng các chiến lược này với FFmpeg vàShaka Packager. Hai chiến lược mã hoá mà chúng ta sẽ thảo luận là Xoá khoá và sử dụng một dịch vụ như Google Widevine. Cả hai chiến lược đều là một dạng quản lý quyền kỹ thuật số (DRM) để kiểm soát những gì người dùng có thể thực hiện với nội dung đa phương tiện của bạn. Tuy nhiên, một phương thức vốn kém an toàn hơn so với cái khác do phương thức truyền các khoá để xác thực và đó là lý do dịch vụ DRM có thể hợp lý hơn.
Các dịch vụ DRM chính dành cho web là Google Widevine, Microsoft PlayReady và Apple FairPlay, nhưng chúng tôi sẽ không đề cập đến tất cả các dịch vụ này trong bài viết này. Tuy nhiên, nếu đang nhắm đến tất cả các trình duyệt hiện đại, thì có khả năng bạn sẽ sử dụng cả 3 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 cần hiểu rõ về Khoá rõ ràng là gì và không được phép sử dụng trước khi sử dụng. Nếu bạn không muốn sử dụng một dịch vụ DRM hiện có và cảm thấy rằng phương án mã hoá cơ bản cho nội dung nghe nhìn của bạn là khả thi, hãy dùng tính năng Xoá Khoá. Tuy nhiên, hãy lưu ý rằng kiểu mã hoá này không cung cấp cùng mức bảo mật như việc sử dụng một trong các dịch vụ DRM. Nguyên nhân là do cặp khoá-giá trị không được mã hoá dưới một khoá khác, không giống như các khoá đã mã hoá do khoá giải mã tạo ra được lưu trữ trên máy chủ cấp phép. Ngoài ra, 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 bạn mã hoá nội dung nghe nhìn, khoá để giải mã không phải là khoá 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 cách sử dụ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 IV
Tiếp theo, chúng ta có thể tạo một vectơ khởi tạo (IV).
openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66
Mã hoá bằng Khoá rõ ràng
Ví dụ sau đây sử dụng Shaka Packager với khoá thô, trong đó keys
và key_ids
được cung cấp trực tiếp cho Shaka Packager. Hãy đọc tài liệu để biết thêm ví dụ.
Đối với cờ key
, hãy sử dụng khoá đã tạo trước đó (được lưu trữ trong tệp media.key
). Tuy nhiên, khi nhập mã vào dòng lệnh, hãy đảm bảo bạn đã 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 đã 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 chính
Để mã hoá cho HLS, bạn cần có tệp thông tin khoá ngoài tệp khoá. Tệp thông tin về khoá là một tệp văn bản có định dạng dưới đây. Tệp này phải có đuôi .keyinfo
. Ví dụ: encrypt.keyinfo
.
key URI
key file path
private key
URI khoá là nơi media.key
(đã tạo ở trên) sẽ được đặt trên máy chủ của bạn. Đường dẫn tệp khoá là vị trí của đường dẫn tương ứng với tệp thông tin khoá. Cuối cùng, khoá riêng tư là nội dung của chính tệp 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 mã hoá Xoá Khoá là gì và trường hợp sử dụng. 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 sử dụng để mã hoá và giải mã nội dung nghe nhìn của bạn một cách bảo mật. Widevine hỗ trợ MPEG-DASH và HLS, đồng thời là một DRM của Google. Widevine được sử dụng trong các trình duyệt web Google Chrome và Firefox, 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ã hóa bằng Widevine
Hầu hết ví dụ trong bài viết này đều sử dụng phương thức mã hoá bằng xoá khoá. Tuy nhiên, đối với Widevine, bạn cầ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 nội dung trong lệnh tách kênh (demux) ngoại trừ tên tệp và cờ --content-id
phải được sao chép chính xác trong ví dụ này. --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 tại đây thay vì các khoá của bạn. Hãy đọc tài liệu về Shaka Packager về cách sử dụng Máy chủ khoá Widevine để biết thêm ví dụ.
Demux (tách riêng) âm thanh và video, mã hoá các tệp mới và xuất ra mộ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"
Remux (kết hợp) các luồng âm thanh và video. Nếu đang sử dụng khung video, thì bạn có thể không cần làm 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 hiển thị theo thứ tự các lệnh cần thiết để lấy từ tệp .mov
thô đến thành phần đã mã hoá được đóng gói cho DASH hoặc HLS. Nhằm mục tiêu minh hoạ, chúng tôi sẽ chuyển đổi tệp nguồn thành tốc độ bit 8Mbs ở độ phân giải 1080p (1920 x 1080). Bạn có thể điều chỉnh các giá trị này theo nhu cầu của mình.
DASH/WebM
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ặclibopus
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
Tạo khoá mã hoá Xoá Khoá.
openssl rand -hex 16 > media.key
Demux (tách riêng) âm thanh và video, mã hoá các tệp mới và xuất ra mộ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
Remux (kết hợp) các luồng âm thanh và video. Nếu đang sử dụng khung video, thì bạn có thể không cần làm việc này.
ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
DASH/MP4
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
Tạo khoá mã hoá Xoá Khoá.
openssl rand -hex 16 > media.key
Demux (tách riêng) âm thanh và video, mã hoá các tệp mới và xuất ra mộ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
Remux (kết hợp) các luồng âm thanh và video. Nếu đang sử dụng khung video, thì bạn có thể không cần làm việc này.
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
HLS/MP4
HLS chỉ hỗ trợ MP4, nên trước tiên, bạn cần chuyển đổi sang vùng chứa MP4 và các bộ mã hoá và giải mã được hỗ trợ.
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
Tạo khoá mã hoá Xoá Khoá.
openssl rand -hex 16 > media.key
Tạo một tệp thông tin chính
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 đã có rất nhiều thông tin cần biết nhưng hy vọng giờ đây, bạn có thể tự tin mã hoá nội dung nghe nhìn của mình. 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.