13

我正在尝试创建一个应用程序,我可以在其中向录制的视频添加过滤器。基本上,我想复制 Instagram 视频或 Viddy 中存在的功能。

我做了研究,我不能把它们拼凑在一起。我研究过使用 GLSurfaceView 播放录制的视频,我知道我可以使用 NDK 进行像素操作并将其发送回 SurfaceView 或以某种方式保存。问题是,我不知道如何发送像素数据,因为似乎没有访问它的功能。这个想法来自相机功能“onPreviewFrame”。该函数返回一个字节数组,允许我操作像素并显示它。

另一个想法是使用 GLSurfaceView 并使用 OpenGL 来渲染过滤器。GLSurfaceView 有一个可以设置的渲染器,但我对 OpenGL 不是很熟悉。但同样,这又回到了实际获取每个视频帧的像素。我还阅读了关于将每一帧作为纹理翻录然后在 OpenGL 中操作纹理的信息,但我遇到的答案不是很详细。

最后,我研究了 JavaCV。尝试使用 FFmpegFrameGrabber,但我也没有太多。我只想抓取一帧,但是当我尝试将帧的 ByteBuffer 写入 ImageView 时,出现“缓冲区不够大以容纳像素”错误。

任何指导都会很棒。

4

2 回答 2

7

从 Android 4.3 开始,您可以使用 aSurface作为编码器的输入。http://developer.android.com/about/versions/android-4.3.html#Multimedia

因此,您可以使用 GLSurfaceView 并使用片段着色器应用过滤器。

你可以在这里找到一些很好的例子。http://bigflake.com/mediacodec/

于 2013-12-20T07:12:00.763 回答
0

最好使用 exoplayer 过滤器库,这个库可以完成您的工作,但是为了将过滤后的分层与视频合并,您必须做额外的工作。

exoplayer 过滤器的链接适合您:ExoplayerFilter

您必须为此设置 exoplayer,但按照他们的指示您将能够完成任务。如果出现问题,请联系我。

于 2017-08-29T09:29:59.730 回答