- 浏览: 405998 次
- 性别:
- 来自: 福州
最新评论
-
野牛精:
感谢楼主分享,帮大忙了。
android ftp 客户端编写(ftp4j) -
happytianqiu:
你好,我最近也在搞这个,能发个demo吗,邮箱是:624951 ...
开发android机顶盒应用 事件,焦点处理 -
zhunanfengfeimeng:
http://www.iteye.comhttp://www. ...
android ftp 客户端编写(ftp4j) -
icyttea:
好棒!感谢楼主分享
vlc for android录制视频与截图 -
clwwlc:
有demo吗
开发android机顶盒应用 事件,焦点处理
setPreviewFrameRate是在api level1就开始使用了,然后不是简单地设置这个方法就可以让摄像头每秒捕获多少帧数的。
比如我设置2,它一秒不会只捕获2帧数据的,从日志记录来看,相当糟糕,不会是预期的2帧,于是我查找文档,发现这个方法已经废除了。
在api level9时加入了一个方法setPreviewFpsRange (int min, int max)
预览帧数从min到max,这个值再*1000.
这个方法已经在高版本的sdk中取代了旧的setPreviewFrameRate。
如何知道摄像头的预览范围呢?我原以为从1到n,其实不然。
getSupportedPreviewFpsRange()这个方法就可以显示出你的手机摄像头支持的范围。
如i9000会是7-30而不是1-30.。。
所以在Camera.PreviewCallback回调中,onPreviewFrame会得到的帧数就不会小于7了。
我还一直以为预览帧数是2,看到的画面还是很流畅。。。
比如我设置2,它一秒不会只捕获2帧数据的,从日志记录来看,相当糟糕,不会是预期的2帧,于是我查找文档,发现这个方法已经废除了。
在api level9时加入了一个方法setPreviewFpsRange (int min, int max)
预览帧数从min到max,这个值再*1000.
这个方法已经在高版本的sdk中取代了旧的setPreviewFrameRate。
如何知道摄像头的预览范围呢?我原以为从1到n,其实不然。
getSupportedPreviewFpsRange()这个方法就可以显示出你的手机摄像头支持的范围。
List<int[]> range=parameters.getSupportedPreviewFpsRange(); Log.d(TAG, "range:"+range.size()); for(int j=0;j<range.size();j++) { int[] r=range.get(j); for(int k=0;k<r.length;k++) { Log.d(TAG, TAG+r[k]); } }
如i9000会是7-30而不是1-30.。。
所以在Camera.PreviewCallback回调中,onPreviewFrame会得到的帧数就不会小于7了。
我还一直以为预览帧数是2,看到的画面还是很流畅。。。
文档里还有这么一段话: Gets the supported preview fps (frame-per-second) ranges. Each range contains a minimum fps and maximum fps. If minimum fps equals to maximum fps, the camera outputs frames in fixed frame rate. If not, the camera outputs frames in auto frame rate. The actual frame rate fluctuates between the minimum and the maximum. The values are multiplied by 1000 and represented in integers. For example, if frame rate is 26.623 frames per second, the value is 26623. 如果最大值与最小值是一样的,就是以这个值输出预览,如果不同,则会以这个区间自动输出。 看上去,预览帧数还是不可控制的啊 这样只能自己控制帧数了。比如视频通话的就可以这样处理: private BlockingQueue<Object> mFrameList = new ArrayBlockingQueue<Object>(18);存放的帧最多18,多少根据自己的机器状况和网络状态调整,至少我觉得如果缓存太多,内存紧张,而且如果网络不好,一样发不出去,缓存太少,网络状况好的时候就会出现空帧,图像一样不流畅。 当然最好是还是c的编码速度够快,其它都是扯淡。 private void putVideoFrame(byte[] data,int width,int height){ if(!showVideo){ Log.d(TAG, "putVideoFrame.已经没有显示视频了。"); return; } Log.d(TAG, "putVideoFrame."); ///synchronized(mFrameList){ Object[] obj=new Object[]{data,width,height}; mFrameList.offer(obj); //} //这个过程本身就是同步的,把预览的帧放入缓存中等待发送。 } private PreviewCallback previewCallback=new PreviewCallback() { @Override public void onPreviewFrame(byte[] _data, Camera _camera) { Camera.Parameters parameters=_camera.getParameters(); final Camera.Size size=parameters.getPreviewSize(); final byte[] copyData = new byte[_data.length]; System.arraycopy(_data, 0, copyData, 0, _data.length); putVideoFrame(copyData, size.width, size.height); } }; 然后建一个线程: Runnable frameRunnable = new Runnable() { @Override public void run() { while (showVideo&&mStarted) { sendVideoFrame();//在这里把帧发出去 if(mFrameList.size()>=mFps){ fcount++; Log.d(TAG, "缓存帧又满了。"); Object[] obj=(Object[]) mFrameList.poll(); mFrameList.clear(); mFrameList.offer(obj); } } Log.d(TAG, "结束发送线程."); //mFrameList.clear(); } }; //满的时候需要将原来的清空,个人觉得如果缓存满了不清空,新预览的帧就会排在后面,如果一定要按顺序发送的话,还是不能达到流畅的效果。 最后是发送的: private void sendVideoFrame() { //Log.d(TAG, "sendVideoFrame."); Object[] obj=null; obj=(Object[]) mFrameList.poll(); Log.d(TAG, "obj:"+obj); if (null!=obj) { long start=System.currentTimeMillis(); byte[] data=(byte[]) obj[0]; Integer width=(Integer) obj[1]; Integer height=(Integer) obj[2]; if (发送条件) { int res=engine.SendVideoFrame(data, width, height); long end=System.currentTimeMillis(); start=end-start; //限制发送的帧数。 end=delta-start; Log.d(TAG, "发送一次图像需要时间:"+(start)+" width:"+width+" height:"+height+ " count:"+count+++" res:"+res+" fcount:"+fcount+" end:"+end); if (end>0) {//为什么在这里睡眠呢,假设现在的网络好,机器强劲,其实也没有必要一直发送视频帧的,这里就可 以限制发送。预计发送一次为200毫秒,一秒为5帧。那发送的时间小于200的就要等待了。这样就限制了,如果多于200毫秒的,就不要睡眠了。个人感觉,如果帧数到达12左右,基本感觉是较流畅了,再往上,不会有太大的区别(前提:目前手机也达到不20+,而且网络。。。) try { Thread.sleep(end); } catch (InterruptedException e) { e.printStackTrace(); } } } else { Log.d(TAG, "无法发送视频:"+engine); } obj = null; } else { try { Thread.sleep(20l); } catch (InterruptedException e) { e.printStackTrace(); } } } 最后,建一个线程发送:Thread mFrameThread=null; mFrameThread=new Thread(frameRunnable); //mFrameThread.setPriority(4); mFrameThread.start(); 在打开预览时就可以启动这个线程来发送图片了,在关闭预览时,结束发送线程。 在doubango中的ngn栈,它是使用c来处理这些东西的,对于 java,只需要调用jni方法直接把视频帧传入即可,没有这么多的缓存处理(有可能是在c端处理的,没有缓存是不行地)。
- AndroidVideo.zip (3.3 KB)
- 下载次数: 244
评论
2 楼
phenom
2012-11-19
完整的代码不能给,这个主要说明,在预览后,将帧保存起来,在一个列表中,然后另启动一个线程来发送帧(包含压缩,编码,发送,这部分由c处理。)。
如果在onPreviewFrame里面直接操作这些,这是在ui线程的。
在H264Android中有示例,作用是类似的,就是将预览的帧保存,供x264编码, 这个代码可以给。可以在h264编译这篇文章找到x264编码的代码,但里面的AndroidVideo.java在这里更新
如果在onPreviewFrame里面直接操作这些,这是在ui线程的。
在H264Android中有示例,作用是类似的,就是将预览的帧保存,供x264编码, 这个代码可以给。可以在h264编译这篇文章找到x264编码的代码,但里面的AndroidVideo.java在这里更新
ihopethatwell 写道
楼主,这个事例有完整demo?看着还是不是很明白
1 楼
ihopethatwell
2012-11-19
楼主,这个事例有完整demo?看着还是不是很明白
发表评论
-
android 批量打渠道包
2014-09-16 17:27 5815打包,是一个经常会遇到的问题,写个脚本就可以解决了.不同的脚本 ... -
vlc for android录制视频与截图
2014-09-08 18:31 7974首先说明,这不算原 ... -
android百度地图转为高德地图
2014-08-11 11:09 2907使用百度地图也不少时间了,但是一直出现无法解决的问题,在官 ... -
编译 i9000的cm系统
2014-08-04 13:10 1537[color=red][b]此文 并不 ... -
mp4v2 保存h264流
2014-05-01 21:15 11763大侠已经完成了很多操作了,唯一不足的是,工程完整性差一些,而且 ... -
baidumap的缩放到看到所有点
2014-04-09 21:03 1395之前使用1.3.5版本的sdk,通过调用mapviewcont ... -
ViewPager 查看图片
2014-02-13 12:59 4471一个图片查看器 , app到处都是 , 但那是别人的. 现在的 ... -
机顶盒 页面 选中后的 动画
2013-12-05 09:39 2130前面已经说过了,对于机顶盒的焦点的处理. 相信有不少人看 ... -
引爆你的图片浏览, ListView 大图片
2013-11-05 07:58 1263之前发现,ListView里面的图片资源越占越大,特别是当 ... -
微博开放源码
2013-10-23 12:09 985微博程序已经发布不少时间了,但一直也没有很多用户使用,主要在用 ... -
Mupdf 缩小apk包,减少字体
2013-10-20 15:53 3664在以前的apv中,字体占了很大的一部分,如果去除cjk字体 ... -
ActionBar appcompat 解决碎片化问题
2013-09-15 16:58 2118actionbarsherlock 这个在api11以下的系统 ... -
android机顶盒获取有线mac
2013-09-02 16:09 5434直接上代码: public static String ... -
android竖着的seekbar
2013-08-22 20:33 5429以前网上有位虾士发过一篇文章是关于竖着的seekbar,但是也 ... -
新浪微博oauth2.0 自动认证
2013-08-13 09:01 0oauth2.0作者认为它不先进,都放弃了.但是oauth2. ... -
android 颜表情.
2013-07-20 21:16 1777在使用TagsViewGroup 流布局后,我替换了原来的Gr ... -
flow 流布局.
2013-07-13 20:06 1258在git上看到一个FlowingViewGroup,代码有点旧 ... -
开发android机顶盒应用 事件,焦点处理
2013-07-13 19:58 19751机顶盒应用不同于手机 ... -
android 磁盘缓存.
2013-07-13 19:30 5232开发一个app,特别是图片的app,免不了要存储图片,内存缓存 ... -
TextView 文字淡入效果
2013-04-15 13:34 3451一个文本渐渐地从左到右的显示。 几步就可以了实现了。利用的是V ...
相关推荐
其中包括一个自己写的Camera2的Demo,支持预览、拍照和视频录制,以及若干个网上找的,具有参考价值的Camera2 Demo。 具体看我的博客 : https://blog.csdn.net/EthanCo/article/details/131371887 ...
我自己写的Android CameraX Demo,实现了预览/拍照/录制视频/图片分析/对焦/切换摄像头等操作。 具体详见我的博客 : https://blog.csdn.net/EthanCo/article/details/125603671
从camera的onPreviewFrame捕捉到预览帧保存成视频,然后合并成视频
Android MediaCodec 实现Camera预览帧数据编解码并投射至另外的SurfaceView显示,另外附加Camera2的使用。
android camera mirror 前置后置相机视频预览时左右镜像,实现镜子效果 基于以下网址实现的android studio项目源代码包,可以直接打开使用 https://blog.csdn.net/mbrose/article/details/80167781 代码做了一...
由于工作中需要用到Camera1,所以花了两天时间研究了以下,使用Android Camera1 API实现了相机预览、拍照和录制视频的功能。 资源中有个MyCamera1Demo.apk可以直接安装运行,MyCamera1Demo.zip是Demo源码。 具体详见...
使用android studio,用camera2实现拍照并能够实时预览,并将照片存到手机里,路径代码有注释。保存格式:fpg。实现全网最简便的代码。
本篇文章主要介绍了Android camera实时预览 实时处理,面部认证示例,具有一定的参考价值,有兴趣的可以了解一下。
3.实现Camera拍照后图片缩小显示以及正常预览; 4.实现Camera拍照后图片保存; 在具体实现代码之前,我们先来了解一下Android api对实现自定义Camera的介绍。 根据api的介绍,对于Camera应用可以简单总结以下几个...
Android原生Camera2完成预览和拍照,通过这个demo,可以让我们更好地了解Camera2的使用
Android camera2预览和取数据 https://blog.csdn.net/qq_31939617/article/details/86492025
Camera2GetPreview 在 Android Camera2 中获取和处理预览帧的示例工程
android camera 数据预览和处理代码,通过自定义控件,完成每隔多少秒对几个数据的收集操作,可用来做面部识别等。
使用camera2 api的android相机预览应用程序。捕获是在Java中实现的,但是使用NDK和JNI在OpenGL ES/VurkC 中进行C 渲染。
Android原生人脸识别,包含Camera和Camera2两种实现方法
Android 获取实时预览视频流,通过SurfaceView渲染,简单易懂,使用参考: https://blog.csdn.net/renlei0012/article/details/88057229
主要为大家详细介绍了Android中关于自定义相机预览界面拉伸问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
androidusbcamera是在saki4510t/uvc camera的基础上开发的,usb摄像机(uvc设备)项目和视频数据采集的使用都是高度封装的,它可以通过几个简单的api帮助开发者轻松使用usb摄像机设备。通过使用androidusbcamera,您...
花了两天时间看Android Binder机制,然后花了一下午的时间,跟了从APP到Driver Camera2的预览流程,拿出来分享备忘,欢迎下载!