【道听途说】Android如何直接显示FFMpeg解码后的yuv数据?

魏消晨 2012-07-02 09:07:09
主要是Android显示RGB565的数据,要经过yuv转换,那效率太低了。
大家有什么好的方案也都可以贴出来,共同解决下这个难题,貌似这类问题相关资料都不太全,大多只是点了些片面性的东西,对初学者来说简直是读了本天书。方案解决后,将更新到博客。
...全文
3028 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lishi_1991 2015-01-08
  • 打赏
  • 举报
回复
引用 8 楼 xiajing0228 的回复:
请问,楼主这个问题解决了没?我最近也在研究这方面的资料。 我的思路是 将android源码下载下来,提取出statefright中有关视频显示的部分,进而编译成.so文件,已供jni调用来显示FFMPEG解码后的YUV数据,不知道这个思路对不对。不过目前进展很不顺利,下载太麻烦,编译也烦,估计提取更不好弄,不知道你那有没有什么好的方法。谢谢!!!
您好 我最近也在设法安卓上yuv数据不转化直接显示,根据网络上资料使用surface 显示yuv 参照了这位哥们的代码:
http://www.aichengxu.com/view/30134
这其中jni层要链接到Android到源码里面的一些文件,用cygwin编译jnI库没问题,但是运行apk加载so库的时候就会报错,猜测可能也需要编译安卓源码,在安卓源码环境下编译,可是这个工作量很大,也很耗费时间,目前已下载过多个版本的Android源码,编译都没有通过,各种错误,因为本身是做c的,所以也没什么人可以求教。 所以想向您咨询一下 您最后有没有解决这个yuv显示的呢,我的思路 surfaceview显示yuv是不是正确,安卓源码环境下编译是否可行,不知道您是不是有更好的方法解决了这个yuv显示 谢谢
jj4896 2014-07-07
  • 打赏
  • 举报
回复
问下 我黑白的可以显示 彩色的就不行了 这是为什么呢 楼主知道吗
mjh1021 2013-12-24
  • 打赏
  • 举报
回复
现在有个neon优化过的YUV转RGB的代码,效率貌似不错,知道跟上述方式比效率上要差多少。
_Gx 2013-01-18
  • 打赏
  • 举报
回复
引用 楼主 wujxiaoz 的回复:
本帖最后由 wujxiaoz 于 2012-07-02 21:27:11 编辑 主要是Android显示RGB565的数据,要经过yuv转换,那效率太低了。 大家有什么好的方案也都可以贴出来,共同解决下这个难题,貌似这类问题相关资料都不太全,大多只是点了些片面性的东西,对初学者来说简直是读了本天书。方案解决后,将更新到博客。 ……
楼主,你的问题解决了吗?能不能向你请教一下 QQ:646648023
coloriy 2013-01-15
  • 打赏
  • 举报
回复
楼上思路应该是正确的,提取AwesomeLocalRenderer
hellowilliamwang 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
请问,楼主这个问题解决了没?我最近也在研究这方面的资料。
我的思路是 将android源码下载下来,提取出statefright中有关视频显示的部分,进而编译成.so文件,已供jni调用来显示FFMPEG解码后的YUV数据,不知道这个思路对不对。不过目前进展很不顺利,下载太麻烦,编译也烦,估计提取更不好弄,不知道你那有没有什么好的方法。谢谢!!!
[/Quote]

兄弟进展如何了?
xiajing0228 2012-09-04
  • 打赏
  • 举报
回复
请问,楼主这个问题解决了没?我最近也在研究这方面的资料。
我的思路是 将android源码下载下来,提取出statefright中有关视频显示的部分,进而编译成.so文件,已供jni调用来显示FFMPEG解码后的YUV数据,不知道这个思路对不对。不过目前进展很不顺利,下载太麻烦,编译也烦,估计提取更不好弄,不知道你那有没有什么好的方法。谢谢!!!
魏消晨 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
楼主掌握的很多了,overlay显示的就是yuv数据吧
[/Quote]
ameyume你有什么相关的demo或资料没?
ameyume 2012-07-03
  • 打赏
  • 举报
回复
楼主掌握的很多了,overlay显示的就是yuv数据吧
ameyume 2012-07-03
  • 打赏
  • 举报
回复
顶下,楼主的资料很全面了
魏消晨 2012-07-02
  • 打赏
  • 举报
回复
YUV420SP就是NV12格式,Y分量平面格式,UV打包格式。(Y数据全部从在一块,UV数据使用交错方式存储)
YUV420P,Y,U,V三个分量都是平面格式。
http://topic.csdn.net/u/20101202/13/b68be997-fd54-4ada-a5c0-fc66c9783b6b.html

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
YuvImage yuvImage = new YuvImage(data, PictureFormat.NV21, width, height, null); 
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 50, out); 
byte[] imageBytes = out.toByteArray(); 
Bitmap image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 
iv.setImageBitmap(image); 
http://stackoverflow.com/questions/9192982/displaying-yuv-image-in-android

The assumption is that most smartphone chipsets have color conversion,
rotation, and scaling in hardware. The pixel format enumerations are
there to support some typical formats that we expect to see used by
hardware. The software renderer (SurfaceFlinger/PixelFlinger) only supports RGB565.
http://groups.google.com/group/android-framework/browse_thread/thread/d3f242356375effa/367d64dcaa3cdaf3?

其实android里面定义的有overlay的接口,如果你的硬件支持的话,应该可以直接调用显示。
但是好像没有开放overlay的借口给java层,所以你应该只能在framework层调用overlay来显示你的解码后的图像。
具体的例子,你可以参考一下camera 的实现,做pre-view的时候就是调用的overlay直接显示的。

我的是使用ti的omap4430,我直接调用libstagefrighthw.so库来显示,在root下用二进制代码测试,VideoRenderer对象能创建,但是在render的时候,如果是720p,就只能render 1280长度的yuv数据,调用render传入实际长度的数据程序则崩溃。还有我直接使用overlay驱动,但是overlay_handle_t  mOverlayHandle = (overlay_handle_t)overlay->getHandleRef(overlay);程序调用到这步就挂了。
第一个方案:是直接参考android源代码中的awesomplayer.cpp调用过程来的。
第二个方案:其实就是第一个方案的底层调用。
http://www.eoeandroid.com/thread-31939-1-1.html

open core的代码似乎会自动调用overlay,如果你的系统里有libopencorehw.so这个库的话。你可以在opencore代码里搜索一下这个库的名字,能看到相关的逻辑。
http://www.eoeandroid.com/thread-4510-1-1.html

YuvImage Since: API Level 8
YuvImage(byte[] yuv, int format, int width, int height, int[] strides)
http://developer.android.com/reference/android/graphics/YuvImage.html
魏消晨 2012-07-02
  • 打赏
  • 举报
回复
魏消晨 2012-07-02
  • 打赏
  • 举报
回复
请参考opencore和STAFEFright中输出视频的相关代码
opencore中的MediaoutputNOde就知道怎么作了
源文档 <http://topic.csdn.net/u/20110113/12/2c143c1a-4930-4f8a-a6fd-9c5c3c19cabf.html>

好象surface在Android2.0以后,只支持RGB565了,之前是支持YUV420的。
但即使这样,Android2.2中,在surfaceflinger层,是支持YUV420的,camera输出大都是YUV啊。
源文档 <http://www.eoeandroid.com/thread-52488-1-1.html>

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