在发送到解码器之前编辑ByteBuffer内容

时间:2019-09-10 13:00:15

标签: android bytebuffer mediaextractor

我正在尝试实现一个视频播放器,该播放器仅播放加密的视频文件。我编写了一个应用,该应用只是翻转了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)慢得多。 如果有人有优化建议,那就太好了!

0 个答案:

没有答案