我在

Android中使用

ExoPlayer,我正在尝试重现本地存储的加密视频.

ExoPlayer的模块化允许创建可以注入到ExoPlayer中的自定义组件,这种情况似乎如此.事实上,经过一些研究,我意识到,为了完成任务,我可以创建一个自定义的DataSource并覆盖open(),read()和close().

我也发现了this solution,但实际上这里整个文件是一步解密并存储在一个清晰的输入流中.这在很多情况下可以很好.但是如果我需要重现大文件怎么办?

所以问题是:如何在ExoPlayer中复制加密的视频,“即时”解密内容(不解密整个文件)?这可能吗

我尝试创建一个具有open()方法的自定义DataSource:

@Override

public long open(DataSpec dataSpec) throws FileDataSourceException {

try {

File file = new File(dataSpec.uri.getPath());

clearInputStream = new CipherInputStream(new FileInputStream(file), mCipher);

long skipped = clearInputStream.skip(dataSpec.position);

if (skipped < dataSpec.position) {

throw new EOFException();

}

if (dataSpec.length != C.LENGTH_UNBOUNDED) {

bytesRemaining = dataSpec.length;

} else {

bytesRemaining = clearInputStream.available();

if (bytesRemaining == 0) {

bytesRemaining = C.LENGTH_UNBOUNDED;

}

}

} catch (EOFException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

opened = true;

if (listener != null) {

listener.onTransferStart();

}

return bytesRemaining;

}

这是read()方法:

@Override

public int read(byte[] buffer, int offset, int readLength) throws FileDataSourceException {

if (bytesRemaining == 0) {

return -1;

} else {

int bytesRead = 0;

int bytesToRead = bytesRemaining == C.LENGTH_UNBOUNDED ? readLength

: (int) Math.min(bytesRemaining, readLength);

try {

bytesRead = clearInputStream.read(buffer, offset, bytesToRead);

} catch (IOException e) {

e.printStackTrace();

}

if (bytesRead > 0) {

if (bytesRemaining != C.LENGTH_UNBOUNDED) {

bytesRemaining -= bytesRead;

}

if (listener != null) {

listener.onBytesTransferred(bytesRead);

}

}

return bytesRead;

}

}

如果不是编码文件,我传递一个清除文件,只是删除CipherInputStream部分,那么它工作正常,而是加密文件我得到这个错误:

Unexpected exception loading stream

java.lang.IllegalStateException: Top bit not zero: -1195853062

at com.google.android.exoplayer.util.ParsableByteArray.readUnsignedIntToInt(ParsableByteArray.java:240)

at com.google.android.exoplayer.extractor.mp4.Mp4Extractor.readSample(Mp4Extractor.java:331)

at com.google.android.exoplayer.extractor.mp4.Mp4Extractor.read(Mp4Extractor.java:122)

at com.google.android.exoplayer.extractor.ExtractorSampleSource$ExtractingLoadable.load(ExtractorSampleSource.java:745)

at com.google.android.exoplayer.upstream.Loader$LoadTask.run(Loader.java:209)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)

at java.util.concurrent.FutureTask.run(FutureTask.java:237)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)

at java.lang.Thread.run(Thread.java:818)

编辑:

以这种方式生成加密视频:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

SecretKeySpec keySpec = new SecretKeySpec("0123456789012345".getBytes(), "AES");

IvParameterSpec ivSpec = new IvParameterSpec("0123459876543210".getBytes());

cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

outputStream = new CipherOutputStream(output_stream, cipher);

然后将outputStream保存到文件中.

