1. 工具说明

1.1 ExoPlayer

ExoPlayer是google开源的应用级媒体播放器项目,构建在Android的底层多媒体API之上。该开源项目包含ExoPlayer库和演示demo。

github地址:https://github.com/google/ExoPlayer

1.2 shaka-packager

Shaka Packager是用于DASH和HLS打包和加密的工具和媒体打包SDK。 它可以准备和打包媒体内容以进行在线流式传输,支持Widevine和其他DRM系统的通用加密。

当前支持的加密系统有:widevine, playready, fairPlay, Marlin

github地址:https://github.com/google/shaka-packager

2. 加密视频

2.1 下载shaka-packager

在github上可以下载源码进行自行编译,也可以只下载上面的release版本的工具。


建议下载linux版本的。当前版本是v2.3.0
这里提供一个本人下载好的版本
链接

2.2 使用ffmpeg生成不同规格的片源

由于在线流会根据不同的网络状况播放不同的分辨率的视频,所以一般都会把一个高清片源转成多种规格的片源以适应不同的网络环境。

在这里可以使用ffmpeg工具来转换。这个工具的使用说明网上有许多说明,在此就不再累述。

当然,此步骤可以省略

下载好ffmpeg工具后,可以参考shaka-packager的使用文档里的Media Encoding来转换不同规格:

  • 360p:
$ ffmpeg -i original.mp4 -c:a copy \-vf "scale=-2:360" \-c:v libx264 -profile:v baseline -level:v 3.0 \-x264-params scenecut=0:open_gop=0:min-keyint=72:keyint=72 \-minrate 600k -maxrate 600k -bufsize 600k -b:v 600k \-y h264_baseline_360p_600.mp4
  • 480p:
$ ffmpeg -i original.mp4 -c:a copy \-vf "scale=-2:480" \-c:v libx264 -profile:v main -level:v 3.1 \-x264-params scenecut=0:open_gop=0:min-keyint=72:keyint=72 \-minrate 1000k -maxrate 1000k -bufsize 1000k -b:v 1000k \-y h264_main_480p_1000.mp4
  • 720p:
$ ffmpeg -i original.mp4 -c:a copy \-vf "scale=-2:720" \-c:v libx264 -profile:v main -level:v 4.0 \-x264-params scenecut=0:open_gop=0:min-keyint=72:keyint=72 \-minrate 3000k -maxrate 3000k -bufsize 3000k -b:v 3000k \-y h264_main_720p_3000.mp4

博文为ganqiuye原创,转载请附上原文出处链接和本声明。

2.3 加密

注意:shaka-packager工具在使用的时候一般需要联网(架梯子)。

根据shaka packager的使用手册可知,DRM的加密方式可以有Using key serverusing raw key两种。

  1. using key server

需要联网。使用的key是来源服务器

  1. using raw key

不需要联网。使用的key是本地生成
在这里我们使用的是第一种方式。参考tutorials的examples

2.2步骤里转换的片源和shaka-packager工具放到同一个文件夹里,然后输入命令:

$ ./packager-linux \in=h264_baseline_360p_600.mp4,stream=audio,output=audio.mp4 \in=h264_baseline_360p_600.mp4,stream=video,output=h264_360p.mp4 \in=h264_main_480p_1000.mp4,stream=video,output=h264_480p.mp4 \in=h264_main_720p_3000.mp4,stream=video,output=h264_720p.mp4 \in=h264_high_1080p_6000.mp4,stream=video,output=h264_1080p.mp4 \--enable_widevine_encryption \--key_server_url https://license.uat.widevine.com/cenc/getcontentkey/widevine_test \--content_id 7465737420636f6e74656e74206964 \--signer widevine_test \--aes_signing_key 1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9 \--aes_signing_iv d58ce954203b7c9a9a9d467f59839249 \--mpd_output h264.mpd

这样在文件夹里就会有:

.
├── audio.mp4
├── h264_1080p.mp4
├── h264_360p.mp4
├── h264_480p.mp4
├── h264_720p.mp4
├── h264_baseline_360p_600.mp4
├── h264_high_1080p_6000.mp4
├── h264_main_480p_1000.mp4
├── h264_main_720p_3000.mp4
├── h264.mpd
└── packager-linux0 directories, 11 files

当然,上面命令可以根据实际情况增加或减少输入的源。

其中输出分别有:

加密的音频audio.mp4,
加密的视频:h264_1080p.mp4h264_360p.mp4264_480p.mp4h264_720p.mp4

加密的配置说明:h264.mpd

3. 播放加密视频

3.1 下载Exoplayer源码

下载exoplayer源码,当前release版本是r2.11.0, release-v2分支

导入到Android Studio中,切换到demo工程

