我正在尝试实现一个视频播放器,该播放器仅播放加密的视频文件。我编写了一个应用,该应用只是翻转了MP4内容的mdat
框的字节,而使元数据保持不变。采用这种方法的原因是我的视频文件很大(> 20 Gb),而传统的加密时间太长。
因此,想法是在将字节交给解码器之前先对其进行解密(反向翻转)。我停留在第一步是因为我发现即使不修改字节缓冲区,也无法复制字节缓冲区的内容。
有效的代码,但不允许潜在的数据修改:
public int readSampleData(ByteBuffer byteBuf, int offset) {
ByteBuffer bb = byteBuf.duplicate();
return mApi.readSampleData(bb, offset);
}
当尝试使用下面的代码进行复制时,在logcat中出现OMX_ErrorStreamCorrupt
个错误:
public int readSampleData(ByteBuffer byteBuf, int offset) {
ByteBuffer bb = ByteBuffer.allocate(byteBuf.remaining());
byteBuf.flip();
bb.put(byteBuf);
bb.rewind();
return mApi.readSampleData(bb, offset);
}
使用protected android.media.MediaExtractor mApi
下一步是逐字节复制内容并执行一个操作,例如+1。
如何正确执行此操作?
我误解了MediaExtractor
的工作方式。实际上,我必须在readSampleData
之后编辑内容,例如:
ByteBuffer bb = ByteBuffer.allocateDirect(byteBuf.remaining());
int res = mApi.readSampleData(bb, offset);
for (int i=0;i<bb.limit();i++)byteBuf.put((byte) (bb.get()+1));
return res;
但是此代码比仅使用byteBuf.put(bb)
慢得多。
如果有人有优化建议,那就太好了!