package com.bw.videorecorder;

import java.io.File;
import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

private SurfaceView surfaceView;
private RelativeLayout layout;
private Button recordbutton;
private Button stopbutton;
private MediaRecorder mediaRecorder;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//请求窗口的标题 为无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//要求窗口全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_main);

surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
//设置参数 类型 把数据推送到前方显示出来
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置分辨率
surfaceView.getHolder().setFixedSize(176, 144);
//要求屏幕常量不要锁屏
surfaceView.getHolder().setKeepScreenOn(true);
//找到相对布局
layout = (RelativeLayout) findViewById(R.id.layout);
recordbutton = (Button) findViewById(R.id.recordbutton);
stopbutton = (Button) findViewById(R.id.stopbutton);

}
//当用户触摸屏幕时,显示按钮
@Override
public boolean onTouchEvent(MotionEvent event) {
//当用户触摸按下时
if (event.getAction()==MotionEvent.ACTION_DOWN) {
//将相对布局设置为可见
layout.setVisibility(ViewGroup.VISIBLE);
}
return super.onTouchEvent(event);
}
public void record(View v){
switch (v.getId()) {
case R.id.recordbutton:
try {
File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");
mediaRecorder = new MediaRecorder();
//设置声音的来源,来源于麦克风
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置视频的来源 来源于摄像头
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//设置输出格式 3g格式 MP4
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置视频大小
mediaRecorder.setVideoSize(320, 240);
//设置捕获画面速率 5帧清晰 3帧不清晰
mediaRecorder.setVideoFrameRate(3);
//设置声音编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

//设置视频编码
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//设置输出路径
mediaRecorder.setOutputFile(file.getAbsolutePath());
//把预览画面输送到屏幕上
mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
//缓冲
mediaRecorder.prepare();
//开始录制
mediaRecorder.start();

//当点击刻录时,停止可以点击
recordbutton.setEnabled(false);
stopbutton.setEnabled(true);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case R.id.stopbutton:
if (mediaRecorder!=null) {
//停止
mediaRecorder.stop();
//释放
mediaRecorder.release();
mediaRecorder=null;
}

//当点击停止时,刻录可以点击
recordbutton.setEnabled(true);
stopbutton.setEnabled(false);
break;

default:
break;
}

}

}

//-------------------Xml布局-----------------------------

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<SurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceView"/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layout"
android:visibility="gone"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/recordbutton"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="10dp"
android:text="@string/recordbutton"
android:onClick="record"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/stopbutton"
android:layout_toLeftOf="@+id/recordbutton"
android:layout_alignTop="@+id/recordbutton"
android:layout_marginRight="30dp"
android:text="@string/stopdbutton"
android:onClick="record"/>
</RelativeLayout>

</FrameLayout>

//--------------------values 下的 string----------------------

//添加

<string name="recordbutton">刻录</string>
<string name="stopdbutton">停止</string>

//------------权限-----------------------

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

视频录制SurfaceView的更多相关文章

  1. Android音视频之MediaRecorder音视频录制

    前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...

  2. Android多媒体录制--MediaRecorder视频录制

    Android使用MediaRecorder类进行视频的录制. 需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1.设置视频源, ...

  3. Android 中使用MediaRecorder进行录像详解(视频录制)

    在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. package com.video; import java.io.IOException; import android.ap ...

  4. Android实现视频录制

    安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder. 每种方法都有自己的优缺点.接下来,把两种方法的代码写出来. 先说第一种方法,也是最简单的方法,那就是直接 ...

  5. Android视频录制从不入门到入门系列教程(四)————Camera Parameter

    Camera提供了一个叫做setParameters的方法帮助开发者设置相机的相关参数. 通过Camera的getParameters方法可以获取到当前为相机设置的相关参数. 下面简单介绍下,视频录制 ...

  6. Android 音视频开发(七): 音视频录制流程总结

    在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...

  7. Android开发笔记——视频录制播放常见问题

    本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...

  8. Android使用MediaRecorder和Camera实现视频录制及播放功能整理

    转载请注明出处:http://blog.csdn.net/woshizisezise/article/details/51878566 这两天产品经理向我丢来一个新需求,需要在项目里添加一个视频录制的 ...

  9. Android 开发 MediaRecorder视频录制入门

    前言 MediaRecorder是Android SDK提供用于录制音视频,关于音频的录制在我另一篇博客里已经介绍.传送门: https://www.cnblogs.com/guanxinjing/p ...

随机推荐

  1. 在线用户管理--ESFramework 4.0 进阶(05)

    无论我们采用何种通信框架来构建我们的分布式系统,在服务端进行用户管理都是非常重要的一个环节.然而用户管理是否应该隶属于通信框架了?这个并不一定,通常来说,用户管理是与具体应用紧密相关的,应该是由应用解 ...

  2. PHP7新功能及语法变化总结

    1.标量类型声明有两种模式: 强制 (默认) 和 严格模式. 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔 ...

  3. TortoiseGit - 版本回退

    1.show log 2.点击左上角的master,选择远程的master分支 3.右击需要回退到的目标点,选择 Reset "master" to this ... 选择 Har ...

  4. iostransitiontranslate闪屏问题总结

    webkit在绘制页面时会将结构分为各种层,当层足够大时就会变成很大的平铺层.这样一来webkit在每次页面结构发生变化时不需要都渲染整个页面而是渲染对应层了,这对渲染速度来说相当的重要.webkit ...

  5. Openjudge-计算概论(A)-过滤多余的空格

    描述: 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格. 输入一行,一个字符串(长度不超过200),句子的头和尾都没有空格.输出过滤之后的句子. 样例输入 Hello world.Th ...

  6. JQ和其他框架一起使用方法

    时下,越来越多的javascripe框架不断崛起,同时开源网站系统也之间增多.网站建设过程中当使用一些开源的网站程序时,免不了会在javascript上产生冲突.也许网站的开发者习惯使用jQuery, ...

  7. 笨方法学python--提示别人

    1 上次学到使用raw_input(), 还可以如下使用: age = raw_input("age?") 2 命令名查看raw_input的说明 unit, pydoc raw_ ...

  8. Objective-C 2.0属性(Property)介绍

    通常在声明一些成员变量时会看到如下声明方式: @property (参数1,参数2) 类型 名字: 这里我们主要分析在括号中放入的参数,主要有以下三种: setter/getter方法(assign/ ...

  9. sublime3安装

    1.下载安装程序 http://c758482.r82.cf2.rackcdn.com/Sublime%20Text%20Build%203059%20Setup.exe 2.下载注册机 http:/ ...

  10. 在TextView上显示图片信息

    布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...