android exo解码问题,android – 使用ExoPlayer再现加密视频相关推荐

  1. android exo解码问题,Android Exoplayer音频播放异常

    我使用ExoPlayer播放声音时遇到问题.即快速切换"停止 - 启动"异常发生Android Exoplayer音频播放异常 java.lang.NullPointerExcep ...

  2. android exo解码问题,android – exoplayer-自动更改质量不起作用(hls)

    我对exoplayer没什么问题.当我尝试从hls流播放视频时几乎一切正常. hls流包含3组不同的组块列表,每组用于不同的带宽. 但是自适应流媒体不起作用,播放器只能使用一个块表,并且网络连接速度慢 ...

  3. android图片解码显示,android 图片解码显示流程

    问题来源 android 可以在 gallery 里面显示内部存储的图片,支持 jpeg,png,gif,bmp 等,甚至文件类型和图片后缀名不一致,只要是图片文件就能显示,然后 git 只会显示第一 ...

  4. android+rtp解码,在Android上解码RTP流(MPEG4)

    问题: 我有一个RTP流,我在我的专用网络(WiFi)上进行组播.我想使用一些Android平板电脑来显示流.平板电脑的数量不能受到限制,质量不应随着客户数量的增加而降低.这解释了为什么我需要多播而不 ...

  5. android硬解码x265,Android 设置硬解码 h265 失败

    在demo中开启硬件解码,同时设置h265开关 ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacode ...

  6. android m4a播放器,如何在android上解码m4a音频

    我试图在android上解码音频并获取原始数据以应用过滤器. 所以我首先用 extractor.getTrackFormat(0); MediaExtractor extractor = new Me ...

  7. android vr播放器 开发,Android应用开发之Android VR Player(全景视频播放器)- ExoPlayer播放器MPEG-DASH视频播放...

    本文将带你了解Android应用开发之Android VR Player(全景视频播放器)- ExoPlayer播放器MPEG-DASH视频播放,希望本文对大家学Android有所帮助. Androi ...

  8. 身份证阅读器Android相片解码库报错libwlt2bmp.so:has text relocations解决方案

    身份证阅读器Android相片解码库报错libwlt2bmp.so:has text relocations,如下图的几种情况. libwlt2bmp.so是部里的相片解码库,身份证芯片里面存储的相片 ...

  9. Android Mediacodec解码视频(通过Surface播放、得到Image数据)

    MediaCodec解码得到Image 对于仅仅需要将视频切分为一帧一帧并保存为图片的用户来说,使用这种方法比bigflake的方法会快10倍左右,因为没有OpenGL渲染,以及转换为Bitmap的开 ...

最新文章

  1. linux ptrace反调试之抢占ptrace
  2. C#Windows 服务制作安装删除. 用户注销后,程序继续运行 (转载)
  3. [网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用
  4. 使用verilog实现基于FPGA的TDC设计
  5. java随机产生十个坐标_java中随机坐标
  6. 论文浅尝 - CVPR2020 | 基于网格特征的可视问答系统
  7. 2017.9.17 选数 失败总结
  8. jQuery Validate focusCleanup: true
  9. 用c语言编写成绩单由高到低,C语言程序设计实验.doc
  10. keepalive高可用
  11. SDL2 + OPENGL GLSL 实践
  12. epsonl360打印机连接电脑_爱普生l360驱动下载
  13. Java求100000以内素数_100000以内的质数表
  14. 如何搭建一个公司网站?
  15. 数学原理-高等数学复习笔记 ——1.2 泰勒公式 罗尔中值定理与拉格朗日中值定理(附加多个实战题目)
  16. mysql中的广播是什么意思_Android中的广播、服务、数据库、通知、包等术语的原理和介绍(图解)...
  17. 获取新浪开放平台的Access token
  18. _ETHREAD断链 —— 实现线程隐藏
  19. 写给我的如风老男人(终结版)
  20. SDNU 1309.啤酒和饮料

热门文章

  1. 吃鸡出现错误服务器维护中,吃鸡今天维护到什么时候?吃鸡更新运行错误怎么办?...
  2. 转……不相爱的爱,是一片废墟???
  3. 5 月 28 日 - 29 日阿里云峰会视频云专场直播预告
  4. 三星pad系统android4.0,堪称安卓系统最强悍平板的三星Galaxy Tab S4正式发布,售价有点...
  5. 【个人项目】电商价格监控——项目介绍和架构演变
  6. Android加固后版本更新解析包时出现问题
  7. MyBatis中模糊查询LIKE的三种方式
  8. QT读取文件路径用C语言File打开
  9. day04-tomcat-20210925
  10. 北京第一年-OpenGL-3第一个任务-animation动画