假设Android中有一个Surface
,它会显示一个带有MediaPlayer的视频(例如h264):
1)是否可以改变显示的饱和度,对比度和表面视频上显示的亮度?实时?例如。图片可以使用setColorFilter
Android中是否有类似处理视频帧的内容?
备选问题(如果第1号太难):
2)如果我们想要导出此视频,例如如果饱和度增加,我们应该使用编解码器,例如MediaCodec
。在编解码器/保存操作之前我们应该使用什么技术(方法,类,库等)来应用饱和度变化?
答案 0 :(得分:2)
仅供显示,一种简单的方法是使用GLSurfaceView
,SurfaceTexture
来呈现视频帧,以及MediaPlayer
。 Prokash的答案链接到一个开源库,该库展示了如何实现这一目标。如果您一起搜索这些术语,还有许多其他示例。采用该路线,您可以将视频帧绘制到OpenGL纹理,并创建OpenGL着色器来操纵纹理的渲染方式。 (如果这足以满足您的要求,我建议向Prokash询问更多细节并接受他的回答。)
同样,您可以使用带有MediaCodec
和MediaExtractor
的OpenGL工具来解码视频帧。 MediaCodec
将被配置为输出到SurfaceTexture
,因此您不需要编写一些样板来获取输出缓冲区。过滤过程与MediaPlayer
相同。有许多使用MediaCodec
作为解码器的例子,例如here和here。将这些示例中使用的TextureView
或SurfaceView
替换为Prokash示例的GLSurfaceView
应该相当简单。
此方法的优点是您可以访问媒体文件中的所有单独曲目。因此,您应该能够使用OpenGL过滤视频轨道并直接复制其他轨道以进行导出。您可以在编码模式下使用MediaCodec
,Surface
作为GLSurfaceView
作为输入,使用MediaMuxer
将其全部重新组合在一起。您可以在BigFlake看到几个相关示例。
您可以使用MediaCodec
而不是Surface
直接访问已解码的字节数据并以此方式对其进行操作。 This example说明了这种方法。您可以操作数据并将其发送到编码器进行导出,也可以根据需要进行渲染。处理原始字节数据有一些额外的复杂性。请注意,我喜欢这个例子,因为它说明了单独处理音频和视频轨道。
您也可以在本机代码中使用FFMpeg,或者通过其中一个Java包装器使用here。此选项更适合导出而不是立即播放。有关尝试使FFMpeg可用于Java的某些库,请参阅here或{{3}}。它们基本上是命令行界面的包装器。你需要做一些额外的工作来通过FFMpeg来管理播放,但这绝对是可行的。
如果您有任何疑问,请随时提出,我将尝试阐述对您的用例最有意义的选项。
答案 1 :(得分:1)
如果您使用的是支持视频过滤器的播放器,那么您可以这样做。
此类播放器的示例是VLC,它是围绕FFMPEG [1]构建的。
VLC很容易为Android编译。然后您需要的是libvlc(aar文件),您可以构建自己的应用程序。请参阅编译说明here。
您还需要write your own module。只需复制现有的一个并进行修改即可。毋庸置疑,VLC提供强大的转码和流媒体功能。
作为Android的强大VLC,它有一个巨大的缺点 - 视频过滤器不能用于硬件解码(仅限Android)。这意味着整个视频处理都在CPU上。
您的其他选择是在GLSurfaceView和TextureView等曲面上使用GLSL / OpenGL。这种保证GPU的力量。