1.通过以下命令对影片的明文 m3u8 和 ts 文件进行加密( aes-ecb ):

    openssl enc -aes-128-ecb -in decrypt/index.m3u8 -out encrypt/index.m3u8 -K $(echo -n "你自己任意指定的 16 位加密 key" | xxd -p)
   
    openssl enc -aes-128-ecb -in decrypt/001.ts -out encrypt/001.ts -K $(echo -n "你自己任意指定的 16 位加密 key" | xxd -p)
   
2.前端页面请求到 m3u8 播放链接时解密文件并播放。


这里我上传了一个不到 10 秒的未加密素材供测试,当然你也可以自己找个 mp4 文件切片成 m3u8 然后本地测试解密播放,先提前谢过各位前端老哥了,一旦成功解密播放,立即支付 100u 表达谢意。我的理解是 hls.js 或 crypto.js 之类的库来解密,但我不是专业前端所以改起来有困难。。。
https://drive.google.com/drive/folders/1QPD_E6C34tND0hICVrWIemxjRL-RLnad?usp=sharing
举报· 633 次点击
登录 注册 站外分享
38 条回复  
yuzo555 小成 2024-9-11 07:16:48
正确的做法是转码时让 ffmpeg 自动处理,而不是转码后自己去处理。以下方法来自 GPT-4o:

要使用 FFmpeg 将 MP4 格式的视频转码为 HLS 流并使用 HLS 标准加密( AES-128 ),你可以使用以下命令:

ffmpeg -i input.mp4 \
  -c:v libx264 -c:a aac \
  -hls_time 10 \
  -hls_key_info_file key_info_file.txt \
  -hls_playlist_type vod \
  output.m3u8

在使用这个命令之前,你需要准备一个 key_info_file.txt 文件,其中包含加密密钥信息。该文件的格式如下:

key_uri
key_file_path
key_iv

key_uri:在播放列表中引用密钥的 URI (通常是密钥的 URL )。
key_file_path:包含实际密钥的文件路径。
key_iv:初始化向量( IV ),如果不指定,FFmpeg 会自动生成。
例如:

https://example.com/keys/key.bin
./key.bin
0123456789abcdef0123456789abcdef

你还需要生成一个 16 字节的密钥,并将其保存到 key.bin 文件中。可以使用以下命令生成随机密钥:

openssl rand 16 > key.bin
请确保 key_info_file.txt 和 key.bin 文件的路径正确,并根据你的需求调整 FFmpeg 命令中的参数。
dullwit 小成 2024-9-11 08:10:58
DRM ?
LuckyLauncher 小成 2024-9-11 08:40:30
这个是自己加密前端实现解密?那不就相当于没加密?
dzdh 小成 2024-9-11 09:06:51
通通加密后。你 m3u8 的解密密钥怎么下发。写死到网页里?通过接口获取?

还是仅仅防一下小白而已?
helone 小成 2024-9-11 09:10:51
100u 怕是有点少
wbrobot 小成 2024-9-11 09:13:27
你这种就是请人定做一个 hls.js 嘛,获取到视频流之前前端解密一下,再拼成新的视频交给播放器播放。
你直接说定制 hls.js 就行了,什么算法都能实现,甚至不用全文件加密,只需要很短的 aes 随机替换 ts 中间的几个字节,盗播的人都播不了。
registerrr 小成 2024-9-11 09:17:03
没盯上你的,用 ffmpeg 自带的加密也足够了。真盯上你的,只要你的前端有解密逻辑,有什么破不了的,都能破。防防小白而已
paradox8599 小成 2024-9-11 09:26:47
@newbie111 不是吧,nextjs 的 env 只有 `NEXT_PUBLIC_` 开头的才会 1 暴露给前端呀
yb2313 小成 2024-9-11 09:28:11
是我想的那种网站吗, 让我看看
1234下一页
返回顶部