上面已经用ffmpeg将YUV420P格式转为了RGBA,现在将其显示在surface上。
首先在android中写入一个自定义控件,继承自GLSurface. 并实现其接口,然后将控件写入某activity的XML中,运行时就会加载:

可以看出,当surfaceCreated执行时,就会调用run方法,执行JNI中的open方法。
这里注意,在c++中需要引入新的头文件:

在cmake中,也要在target_link_libraries中引入android 这个包:

这里要注意,如果是用快捷键在c++生成了open方法,一定要注意 extern "c" ,自动生成的时候,可能没有这个东西,会报错。

好了,其它代码都跟以前说的差不多。关键是将从java传入C++的surface关联起来,此段代码在读帧前执行即可:

那哪里才显示呢?肯定是要将视频象素从YUV转为RGBA之后,才显示嘛,如下:

从箭头开始处为显示内容。因为nwin已经与surface关联,这样,就将解码后的数据与java层的surface关联起来了。
这样,就能显示画面在android上面了。
网友评论