我有一个编码的视频文件。例如,每个字节的第一位被反转。我想读取这个视频文件,更改第一位并将解码结果发送到 Mediaplayer。
我该怎么做?如何在不将解码数据保存在存储设备上的情况下创建此流并将其传递给媒体播放器?
重要的是我不想保存视频的解码副本并在媒体播放器上播放。我想使用流或其他可能的方式直接在媒体播放器上播放编码视频。
最佳答案
简短回答:不,没有办法做到这一点 (显然是我的观点)
您不能通过在将数据传递给 MediaPlayer
之前操纵数据来从“自定义”流中重现。
为什么?
最接近实现您的目标所需的官方 MediaPlayer
API 如下:
MediaPlayer mp = new MediaPlayer();
FileInputStream fis = new FileInputStream(yourFile);
mp.setDataSource(fis.getFD());
//...
此代码段允许从 FileInputStream
开始播放文件,但更准确地说是从底层 FileDescriptor
开始播放文件。 FileDescriptor是一个标记为 final 的类(这是合理的,因为它必须处理底层操作系统),因此您不能覆盖任何内容。
可能的解决方法?
- 正如您已经指出的那样,您可以尝试“就地”修改真实文件,同时使用标准
MediaPlayer
再现视频(无需创建它的深度/单独副本):它是非常棘手但合理。 - 尝试使用另一个玩家对象:ExoPlayer (这是一个新的标准 Android API)或 Vitamio
- 尝试纯原生解决方案(NDK + Android 源代码),我不推荐;)
更新:关于第一个解决方法的详细信息
假设“每个字节的第一位被反转”你可以使用 FileChannel 在读取文件时“就地”操作整个文件。您应该使用从 RandomAccessFile 创建的 FileChannels
以“rw”模式创建,以便能够同时读/写。
这个pre-elabaration 任务 可以在一个单独的线程上运行(或者在一个IntentService
中运行,这样更时尚和可靠);您可以在详细说明开始后等待几秒钟,然后通过将 File
引用传递给标准 MediaPlayer
来开始播放(考虑到有多快,您需要调整此等待时间详细说明,就像流式缓冲但更容易,因为性能几乎稳定)。
这样你就不需要等到预加工结束再开始回放。
当播放停止或您关闭应用程序时,您需要通过对播放的文件调用相同的预加工任务来撤消您的工作,以便将其恢复到其原始状态。
希望这个提示有用。
欢迎对我的回答发表评论和精确说明,如果我能找到更多信息,我会更新我的帖子。
关于android - 如何在 Android 的 Mediaplayer 中显示编码的视频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28232716/