在第二个Activity中,我们要显示摄像头预览的视频,布局文件很简单,就一个SurfaceView组件,设置为占满整个父组件(这里不再给出),用来显示预览的视频。
在对应的Activity文件中,要获取SurfaceView的SurfaceHolder,并为其添加一个回调监听器,该监听器传入一个Callback实例,这里需要覆写Callback实例中的三个方法,分别是:
public void surfaceCreated(SurfaceHolder holder)方法,当打开摄像头时,该方法被回调;
public void surfaceChanged(SurfaceHolder holder)方法,当SurfaceView预览界面的格式或大小发生改变时,该方法被回调;
public void surfaceDestroyed(SurfaceHolder holder)方法,当SurfaceView被销毁时,该方法被回调;
在surfaceCreated方法中通过私有方法initCreama()对摄像头各项参数进行初始化,主要是设置预览视频的尺寸,每秒显示的帧数等,设置完参数后,通过setParameters(Camera.Parameters parameters)方法显示取景画面,即预览视频。在开始预览前,调用setPreviewCallback(PreviewCallback
cb)方法来获取采集到的预览视频流数据,从而可以对其进行处理,这一点将在下篇中详细讲解。在开始预览之后,还要设置自动对焦,不然摄像头采集到的图像不清晰。
另外,这里有两点需要注意:
1、每台手机的摄像头所支持的图像预览或拍摄尺寸不尽相同,如果设置的图像尺寸,摄像头不支持,则会出错,因此在真机上测试前,先要确定摄像头支持哪些尺寸,具体的方法很简单,这里不再给出,需要了解的可以参考这篇文章:http://blog.csdn.net/yanzi1225627/article/details/7738736;
2、要编写横竖屏镜头自动调整的代码,否则预览的图像将是左右颠倒的。
该文件详细代码如下:
package zyb.org.camera;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class CameraActivity extends Activity {
private SurfaceView sView = null;
private String ipName = null;
private SurfaceHolder sHolder = null;
private int screenWidth;
private int screenHeight;
private Camera camera = null;
private boolean isPreview = false;
public Camera getCamera() {
return camera;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
//从上个Activity中获取传递过来的数据
Intent intent = getIntent();
ipName = intent.getStringExtra("ipname");
//获取屏幕的宽和高
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
sView = (SurfaceView)findViewById(R.id.sView);
sHolder = sView.getHolder();
sHolder.addCallback(new Callback() {
//释放camera时,回调该方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera != null){
camera.setPreviewCallback(null);
if(isPreview)
camera.stopPreview();
camera.release();
camera = null;
}
}
//打开摄像头时,回调该方法
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
});
}
/**
* 初始化摄像头各参数
* */
private void initCamera(){
if(!isPreview)
camera = Camera.open();
if(camera!=null && !isPreview){
try {
Camera.Parameters parameters = camera.getParameters();
//每台手机的摄像头所支持的图像预览或拍摄尺寸不尽相同,
//如果设置的图像尺寸,摄像头不支持,则会出错,
//因此在真机上测试前,先要确定摄像头支持哪些尺寸
parameters.setPreviewSize(screenWidth, screenHeight); //设置预览图像的尺寸大小
parameters.setPreviewFpsRange(10, 20); //设置每秒显示10-20帧
// 横竖屏镜头自动调整
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){
parameters.set("orientation", "portrait");
parameters.set("rotation", 90); // 镜头角度转90度(默认摄像头是横拍)
camera.setDisplayOrientation(90); // 在2.2以上可以使用
} else{
// 如果是横屏
parameters.set("orientation", "landscape");
camera.setDisplayOrientation(0); // 在2.2以上可以使用
}
camera.setPreviewDisplay(sHolder); //通过SurfaceView显示取景画面
//回调处理预览视频流类中的onPreviewFrame方法
//在onPreviewFrame方法中,启动发送视频流的线程
camera.setPreviewCallback(new ViedoStream(ipName,CameraActivity.this));
camera.startPreview(); //开始预览
camera.autoFocus(null); //自动对焦
} catch (IOException e) {
e.printStackTrace();
}
isPreview = true;
}
}
}
下篇将讲述后台线程发送预览帧视频的操作
分享到:
相关推荐
Android SurfaceView 实现实时显示摄像头视频,详见博客:https://blog.csdn.net/qq_30297763/article/details/90241102
双SurfaceView实现手机摄像头预览、监听每一帧做处理绘制浮层效果(Demo画了一个矩形上去)
是在320*320屏幕,mdpi上的调用摄像头预览
Android SurfaceView 实现实时显示摄像头视频,详见博客:https://blog.csdn.net/qq_30297763/article/details/90241102
Android 外接基于UVC协议的摄像头并实现预览 demo
支持USB摄像头的android代码,UVC协议谁信那个头,USBCamera多摄像头同时预览打开。 可以复用里面的代码进行更多的摄像头打开,只要带宽足够,可以打开多个。 测试环境: macOS Catalina 版本10.15.7 Android Studio...
代码可直接运行,实现部分手机前后摄像头同时预览,目前测试仅支持红米3S,乐视2。
我自己写的Android CameraX Demo,实现了预览/拍照/录制视频/图片分析/对焦/切换摄像头等操作。 具体详见我的博客 : https://blog.csdn.net/EthanCo/article/details/125603671
自己封装的一个工具jar包,可以打开Android的相机进行预览,并且展示预览的控件也自定义了,api调用规则非常简单,有个缺点不能更换前后摄像头,不过可以自行的选择打开前置还是后置。
AndroidUsb摄像头,读取外界摄像头,支持实时预览,拍照,录像,录音。
androidstudio工程使用海康公开的sdk开发查看监控视频画面,手机听过监控的ip与端口,使用用户名密码查看监控视频,实时预览与拍照
A40I android7.1 4路视频同时预览,其中两路模拟AHD输入,两路自带的tvin输入,可以实现同时预览
Android应用源码之手机实时视频监控项目
Android端海康视频取流,可以实时预览与查看历史录像
Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频); UI:三个按钮 预览 摄像 图片保存,预览界面 可以显示(矩形和圆形等图画)
在浏览器输入手机IP就可以实现用手机进行视频监控
用texturreview实现摄像头预览和拍照,能够自动对焦,按钮有点挫,可以改为Relativelayout然后就好看一些
Android 视频抽帧示例程序 也可参见 https://github.com/longtaoge/ViedioTest
基于Socket的Android手机视频实时传输,实现手机和电脑的视频传输。
Android 摄像头视频录制例子