Dio*_*lor 6 android android-video-player android-mediaplayer
假设我们Surface在Android中有一个显示带有MediaPlayer的视频(例如h264):
1)是否可以更改表面视频上显示的饱和度,对比度和亮度?实时?例如,图像可以使用setColorFilterAndroid中的任何类似处理视频帧吗?
替代问题(如果第1号太难):
2)如果我们想用例如增加的饱和度导出该视频,我们应该使用编解码器,例如MediaCodec.在编解码器/保存操作之前我们应该使用什么技术(方法,类,库等)来应用饱和度变化?
仅用于显示,一种简单的方法是使用 a GLSurfaceView、 aSurfaceTexture渲染视频帧,然后使用MediaPlayer. Prokash 的答案链接到一个开源库,该库展示了如何实现这一目标。如果您一起搜索这些术语,还有许多其他示例。采用该路线,您将视频帧绘制到 OpenGL 纹理并创建 OpenGL 着色器来操纵纹理的渲染方式。(我建议向 Prokash 询问更多详细信息,如果这足以满足您的要求,请接受他的回答。)
同样,您可以使用 OpenGL 工具和MediaCodec来MediaExtractor解码视频帧。将MediaCodec配置为输出到 a SurfaceTexture,因此您只需编写一些样板代码即可渲染输出缓冲区。过滤过程与MediaPlayer. 有许多用作MediaCodec解码器的示例,例如此处和此处。将这些示例中使用的TextureView或替换为 Prokash 示例中的 应该相当简单。SurfaceViewGLSurfaceView
这种方法的优点是您可以访问媒体文件中的所有单独轨道。因此,您应该能够使用 OpenGL 过滤视频轨道并直接复制其他轨道以进行导出。MediaCodec您可以在编码模式中使用 aSurface和 from 作为GLSurfaceView输入,然后使用 aMediaMuxer将它们全部重新组合在一起。您可以在BigFlake上看到几个相关示例。
您可以使用MediaCodec不带 a 的 aSurface来直接访问解码的字节数据并以这种方式对其进行操作。这个例子说明了这种方法。您可以操作数据并将其发送到编码器以进行导出或按照您认为合适的方式进行渲染。处理原始字节数据有一些额外的复杂性。请注意,我喜欢这个示例,因为它说明了分别处理音频和视频轨道。
您还可以在本机代码中或通过 Java 包装器之一使用FFMpeg 。此选项更适合导出而不是立即播放。请参阅此处或此处了解一些尝试使 FFMpeg 可用于 Java 的库。它们基本上是命令行界面的包装器。您需要做一些额外的工作来通过 FFMpeg 管理播放,但这绝对是可行的。
如果您有疑问,请随时提出,我将尽力阐述对您的用例最有意义的任何选项。
| 归档时间: |
|
| 查看次数: |
2453 次 |
| 最近记录: |