我在

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. python代码执行过程记录_详解python程序中记录日志的方法
  2. 网络营销专员浅析在网络营销推广中有不少渠道可适当“利用”一下
  3. 分组合计且排序和显示名称
  4. jquery remove()不兼容问题解决方案
  5. 代码中的时间格式问题究竟该如何处理?
  6. linux命令grep和find怎么用,Linux下find和grep常用命令及区别介绍
  7. eclipse lombok插件安装_Eclipse安装virgo插件
  8. Q91:真实地模拟透明材质(Realistic Transparency)(2)——Triangle Meshes
  9. 了解华为HCIP认证
  10. 会声会影滤镜特效教程之气泡滤镜
  11. Java - Object wait() 方法之虚假唤醒spurious wakeup
  12. 网络棋牌游戏创造快乐心情
  13. html视频自动播放播放器,支持弹字幕HTML5视频播放器DPlayer
  14. 初中升高中计算机考试题,初中信息技术中学考试excel操作题.doc
  15. 有免费而且好用的视频会议吗
  16. html绘制水管,CAD平面水管如何画?
  17. 轻量化SISR实验结果汇总
  18. 【ASP.Net】上传图片+水印
  19. 解决每次运行终端,自动激活conda环境问题
  20. STC15单片机驱动WS2812

热门文章

  1. Android音乐播放器的获取数据的三种途径
  2. 2017 Multi-University Training Contest - Team 6:1003hdu6098、Inversion
  3. python字体类型arial_Arial Narrow字体是Arial的()
  4. Java控制台各种打印三角形
  5. C语言输入输出字符串(一般方式,数组,指针)
  6. 斜挎包长度到哪里合适_女士斜挎包怎么背好看 女斜挎包3个搭配技巧
  7. photon server服务器搭建
  8. 第二章 TCP/IP 基础知识
  9. maven依赖optional可选依赖
  10. Win10内存使用率高解决方案