3.2 修改配置文件,添加播放视频

修改demos/main/src/main/assets/media.exolist.json文件

diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json
index 01980c2..9ba77f6 100644
--- a/demos/main/src/main/assets/media.exolist.json
+++ b/demos/main/src/main/assets/media.exolist.json
@@ -1,5 +1,48 @@[{
+    "name": "TEST LOCAL",
+    "samples": [
+      {
+        "name": "local: 480",
+        "uri": "sdcard/Movies/h264_main_480p_1000.mp4"
+      },
+      {
+        "name": "wv,avc,1080@24fps",
+        "uri": "/sdcard/Movies/h264.mpd",
+        "drm_scheme": "widevine",
+        "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test"
+      },
+      {
+        "name": "wv,avc, 4k@30fps",
+        "uri": "/sdcard/Movies/h264_4k_30fps.mpd",
+        "drm_scheme": "widevine",
+        "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test"
+      },
+      {
+        "name": "wv,hevc, 4k@60fps",
+        "uri": "/sdcard/Movies/h265_4k_60fps.mpd",
+        "drm_scheme": "widevine",
+        "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test"
+      },
+      {
+        "name": "wv,vp9, 4k@30fps",
+        "uri": "/sdcard/Movies/vp9_4k_30fps.mpd",
+        "drm_scheme": "widevine",
+        "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test"
+      },
+      {
+        "name": "test server: 480",
+        "uri": "http://192.168.1.123/h264_main_480p_1000.mp4"
+      },
+      {
+        "name": "test server wv: avc@1080",
+        "uri": "http://192.168.1.123/h264.mpd",
+        "drm_scheme": "widevine",
+        "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test"
+      }
+    ]
+  },
+  {"name": "YouTube DASH","samples": [{

注意:

  1. drm_license_url的路径是https://proxy.uat.widevine.com/proxy?provider=widevine_test

而不是加密视频的时候用的key_server_url

  1. wv,avc,1080@24fps里的uri/sdcard/Movies/h264.mpd是有/

3.3 放置片源

由上可知,根据不同配置,将片源放到不同的地方,一是放进Android设备中的sdcard/Movies目录中,二是放到本地服务器中,另外需要注意的是mpd文件中配置了多少个源,那么就需要放置同样的音频源或视频源进去。

在实际应用中,需要把mpd文件和加密源放到一个网络服务器当中去,然后在media.exolist.json中添加相应的网络路径。

对于本地服务器的搭建,可以使用appache(安装步骤略)。之后将片源放到其默认目录下,如/var/www/html

3.4 编译安装播放

1、在res文件夹下创建一个xml文件夹,然后创建一个network_security_config.xml文件,文件内容如下:

diff --git a/demos/main/src/main/res/xml/network_security_config.xml b/demos/main/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..83a6d61
--- /dev/null
+++ b/demos/main/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">
+    <base-config cleartextTrafficPermitted="true" />
+</network-security-config>
\ No newline at end of file

2、在AndroidManifest.xml文件下的application标签增加以下属性:

diff --git a/demos/main/src/main/AndroidManifest.xml b/demos/main/src/main/AndroidManifest.xml
index 0240a37..24be293 100644
--- a/demos/main/src/main/AndroidManifest.xml
+++ b/demos/main/src/main/AndroidManifest.xml
@@ -36,6 +36,7 @@android:allowBackup="false"android:requestLegacyExternalStorage="true"android:name="com.google.android.exoplayer2.demo.DemoApplication"
+      android:networkSecurityConfig="@xml/network_security_config"tools:ignore="UnusedAttribute"><activity android:name="com.google.android.exoplayer2.demo.SampleChooserActivity"

在Android studio中编译安装apk到设备上,然后联网播放就可以播放本地的加密视频了。联网是为了获得license。

4. 遗留问题

  1. 在局域网中构建的服务器不能播放。在电脑端使用apache安装了一个服务端,在浏览器上是可以打开非加密视频源的,但在ExoPlayer中打不开。 这是因为,使用的板子是基于AndroidQ的,从AndroidP开始,就默认要求网络要安全链接,不支持http。此问题通过修改Exoplayer的配置项可解,解决方法如3.4的配置。
  2. 使用using raw key的方法生成加密视频,但在ExoPlayer中不知道配置什么参数来播放。对于使用using raw key进行非drm加密,请看我的文章《hls加密流生成之sample-aes加密》和《HLS/m3u8之sample-aes解密及软件开发》

ExoPlayer+Shaka-packager播放自制DRM视频相关推荐

  1. [WFD]播放DRM视频时,SINK端显示全黑画面或者默认图片

    [WFD]播放DRM视频时,SINK端显示全黑画面或者默认图片 [DESCRIPTION] 假设WFD SINK为TV ,和手机通过WFD连接上后,TV画面显示正常. 但是打开第三方视频播放软件(如i ...

  2. Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

    1. 实现效果 效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频 ...

  3. Android视频开发进阶(part5-安卓的DRM,视频版权保护)

    之前因为种种原因好久没有更新视频开发的文章了.今天刚刚从国内飞回来,趁着周末更新一下.不过关于DRM这块首先一般的开发者很少用到,而且DRM的开发需要前后台的密切合作,可以说后台的工作占了一大半,安卓 ...

  4. Android 边播放边缓存视频框架:AndroidVideoCache简析

    一.背景 现在的移动应用,视频是一个非常重要的组成部分,好像里面不搞一点视频就不是一个正常的移动App.在视频开发方面,可以分为视频录制和视频播放,视频录制的场景可能还比较少,这方面可以使用Googl ...

  5. php 小程序播放腾讯视频 video标签无法播放腾讯视频问题

    解决小程序播放腾讯视频问题.同适用于微擎.... 需要引用一些腾讯视频网站上的视频去播放,很多地方都是教人用F12抓一个mp4地址,这根本不行,因为那个地址是动态的, 翻了微信小程序的官方社区这方面的 ...

  6. androidTV在html中集成饺子播放器并播放m3u8格式视频

    饺子播放器的默认引擎是MediaPlayer,只能播放一些常见格式的视频.想要播放m3u8格式,需要切换引擎 jzvdStd.setUp("http://youku.cdn-iqiyi.co ...

  7. 小程序给视频加默认图片封面,点击播放视频并停止播放上一个视频

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 实现的功能: 微信小程序视频组件添加图片封面, 点击图片播放视频, 点击下一个视频的封面图自动停止播放当前视频 ...

  8. html背景mov,科技常识:html5自动播放mov格式视频的实例代码

    今天小编跟大家讲解下有关html5自动播放mov格式视频的实例代码 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关html5自动播放mov格式视频的实例代码 的相关资料,希望小伙伴们看了有 ...

  9. ubuntu firefox播放不了视频的解决办法 安装chrome 解决

    ubuntu firefox播放不了视频的解决办法 安装chrome 解决 有人建议flash,但是看评论flash漏洞太多 1 下载安装deb包 wget https://dl.google.com ...

最新文章

  1. 知识图谱与深度学习(新时代·技术新未来)
  2. 哈佛、MIT学者联手,创下矩阵乘法运算最快纪录
  3. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
  4. 腾讯99公益日︱深圳市慈善会:那些无力的故事,都拥有了力量
  5. 看完这篇 HTTPS,和面试官扯皮就没问题了
  6. 如何从机器学习数据中获取更多收益 1
  7. RabbitMQ批量确认发布
  8. mysql事务的重复性读_Mysql下InnoDB的可重复读级别的事务测试
  9. Java项目课程02:系统概述
  10. 如何上好网课 — 老师录课和在线上课教学经验谈
  11. 草图大师 2019 破解版|草图大师Sketchup pro 2019中文破解版64位下载 v19.0(附Sketchup 2019破解补丁)
  12. JAVA经典算法题目
  13. C1任务01-植物大战僵尸修改游戏存档(小白也能看懂)
  14. PPT文件解除编辑限制密码
  15. python爬虫一:爬虫简介
  16. 远程校准频率标准与数字时钟的解决方案
  17. IDEA2022.1创建maven项目,规避idea2022新建maven项目卡死,无反应问题
  18. (已更新)社区论坛小程序源码,功能齐全,简洁漂亮,前端+后端
  19. 【100个高大尚求职简历】简历模板+修改教程+行业分类简历模板 (涵盖各种行业) (简历模板+编辑指导+修改教程)
  20. nga php,index.php

热门文章

  1. 论文笔记--Self-Supervised Learning of 3D Human Pose using Multi-view Geometry(利用多视角几何学对三维人类姿势进行自我监督学习)
  2. Android BaseQuickAdapter万能适配器
  3. LPC17XX系列ISP升级流程
  4. python实现erp系统后端_python开发erp教程《PYTHON编一套完整ERP系统,15万元能下来吗》...
  5. 华为A1路由器虚拟服务器,华为a1路由器怎么用手机设置DMZ主机
  6. TODO List—2018今日头条校招
  7. unity3d英语单词拼写小游戏Pics Quiz Maker With Categories 3.0
  8. 是否还被word中各种下划线、波浪线困扰,来看这里(Word中拼写语法错误)
  9. 全球投资者聚焦阿里巴巴新零售:天猫力量定义商业未来
  10. js通过开始时间和结束时间计算出中间的所有日期,并且转换为层级结构数组对象,用于甘特图头部日期数据