如何在Android中的Mediaplayer中显示已编码的视频文件?

时间:2015-01-30 09:23:40

标签: android video stream android-mediaplayer

我有一个已编码的视频文件。例如,每个字节的第一位被反转。我想阅读此视频文件,更改第一位并将解码结果发送到Mediaplayer。

我该怎么做?如何在不将解码数据保存到存储空间的情况下创建并将此流传递到媒体播放器?

重要的是,我不想保存视频的解码副本并在媒体播放器上播放。我想使用流或其他可能的方式直接在媒体播放器上播放编码视频。

1 个答案:

答案 0 :(得分:1)

简短回答:不,没有办法做到这一点 (显然是我的观点)

您无法通过在传递MediaPlayer之前操纵数据来从“自定义”流中重现。

<强>为什么吗

最接近实现目标所需的官方MediaPlayer API如下:

MediaPlayer mp = new MediaPlayer();
FileInputStream fis = new FileInputStream(yourFile);
mp.setDataSource(fis.getFD());
//...

此代码段允许播放从FileInputStream开始的文件,但更精确地来自基础FileDescriptorFileDescriptor是一个标记为 final 的类(这是合理的,因为它必须处理底层操作系统),所以你不能覆盖任何东西。

可能的解决方法?

  1. 正如您已经指出的那样,您可以尝试在使用标准MediaPlayer复制视频时“就地”修改实际文件(不创建它的深层/单独副本):它非常棘手但是合理的。
  2. 尝试使用其他玩家对象:ExoPlayer(这是一种新的标准Android API)或Vitamio
  3. 尝试使用纯本机解决方案(NDK + Android源代码),我不推荐使用;)

  4. 更新:有关第一个解决方法的详细信息

    假设“每个字节的第一位被反转”,您可以使用FileChannel 在阅读时“就地”操作整个文件。您应该使用在“ rw ”模式下创建的RandomAccessFile创建的FileChannels,以便能够同时读/写。 这个 pre-elabaration任务可以在一个独立的线程上运行(或者在IntentService内运行,这更加时尚和可靠);您可以在精化开始后等待几秒钟,然后通过将File引用传递给标准MediaPlayer来开始播放(您需要根据详细说明的速度调整此等待时间,如流式传输缓冲但更容易,因为性能几乎稳定)。 这样,在开始播放之前,您无需等待预先详细说明的结束。 当播放停止或您关闭应用程序时,您需要通过在播放文件上调用相同的预先详细说明任务来撤消您的工作,以便将其恢复到原始状态。

    我希望这个提示有用。

    欢迎对我的回答发表评论和预备,如果我能找到更多信息,我会更新我的帖子。