1、创建一个空的工程,注意声明下列权限:

  1. <uses-permission android:name="android.permission.CAMERA"/>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2、布局文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6.  
  7. <SurfaceView
  8. android:id="@+id/surfaceView"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"/>
  11. </FrameLayout>

很简单,就放了一个SurfaceView用来显示视频图像。

3、初始化摄像头

  1. private void initCamera()
  2. {
  3. camera = Camera.open();
  4. }

通过Camera的open方法开启摄像头,open方法还有一个重载方法,主要用于告诉系统我要打开哪个摄像头,现在手机一般都是两个摄像头以上。默认打开的是后置摄像头。

4、释放摄像头

  1. private void releaseCamera()
  2. {
  3. if (camera != null)
  4. {
  5. // 释放前先停止预览
  6. camera.setPreviewCallback(null);
  7. camera.stopPreview();
  8. camera.release();
  9. camera = null;
  10. }
  11. }

上面是几个比较重要的方法,下面是整个Activity的代码:

  1. public class MainActivity extends AppCompatActivity
  2. {
  3. private Camera camera;
  4. private SurfaceView surfaceView;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState)
  8. {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11.  
  12. surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
  13. }
  14.  
  15. @Override
  16. protected void onStart()
  17. {
  18. super.onStart();
  19. initCamera();
  20. surfaceView.getHolder().addCallback(new SurfaceHolder.Callback()
  21. {
  22. @Override
  23. public void surfaceCreated(SurfaceHolder holder)
  24. {
  25. holder.removeCallback(this);
  26. try
  27. {
  28. camera.setPreviewDisplay(holder);
  29. camera.startPreview();
  30. }
  31. catch (IOException e)
  32. {
  33. e.printStackTrace();
  34. }
  35. }
  36.  
  37. @Override
  38. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
  39. {
  40.  
  41. }
  42.  
  43. @Override
  44. public void surfaceDestroyed(SurfaceHolder holder)
  45. {
  46.  
  47. }
  48. });
  49. }
  50.  
  51. @Override
  52. protected void onStop()
  53. {
  54. super.onStop();
  55. releaseCamera();
  56. }
  57.  
  58. private void initCamera()
  59. {
  60. camera = Camera.open();
  61. }
  62.  
  63. private void releaseCamera()
  64. {
  65. if (camera != null)
  66. {
  67. // 释放前先停止预览
  68. camera.setPreviewCallback(null);
  69. camera.stopPreview();
  70. camera.release();
  71. camera = null;
  72. }
  73. }
  74. }

值得一提的是,需要在SurfaceViewHolder创建之后,才能调用Camera的startPreview方法,否则视频图像是不会显示到SurfaceView中去的。

本篇文章DEMO下载

Android视频录制从不入门到入门系列教程(二)————显示视频图像的更多相关文章

  1. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

  2. Android视频录制从不入门到入门系列教程(三)————视频方向

    运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子 ...

  3. 办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时)

    办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时) 乔布斯的成功离不开美轮美奂的幻灯片效果,一个成功的商务人士.部门经理也少不了各种各样的PPT幻灯片.绿色资源网给你提供了 ...

  4. [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world

    [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...

  5. [大数据从入门到放弃系列教程]第一个spark分析程序

    [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...

  6. Android Studio系列教程二--基本设置与运行

    Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...

  7. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  9. NGUI系列教程二

    接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...

随机推荐

  1. 『动态』动态JSON万能转换函数 + .Net40 dynamic动态数据绑定

    不废话,调用代码: static void Main(string[] args) { string json = File.ReadAllText("2.txt", Encodi ...

  2. [Linux] host dig nslookup查询域名的DNS解析

    root@VM-38-204-ubuntu:~# host baidu.com baidu.com has address 220.181.57.216 baidu.com has address 1 ...

  3. Oracle 连接查询

    1.什么是连接查询?(B) 很多时候我们需要查询的数据并不是来源于同一张表,而是来源于多张表,而这种一个查询需要对多张表进行操作,就成为连接查询. 2.如何进行表的连接查询? 连接查询有两种方式:SQ ...

  4. 微服务容错限流Hystrix入门

    为什么需要容错限流 复杂分布式系统通常有很多依赖,如果一个应用不能对来自依赖 故障进行隔离,那么应用本身就处在被拖垮的风险中.在一个高流量的网站中,某个单一后端一旦发生延迟,将会在数秒内导致 所有应用 ...

  5. ubuntu安装mysql没有让我设置密码

    终端输入: sudo cat /etc/mysql/debian.cnf显示内容:# Automatically generated for Debian scripts. DO NOT TOUCH! ...

  6. lunix脚本进程挂掉时显示cpu和内存信息及挂掉的时间

    #!/bin/shwhile [ true ]; do #查询是否有8899正在运行的进程netstat -an|grep 8899if [ $? -ne 0 ]thennowtime=$(date ...

  7. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  8. 【死磕 Spring】----- IOC 之 获取验证模型

    原文出自:http://cmsblogs.com 在上篇博客[死磕Spring]----- IOC 之 加载 Bean 中提到,在核心逻辑方法 doLoadBeanDefinitions()中主要是做 ...

  9. 微信小程序开发笔记

    前言: 因为前段时间一直在做关于微信小程序方面的项目,作为一名后端的攻城狮而言做一些简单的前端页面数据操作和管理还是比较容易快上手的,当然前提是要理解微信小程序的基本语法和请求原理.该篇博客主要记录的 ...

  10. python --- 二分查找算法

    二分查找法:在我的理解中这个查找方法为什么会叫二分呢,我认为是将要查询的一个列表分成了两份,然后在利用某个值来进行比较,在一个不断循环的过程中来找出我们要找的某一个值. 废话不多说,先上代码: def ...