iphone5 摄像头问题共享问题

Pinos:实现摄像头共享_Linux新闻_Linux公社-Linux系统门户网站
你好,游客
Pinos:实现摄像头共享
来源:linuxtoy.org&
作者:黑日白月
Pinos 想要解决的问题和当初 PulseAudio 的类似 :
允许多个应用共享摄像头资源
提供方便上层应用开发使用的 API
具体来说包括 :
允许在多个不同的应用程序之间快速切换摄像头设备 , 或者将多个来源不同的视频流合并成一个
支持包括屏幕桌面在内的多类型视频来源
提供良好的 GStreamer 集成
为了方便实际应用 , 提供简单的音频处理
那么对于未来的
Workstation,Pinos 能带来哪些看得见摸得着的改善呢 ?
GNOME 内嵌的屏幕录像可以通过 Pinos 实现一边录制屏幕 , 一边录制来自摄像头的视频和声音 , 这点对于录制网上教学视频十分方便 , 减少了后期制作的麻烦
提供对于沙箱化应用的视频输入设备访问支持 , 当下直接访问 V4L2 内核 API 的方式并不适合沙箱化应用
由于尝试解决类似的问题 ,Pinos 原本叫 PulseVideo, 不过现在依据主要作者 Wim Taymans 家乡一个附近小镇的命在改叫 Pinos, Wim Taymans 同时也是 Gstreamer 的联合创始人之一 。
本文永久更新链接地址:
相关资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款当前位置: >
>EarthCam:全球眼在线摄影头视频网
网站详情来源:
收录时间:
名称: EarthCam:全球眼在线摄影头视频网
英文网址:
中文网址:
EarthCam:全球眼在线摄影头视频网是一个世界级的在线摄影头视频分享网站,提供、等个大国家的在线直播式的资源,包括城市监控、街道、景区、主站等。
EarthCam是全球最早上线的摄像头视频分享网站之一。每天摄像头视频播放量超过上万人次,每天独立用户数过万,拥有超过上万注册用户。让富有创造力的摄像头创造者和分享者们能够自由地让自己的摄像头视频在用户面前出现,也让每一个用户随时随地都能看到自己想看到的任何摄像头视频。
EarthCam摄像头视频内容主要包括三大类:
1、网友自行制作或分享的摄像头共享视频;
2、来自全世界众多摄像头站点的视频,包括城市监控、街道、景区点、住宅、家庭等摄像头。直播客网上千家国内外知名摄像头共享平台建立了广泛的深度合作。
3、直播客直接投资建设的网络共享摄像头。
ebcam Network | EarthCam. EarthCam is the leading network of live webcams and offers the most comprehensive search engine of internet cameras from around the world. EarthCam also creates and produces live webcasts in addition to providing complete infrastructure services to manage, host and maintain live streaming video camera systems for its consumers and corporate clients.
分享给小伙伴们:
赫赫无敌:探索互联网世界,收集和分享实用互联网资源,推荐国内和国外知名、实用、创新、科技、优质的站点资源!互联无极限,探索无止境;分享求真知,网络无国界!
本文地址:/topics/7066.html 转载请注明
同类站点推荐分享2种打开Win8系统摄像头的方法
分享2种打开Win8系统摄像头的方法
在XP系统可以在我的电脑中找到摄像头快捷方式,可以快速打开电脑摄像头,但从Win7开始,系统已经在计算机当中隐藏了摄像头,并且在Win8中,摄像头隐藏的更深。
Win8是目前最新的电脑操作系统,很多新购买的电脑都开始采用了最新的Win8系统,并且不少Win7用户也进行了升级,随着Win8市场占有率不断提升。随着带来的问题也不少,不少网友Win8摄像头怎么打开。以前我们在XP系统可以在我的电脑中找到摄像头快捷方式,可以快速打开电脑摄像头,但从Win7开始,系统已经在计算机当中隐藏了摄像头,并且在Win8中,摄像头隐藏的更深。
那么Win8摄像头怎么打开呢?以下小编为大家介绍两种打开Win8摄像头的方法,Win8小白朋友快来学习一下吧。
1、进入Win8开始屏幕,在右下角可以看到有&相机&选项,我们选择打开即可,如下图:
找到Win8相机
提示:如果在Win8开始屏幕右下角没有找到&相机&应用入口,那么需要在Win8开始屏幕右下角的空白区域右击鼠标,然后选择&所有应用&,之后在所有应用中,找到&相机&应用即可,如下图所示。
2、如果是第一次使用电脑的摄像头,则会看到一个提示框,提示我们是否开启摄像头与麦克风,这里我们点击:允许&即可,如下图所示:
点击允许启用摄像头
3、之后我们就可以打开Win8摄像头(相机)了,另外我们还可以在Win8摄像头里边调节分辨率,实现更好的画质等,如下图。
Win8涉嫌头分辨率设置
Win8相机拍照相当简单,进入Win8相机摄像头之后,我们只要点击鼠标左键即可拍照。那么拍照后,如何找到我们的相片呢?这个其实Win8做的更加个性化,拍照后,win8相机左边会出现一个箭头,点击该&箭头&即可进入图片库,里边即可找到我们的拍摄的照片,另外您也可以进入Win8图库,找到摄像头拍摄的照片windows xp系统。
Ps:Win8相机还支持视频拍摄功能,相比以前的Win7、XP摄像头,Win8相机显然更为强大。
方法二:安装摄像头软件打开Win8摄像头
由于Win8摄像头相机隐藏较深,无法在计算机(我的电脑)中快速找到,因此我们不妨安装一个Win8摄像头应用软件,然后在桌面创建个相机应用快捷键,每次我们要拍照的时候,只要打开Win8摄像头应用就可以了。
这里建议大家安装一款名为ECAP摄像头软件,支持Win7/Win8系统,下载后,我们直接点击运行安装,如下图:
运行安装Win8摄像头应用软件
如上图,点击确定之后,我们在进入Win8计算机里边就可以看到有Win8摄像头快捷入口了,如下图:
使用摄像头应用打开Win8摄像头
怎么样,看完了以上xp系统之家小编介绍的两种Win8摄像头怎么打开的方法,是不是恍然觉得Win8摄像头打开也是如此简单呢?与Win7类似,Win8摄像头同样隐藏在了比较深的位置,我们只要知道其位置就可以快速打开了,另外对于QQ视频用户,只要电脑上有摄像头,并且安装了正常驱动可用,开启QQ视频也可以打开Win8摄像头,如果你不知道Win8摄像头如何打开,采用QQ视频方式也可以开启喔。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'7084人阅读
Andorid(22)
版本:Android 4.0 r1
Android框架包含了对多种摄像头和摄像特性的支持,应用程序可以进行图片和视频的捕获。本文讨论了一种快速、简便的捕获图像和视频的方法,并简述了一种更高级的可为用户创建自定义摄像功能的方法。
在让应用程序使用Android设备的摄像头之前,应该考虑一些期望如何使用此硬件的问题。
摄像头需求—— 摄像头的使用对于应用程序是否确实如此重要,以至于在没有摄像头的设备上就不期望安装此应用了?如果确实如此,应该
快速拍照还是自定义摄像—— 应用程序如何使用摄像头?仅仅是对快速拍照和视频片段感兴趣,还是要提供一种使用摄像头的新方式?对于快速拍照和摄像而言,可以考虑
。为了开发一种定制的摄像头功能,请查看
存储—— 应用程序产生的图像和视频是否期望仅对自身可见,还是可以共享——以便相册或其它媒体应用也能够使用?当应用程序被卸载后,还期望图像和视频可用么?请查看
一节来了解如何实现这些选项。
API或摄像头意图
,Android框架为图像和视频捕获提供支持。下面列出了有关的类:
此类是控制摄像头的主要API。在创建摄像头应用程序时,此类用于拍摄照片或视频。
此类用于向用户提供摄像头实时预览功能。
此类用于从摄像头录制视频。
动作类型为 或
的意图, 可在不直接使用对象的情况下捕获图像和视频。
开始开发摄像头API的应用之前,应该确保已经在manifest中正确声明了对摄像头的使用及其它相关的feature。
Camera权限——应用程序必须对请求摄像头的使用权限。
&uses-permission android:name
= &android.permission.CAMERA&
注意:如果是
来使用摄像头的,应用程序就不必请求本权限。
Camera Feature——应用程序必须同时声明对camera feature的使用,例如:
&uses-feature android:name
= &android.hardware.camera&
关于摄像头feature的清单,参阅manifest 。
在manifest中加入camera feature,将会使得Android Market在没有摄像头或不支持指定feature的设备上禁止安装该应用程序。关于Android Market基于feature过滤的使用详情,请参阅
如果应用程序可能用到摄像头或摄像头feature,但却不是必需的,则应在manifest中指定包含android:required 属性的feature,并将该属性设为false:
&uses-feature android:name
= &android.hardware.camera&
android:required =
&false& /&
存储权限——如果应用程序要把图像或视频保存到设备的外部存储上(SD卡),则还必须在&manifest中指定如下权限。
&uses-permission android:name
= &android.permission.WRITE_EXTERNAL_STORAGE&
录音权限——要用音频捕获来录音,应用程序必须请求音频捕获权限。
&uses-permission android:name
= &android.permission.RECORD_AUDIO&
有一种快捷的方法可以让应用程序不用额外编写很多代码就能实现拍照或摄像,这就是用意图
来调用内置的Android摄像头应用程序。摄像头intent会请求通过内置摄像应用来捕获图像或视频,并把控制权返回给应用程序。本节展示了如何用这种方法来捕获图像。
通常按以下步骤来提交一个摄像头intent:
构建一个摄像头Intent——用以下意图类型之一,创建一个请求图像或视频的 :
——向内置摄像头程序请求图像拍摄的intent action类型。
——向内置摄像头程序请求视频录制的intent action类型。
启动摄像头Intent——用
方法执行摄像头intent。启动完毕后摄像头应用的用户界面就会显示在屏幕上,用户就可以拍照或摄像了。 接收Intent结果——在应用程序中设置
方法,用于接收从摄像头intent返回的数据。当用户拍摄完毕后(或者取消操作),系统会调用此方法。
如果希望程序以最少的代码实现拍照功能,利用摄像头intent捕获图像是一条捷径。图像捕捉intent还可以包含以下附加信息:
——本设置需要一个
对象,用于指定存放图片的路径和文件名。本设置是可选项,但强烈建议使用。如果未指定本设置值,那么摄像应用将会把所请求的图片以默认文件名和路径进行保存,并将数据置入intent的
部分返回。
以下例子演示了如何构建并执行一个图像捕获intent。此例中的getOutputMediaFileUri() 方法引自中的例程代码。
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE=<span style="color:#0;
private Uri fileU
public void onCreate (Bundle& savedInstanceState){
& super.onCreate(savedInstanceState);
& setContentView(R.layout.main);
& //创建拍照 Intent并将控制权返回给调用的程序
& Intent intent =
new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
& fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
& //创建保存图片的文件
& intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
& //设置图片文件名
& //启动图像捕获Intent
& startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
方法执行完毕后,用户将看到内置摄像头应用程序的界面。用户拍照完毕(或取消操作)后,用户界面返回应用程序,这时必须截获
方法来接收intent的返回结果并执行后续操作。关于如何接收完整的intent,请参阅 。
如果希望程序以最少的代码实现摄像功能,利用摄像头intent捕获视频是一条捷径。视频捕捉intent可以包含以下附带信息:
——本设置需要一个
,用于指定保存视频的路径和文件名。本设置是可选项,但强烈建议使用。如果未指定本设置&#20540;,那么摄像应用将会把所请求的视频以默认文件名和路径进行保存,并将数据置入intent的
部分返回。 ——本&#20540;用0表示最低品质及最小的文件尺寸,用1表示最高品质和较大的文件尺寸。
——本&#20540;用于限制所捕获视频的长度,以秒为单位。
——本&#20540;用于限制所捕获视频的文件尺寸,以字节为单位。
以下例子演示了如何构建并执行一个视频捕获intent。本例中的getOutputMediaFileUri()方法引自
中的例程代码。
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE =<span style="color:#0;
private Uri fileU
public void onCreate(Bundle savedInstanceState){
& super.onCreate(savedInstanceState);
& setContentView(R.layout.main);
& //创建新的Intent
& intent new
Intent(MediaStore.ACTION_VIDEO_CAPTURE);
& fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);
& //创建保存视频的文件
& intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
& //设置视频文件名
& intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
& //设置视频的品质为高
& //启动视频捕获Intent
& startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
方法执行完毕后,用户将看到一个改动过的摄像程序界面。用户摄像完毕(或取消操作)后,用户界面返回应用程序,这时必须截获
方法来接收intent的返回结果并执行后续操作。关于如何接收完整的intent,请参阅下一节。
一旦已构建并运行了图像或视频的摄像头intent,应用程序就必须进行设置,以接收intent返回的结果。本节展示了如何
截获摄像头intent的回调方法,以便应用程序对捕获到的图片及视频进行进一步的处理。
要接收intent的返回结果,必须覆盖启动intent的activity中的 方法。以下例子演示了如何覆盖 来获取上述章节例程中的 或 的结果。
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE =
<span style="color:#0;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE =
<span style="color:#0;
@Override protected void
onActivityResult(int requestCode,
int resultCode,Intent data){
&& if (requestCode==CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
&&&&&& if (resultCode==RESULT_OK) {
&&&&&&&&&& //捕获的图像保存到Intent指定的fileUri
&&&&&&&&&& Toast..makeText(this,&Image saved to:\n&&#43;
&&&&&&& data.getData(),Toast.LENGTH_LONG).show();
& & & & else if (resultCode==RESULT_CANCELED) {
& & & && //用户取消了图像捕获
&&& else {
&&& //图像捕获失败,提示用户
&& if(requestCode==CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
&&&&& if (resultCode==RESULT_OK) {
&&&&& //捕获的视频保存到Intent指定的fileUri
&&&&& Toast.makeText(this,&Video saved to:\n& &#43;
&&&&&&& data.getData();
& & & & Toast.LENGTH_LONG).show();
& & & & else& if (resultCode == RESULT_CANCELED) {
& & & &//用户取消了视频捕获
&&&//视频捕获失败,提示用户
一旦activity接收到成功的结果,就说明捕获到的图像或视频已保存到指定位置了,应用程序就可对其进行访问。
有些开发人员可能需要自定义外观的摄像头用户界面,或者需要提供特殊的功能。相比
而言,创建定制的摄像activity需要编写更多的代码,不过也能向用户提供更吸引人的使用感受。
通常按照以下步骤创建一个定制的摄像界面:
检测并访问摄像头——创建代码以检查摄像头存在与否并请求访问。 创建预览类——创建继承自
接口的摄像预览类。此类能预览摄像的实时图像。 建立预览Preview Layout——一旦有了摄像预览类,即可创建一个view layout,用于把预览画面与设计好的用户界面控件融合在一起。
为捕获设置侦听器Listener——将用户界面控件连接到listener,使其能响应用户操作开始捕获图像或视频,比如按下按钮。
捕获并保存文件——建立捕获图片或视频并保存到输出文件的代码。 释放摄像头——摄像头使用完毕后,应用程序必须正确地将其释放,便于其它程序的使用。
摄像头硬件是一个共享资源,必须对其进行精心管理,因此需要使用它的应用程序之间不能发生冲突。下一节将会讨论如何检测摄像头硬件、如何请求访问摄像头、使用完毕如何释放。
警告:应用程序用完摄像头后,请记得调用
释放对象!如果某应用程序未能正确释放摄像头,所有后续访问摄像头的尝试(包括此应用程序自身)都将会失败,并可能导致程序被强行关闭。
如果应用程序未利用manifest声明对摄像头需求进行特别指明,则应该在运行时检查一下摄像头是否可用。可用
方法来进行这种检查,代码示例如下:
private & boolean &checkCameraHardware(Context& context) {
& & if &(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))& {
& & & &//摄像头存在
& & & &//摄像头不存在
& & & &return &
Android设备可能拥有多个摄像头,比如后置摄像头用于拍照、前置摄像头用于摄像。Android 2.3 (API Level 9)以上版本允许利用 方法来检查设备可用摄像头的数量。
如果在运行程序的设备上已经检测到了摄像头,则必须通过获取一个 的实例来请求对其访问(除非使用了 )。
可用方法来访问主摄像头,并确保捕获全部的异常,示例代码如下:
public & static&Camera& getCameraInstance(){
Camera&c=null;
& & & & c=Camera.open();//试图获取Camera实例
& & catch(Exceptione){
& & & &//摄像头不可用(正被占用或不存在)
& & returnc;//不可用则返回null
警告:每次使用时都要检查异常。如果摄像头被占用或者不存在,未检查异常将会导致应用程序被系统强行关闭。
在运行Android & 2.3 (API & Level & 9)以上版本的设备上,可以用 访问指定的摄像头。在拥有多于一个摄像头的设备上,以上示例代码将会访问第一个也即朝后的那个摄像头。
一旦获得了摄像头的访问权,就可以通过 方法来获取更多信息,检查返回的 对象可查看摄像头所支持的feature。如果正在使用API & Level & 9以上版本,可用 来确定摄像头朝前还是朝后以及图像的方向。
为了方便拍照或摄像,用户必须能看到摄像头所拍摄的画面。摄像头预览类就是一种能够显示摄像头实时数据的 ,用户可以调整并捕获图片和视频。
以下示例代码演示了如何创建一个基本的摄像头预览类,它可被嵌入一个 布局中。为了截获view创建和销毁时的回调事件,此类实现了 ,这在指定摄像头预览的输入时需要用到。
public & class &
CameraPreview extends&SurfaceView&implements&
SurfaceHolder.Callback{
& & private&SurfaceHolder& mH
& & private&Camera & mC
& & public&CameraPreview & Context & context,Camera& camera &{
& & & &super&(context);
& & & & mCamera =
& & & &// 安装一个SurfaceHolder.Callback,
& & & &// 这样创建和销毁底层surface时能够获得通知。
& & & & mHolder = getHolder();
& & & & mHolder.addCallback(this);
& & & &//已过期的设置,但版本低于3.0的Android还需要用到。
& & & & mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
& & public&void& surfaceCreated(
SurfaceHolder & holder)&{
& & & &// surface已被创建,现在把预览画面的位置通知摄像头
& & & &try&{
& & & & & & mCamera.setPreviewDisplay(holder);
& & & & & & mCamera.startPreview();
& & & &}catch & (IOException & e)&{
& & & & & &Log.d(TAG,
&Error setting camera preview: && &#43; & e.getMessage());
& & public & void& surfaceDestroyed(SurfaceHolderholder){
& & & &//空代码。注意在activity中释放摄像头预览对象
& &public & void& surfaceChanged &(SurfaceHolder& holder,
int& format,int& w,int&h) {
& & & &// 如果预览无法更改或旋转,注意此处的事件
& & & &// 确保在缩放或重排时停止预览
& & & &if &(mHolder.getSurface()==null){
& & & & &// 预览surface不存在
& & & & &return;
& & & &// 更改时停止预览
& & & &try{
& & & & & & mCamera.stopPreview();
& & & &}catch(Exception& e){
& & & & &// 忽略:试图停止不存在的预览
& & & &// 在此进行缩放、旋转和重新组织&#26684;式
& & & &// 以新的设置启动预览
& & & &try{
& & & & & & mCamera.setPreviewDisplay(mHolder);
& & & & & & mCamera.startPreview();
& & & &}catch(Exception & e){
& & & & & & Log.d(TAG,
&Error starting camera preview: &&#43;e.getMessage());
上节例程所述的摄像预览类必须被放入一个activity的layout中,连同其它用户界面控件一起,实现拍照或摄像功能。本节展示了如何为预览创建一个简单的layout和activity。
以下layout代码提供了一个非常简单的view,用于显示一个摄像预览画面。在此例中,元素用于容纳摄像预览类。利用此类layout,可以把附加的图片信息或控件叠加到实时预览画面上。
&?xml version=&1.0&
encoding=&utf-8&?&&
&LinearLayoutxmlns:android=&/apk/res/android&&
& & android:orientation=&horizontal&&
& & android:layout_width=&fill_parent&&
& & android:layout_height=&fill_parent&&
& &FrameLayout&
& & android:id=&@&#43;id/camera_preview&&
& & android:layout_width=&fill_parent&&
& & android:layout_height=&fill_parent&&
& & android:layout_weight=&1&&
& &Button&
& & android:id=&@&#43;id/button_capture&&
& & android:text=&Capture&&
& & android:layout_width=&wrap_content&&
& & android:layout_height=&wrap_content&&
& & android:layout_gravity=&center&&
&/LinearLayout&
在大多数设备上,缺省的摄像预览方向是横向的。此例中的layout指定了横向(landscape)布局,下面的代码还把应用程序的方向也改为了横向。为了简化摄像预览画面的刷新,应该在manifest中增加如下内容,把应用程序的预览activity也改为横向显示。
&activityandroid:name=&.CameraActivity&&
& & & & & android:label=&@string/app_name&&
& & & & & android:screenOrientation=&landscape&&&
&& &!-- configure this activity to use landscape orientation --&&
&& &intent-filter&&
& & & & &actionandroid:name=&android.intent.action.MAIN&/&&
& & & & &categoryandroid:name=&android.intent.category.LAUNCHER&/&&
& & &/intent-filter&&
&/activity&
注意:摄像预览画面并不是一定要横向显示。自Android 2.2 (API Level 8)
开始,可以利用方法来旋转预览画面。为了让预览方向跟随手机方向的变化而改变,可以在预览类的方法中实现,先用停止预览,改变方向后再用开启预览。
在摄像view 的activity中,请把预览类添加到上述的元素中。当摄像头暂停使用或者关闭时,摄像activity还必须确保将其释放。以下例子展示了如何修改摄像activity,加入所述的预览类。
publicclassCameraActivityextendsActivity{&
& & privateCamera
& & privateCameraPreview
mPreview;&
&& & @Override&
& & publicvoid
onCreate(Bundle
savedInstanceState){&
& & & & super.onCreate(savedInstanceState);&
& & & & setContentView(R.layout.main);&
& & & & //
创建Camera实例&
& & & & mCamera = getCameraInstance();&
& & & & //
创建Preview view并将其设为activity中的内容
& & & & mPreview =newCameraPreview(this,
mCamera);&
& & & & FrameLayout
preview =(FrameLayout)
findViewById(id.camera_preview);&
& & & & preview.addView(mPreview);&
注意:上例中的getCameraInstance()方法引用了中的方法示例。
一旦创建了预览类和显示它的view layout,就可以开始在程序中捕获图片了。必须在程序代码中为用户界面控件设置listener,使其可响应用户操作进行拍照。
可以通过方法来获取图片,此方法用到三个参数并从摄像头接收数据。如果要以JPEG的&#26684;式接收数据,必须实现接口,以接收图片数据并写入文件。以下代码展示了接口的简单例子,实现了从摄像头接收图片并保存。
privatePictureCallback
mPicture =newPictureCallback(){&
& & @Override&
& & publicvoid
onPictureTaken(byte[]
data,Camera camera){&
& & & & File
pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);&
& & & & if(pictureFile
& & & & & &
Log.d(TAG,&Error creating media file, check storage permissions: &&#43;&
& & & & & & & & e.getMessage());&
& & & & & &
& & & & }&
& & & & try{&
& & & & & &
FileOutputStream fos =newFileOutputStream(pictureFile);&
& & & & & & fos.write(data);&
& & & & & & fos.close();&
& & & & }catch(FileNotFoundException
& & & & & &
Log.d(TAG,&File not found: &&#43;
e.getMessage());&
& & & & }catch(IOException
& & & & & &
Log.d(TAG,&Error accessing file: &&#43;
e.getMessage());&
& & & & }&
通过调用方法,触发器捕获了一张图片。以下例程展示了如何在按钮的中调用此方法。
// 在Capture按钮中加入listener&
Button captureButton =(Button)
findViewById(id.button_capture);&
& & captureButton.setOnClickListener(&
& & & & newView.OnClickListener(){&
& & & & @Override&
& & & & publicvoid
onClick(View v){&
& & & & & &
// 从摄像头获取图片
& & & & & & mCamera.takePicture(null,null,
mPicture);&
& & & & }&
注意:下文例程中的mPicture成员将会引用上述代码。
警告:当应用程序使用完摄像头之后,请记得调用释放对象!关于如何释放摄像头的详情,请参阅。
Android框架的视频捕捉需要对对象进行仔细的管理,还要与类一起协同工作。使用录制视频时,必须管理好与的调用,使得能够顺利访问摄像头硬件,并且还要进行和调用。
注意:自Android 4.0 (API level 14)
开始,和调用由系统自动管理。
与用摄像头拍照不同,视频捕获必需十分精确地按顺序进行调用。必须按照特定的顺序来执行,应用程序才能成功地准备并捕获视频,详细步骤如下。
打开摄像头——用
来获得一个camera对象的实例。 连接预览——用
将camera连接到一个
,准备实时预览。 开始预览——调用
开始录制视频 严&#26684;按照以下顺序执行才能成功录制视频:
解锁——调用
解锁,便于
使用摄像头。 配置——按照如下顺序调用
中的方法。详情请参阅
参考文档。
——用当前
实例将摄像头用途设置为视频捕捉。
设置音频源。 ——用
设置视频源。 设置视频输出&#26684;式和编码&#26684;式。对于Android 2.2 (API Level 8) 以上版本,使用 来获取一个profile实例。对于Android prior to 2.2以上版本,必须设置视频输出&#26684;式和编码参数:
——设置输出&#26684;式,指定缺省设置或
。 ——设置声音编码类型。指定缺省设置或
。 —— 设置视频编码类型,指定缺省设置或者
——用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()设置输出文件,见
一节中的方法示例。 ——用上面连接预览中设置的对象来指定应用程序的
预览layout元素。
警告:必须按照如下顺序调用
的下列配置方法。否则应用程序将会引发错误,录像也将失败。
准备MediaRecorder——调用 设置配置,准备好 。 启动MediaRecorder——调用 开始录制视频。
停止录制视频——按照顺序调用以下方法,才能成功完成视频录制:
停止MediaRecorder ——调用 停止录制视频。 重置MediaRecorder——这是可选步骤,调用 删除recorder中的配置信息。 释放MediaRecorder——调用 释放 。 锁定摄像头—— 用 锁定摄像头,使得以后 session能够再次使用它。自Android 4.0 (API level 14)开始,不再需要本调用了,除非 调用失败。
停止预览——activity使用完摄像头后,应该用 停止预览。 释放摄像头—— 使用 释放摄像头,使其它应用程序可以使用它。
注意:也可以不必先创建摄像头预览就使用
,并跳过本节开始的几步。不过,因为用户一般都希望在开始录像前看到预览画面,这里就不讨论那类过程了。
MediaRecorder
在使用类进行录像时,必须先按照特定顺序进行配置,然后调用方法检查并执行这些配置。以下例程演示了如何为录像正确配置并准备类。
privateboolean
prepareVideoRecorder(){&
& & mCamera = getCameraInstance();&
& & mMediaRecorder =newMediaRecorder();&
第<span style="color:#步:解锁并将摄像头指向MediaRecorder
& & mCamera.unlock();&
& & mMediaRecorder.setCamera(mCamera);&
第<span style="color:#步:指定源
& & mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);&
& & mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);&
第<span style="color:#步:指定CamcorderProfile(需要API Level 8以上版本)
& & mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));&
第<span style="color:#步:指定输出文件
& & mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());&
第<span style="color:#步:指定预览输出
& & mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());&
第<span style="color:#步:根据以上配置准备MediaRecorder&
& & & & mMediaRecorder.prepare();&
& & }catch(IllegalStateException
& & & & Log.d(TAG,&IllegalStateException preparing MediaRecorder: &&#43;
e.getMessage());&
& & & & releaseMediaRecorder();&
& & & & returnfalse;&
& & }catch(IOException
& & & & Log.d(TAG,&IOException preparing MediaRecorder: &&#43;
e.getMessage());&
& & & & releaseMediaRecorder();&
& & & & returnfalse;&
& & returntrue;&
如果是Android 2.2 (API Level 8) 之前的版本,则必须直接指定输出&#26684;式和编码&#26684;式,而不是使用。以下代码演示了这种方式:
第<span style="color:#步:设置输出&#26684;式和编码&#26684;式(针对低于API Level 8版本)
& & mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);&
& & mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);&
& & mMediaRecorder.setVideoEncoder(MediaRecorder.
VideoEncoder.DEFAULT);
中以下有关视频录制的参数都给出了缺省&#20540;,当然也可以在应用程序中修改这些设置:
开始和停止MediaRecorder
使用类开始和停止视频录制时,必须遵循以下特定顺序。
用 解锁摄像头 如上代码所示配置
用 开始录制 记录视频 用 停止录制 用 释放media recorder 用锁定摄像头
以下例程演示了如何触发按钮并用camera和类正确地开始和停止视频录制。
注意:视频录制完毕后请不要释放camera,否则预览将会停止。
privateboolean
isRecording =false;&
// 为Capture按钮加入listener
Button captureButton =(Button)
findViewById(id.button_capture);&
captureButton.setOnClickListener(&
& & newView.OnClickListener(){&
& & & & @Override&
& & & & publicvoid
onClick(View v){&
& & & & & &
if(isRecording){&
& & & & & & & &
// 停止录像并释放camera&
& & & & & & & & mMediaRecorder.stop();
& & & & & & & & releaseMediaRecorder();//
释放MediaRecorder对象
& & & & & & & & mCamera.lock();
& & & & //
将控制权从MediaRecorder&交回camera
& & & & & & & &
// 通知用户录像已停止
& & & & & & & & setCaptureButtonText(&Capture&);&
& & & & & & & & isRecording
& & & & & & }else{&
& & & & & & & &
// 初始化视频camera&
& & & & & & & &
if(prepareVideoRecorder()){&
& & & & & & & & & &
// Camera已可用并解锁,MediaRecorder已就绪,
& & & & & & & & & &
// 现在可以开始录像
& & & & & & & & & & mMediaRecorder.start();&
& & & & & & & & & &
// 通知用户录像已开始
& & & & & & & & & & setCaptureButtonText(&Stop&);&
& & & & & & & & & & isRecording
& & & & & & & & }else{&
& & & & & & & & & &
// 准备未能完成,释放camera&
& & & & & & & & & & releaseMediaRecorder();&
& & & & & & & & & &
// 通知用户
& & & & & & & & }&
& & & & & & }&
& & & & }&
注意:在上例中,prepareVideoRecorder()方法引用了.中的示例代码。此方法实现了锁定camera、配置和准备实例。
摄像头是设备上所有应用程序共享使用的资源。应用程序可以在获得实例后使用摄像头,停止使用后请务必注意释放摄像头对象,应用程序暂停时()也是如此。如果某应用程序未能正确地释放摄像头,则所有后续访问摄像头的尝试(包括该应用程序自身)都将会失败,并可能导致应用程序被强行关闭。
用方法可以释放对象的实例,代码示例如下。
publicclassCameraActivityextendsActivity{&
& & privateCamera
& & privateSurfaceView
mPreview;&
& & privateMediaRecorder
mMediaRecorder;&
& &protected & void& onPause(){
& & & &super.onPause();&
& & & & releaseMediaRecorder();//
如果正在使用MediaRecorder,首先需要释放它。
& & & & releaseCamera(); & & & &
// 在暂停事件中立即释放摄像头
& & privatevoid
releaseMediaRecorder(){&
& & & & if(mMediaRecorder
& & & & & & mMediaRecorder.reset();
清除recorder配置
& & & & & & mMediaRecorder.release();//
释放recorder对象
& & & & & & mMediaRecorder =null;&
& & & & & & mCamera.lock();
& & & & & //
为后续使用锁定摄像头
& & & & }&
& & privatevoid
releaseCamera(){&
& & & & if(mCamera
& & & & & & mCamera.release();
为其它应用释放摄像头
& & & & & & mCamera =null;&
& & & & }&
警告:如果某应用程序未能正确释放摄像头,所有后续访问摄像头的尝试(包括该应用程序自身)都将会失败,并可能会导致应用程序被强行关闭。
诸如图片和视频这些由用户创建的媒体文件,应该保存到设备外部存储的目录中(SD卡)去,以节省系统空间,并使用户离开设备时也能访问这些文件。设备上有很多可用于存储媒体文件的目录,但作为开发人员只应考虑两个标准的位置:
()——本方法返回标准的、共享的、系统建议的存放位置,用于存放图片和视频文件。本目录是共享的(public),因此其它应用程序可以很容易地查找、读取、修改、删除存于此处的文件。即使应用程序被用户卸载,存于此处的媒体文件也不会被删除。为了避免与已有的图片和视频相冲突,应该在此目录下为自己的媒体文件创建一个子目录,如下代码所示。本方法自Android
2.2 (API Level 8) 起启用,更早API版本的也有类&#20284;的调用,请参阅。
()——本方法返回一个标准的、用于存放图片和视频的位置,该存放位置与应用程序相关联。如果应用程序被卸载,则存于此处的文件将会被删除。对存于此处的文件不会增加访问权限控制,其它应用程序也可以读取、修改、删除文件。
以下例程演示了如何为媒体文件创建一个或存放位置,通过调用摄像头时可以使用该文件,时也可以使用它。
publicstaticfinalint
MEDIA_TYPE_IMAGE =<span style="color:#;&
publicstaticfinalint
MEDIA_TYPE_VIDEO =<span style="color:#;&
privatestaticUri
getOutputMediaFileUri(int
& & & returnUri.fromFile(getOutputMediaFile(type));&
privatestaticUri
getOutputMediaFile(int
安全起见,在使用前应该
用Environment.getExternalStorageState()检查SD卡是否已装入
& & File mediaStorageDir
=newFile(Environment.getExternalStoragePublicDirectory(&
& & & & & & &
Environment.DIRECTORY_PICTURES),&MyCameraApp&);&
// 如果期望图片在应用程序卸载后还存在、且能被其它应用程序共享,
// 则此保存位置最合适
如果不存在的话,则创建存储目录
mediaStorageDir.exists()){&
& & & & if(!
mediaStorageDir.mkdirs()){&
& & & & & &
Log.d(&MyCameraApp&,&failed to create directory&);&
& & & & & &
returnnull;&
& & & & }&
创建媒体文件名
& & String timeStamp
=newSimpleDateFormat(&yyyyMMdd_HHmmss&).format(newDate());&
& & File mediaFile;&
& & if(type
== MEDIA_TYPE_IMAGE){&
& & & & mediaFile =newFile(mediaStorageDir.getPath()&#43;File.separator
& & & & &IMG_&&#43;
timeStamp &#43;&.jpg&);&
& & }elseif(type
== MEDIA_TYPE_VIDEO){&
& & & & mediaFile =newFile(mediaStorageDir.getPath()&#43;File.separator
& & & & &VID_&&#43;
timeStamp &#43;&.mp4&);&
& & }else{&
& & & & returnnull;&
& & return mediaFile;&
注意:自Android
2.2 (API Level 8) 版本启用。如果目标设备使用较早期版本的Android,请用代替。详情请参阅。
关于在Android设备上保存文件的详细信息,请参阅
原文地址:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:80081次
排名:千里之外
原创:12篇
转载:15篇
评论:15条
(1)(3)(2)(1)(1)(3)(9)(7)

我要回帖

更多关于 iphone5 摄像头问题 的文章

 

随机推荐