Android视频录制

标签: android 视频 | 发表时间:2013-02-21 22:28 | 作者:jaycee110905
出处:http://blog.csdn.net
package cn.itcast.videorecord;

import java.io.File;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";
    private SurfaceView surfaceView;
    private MediaRecorder mediaRecorder;
    private boolean record;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mediaRecorder = new MediaRecorder();
        surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
        /*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/
        this.surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        this.surfaceView.getHolder().setFixedSize(320, 240);//设置分辨率

        ButtonClickListener listener = new ButtonClickListener();
        Button stopButton = (Button) this.findViewById(R.id.stop);
        Button recordButton = (Button) this.findViewById(R.id.record);
        stopButton.setOnClickListener(listener);
        recordButton.setOnClickListener(listener);        
    }
    
    @Override
	protected void onDestroy() {
    	mediaRecorder.release();
		super.onDestroy();
	}

	private final class ButtonClickListener implements View.OnClickListener{
		@Override
		public void onClick(View v) {
			if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
				Toast.makeText(MainActivity.this, R.string.sdcarderror, 1).show();
				return ;
			}
			try {
				switch (v.getId()) {
				case R.id.record:
					mediaRecorder.reset();
					mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频
					mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
					mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					mediaRecorder.setVideoSize(320, 240);
					mediaRecorder.setVideoFrameRate(3); //每秒3帧
					mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置视频编码方式
					mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
					File videoFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".3gp");
					mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
					mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
					mediaRecorder.prepare();//预期准备
					mediaRecorder.start();//开始刻录
					record = true;
					break;

				case R.id.stop:
					if(record){
						mediaRecorder.stop();
						record = false;
					}
					break;
				}
			} catch (Exception e) {
				Toast.makeText(MainActivity.this, R.string.error, 1).show();
				Log.e(TAG, e.toString());
			}
		}
    	
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="#ffffff"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<SurfaceView
    android:layout_width="fill_parent" 
    android:layout_height="220dip" 
    android:id="@+id/surfaceView"
    />
    <LinearLayout
	    android:orientation="horizontal"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    android:gravity="right"
	    >
	    <Button
		    android:layout_width="wrap_content" 
		    android:layout_height="wrap_content" 
		    android:text="@string/record"
		    android:id="@+id/record"
		    />
	    <Button
		    android:layout_width="wrap_content" 
		    android:layout_height="wrap_content" 
		    android:layout_marginLeft="10dip"
		    android:text="@string/stop"
		    android:id="@+id/stop"
		    />
    </LinearLayout>
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.itcast.videorecord"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name" android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="7" />
<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"/>

</manifest> 

项目源码下载: http://pan.baidu.com/share/link?shareid=274384&uk=1796216265
作者:jaycee110905 发表于2013-2-21 22:28:47 原文链接
阅读:85 评论:0 查看评论

相关 [android 视频] 推荐:

Android视频录制

- - CSDN博客移动开发推荐文章
/*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/. this.surfaceView.getHolder().setFixedSize(320, 240);//设置分辨率. mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频.

Android 开发视频推荐

- - 大猫の意淫筆記
作为 Android 死忠粉,总是想自己来两手,无奈没摸过后台开发,面向的唯一对象就是马总. 花了个把星期入个门,发现还是挺好玩的. 市面上的 Android 入门书有2个主要问题,一个是都要求有 Java 基础,另一个是跟不上 Android 版本更新.所以并不推荐买书学习. 斯坦福大学公开课:编程方法学.

Google+ Android 应用已支持 NFC [视频]

- 太平犬 - 谷安——谷奥Android专题站
Google 喜欢将自己不同的技术和服务搞到一起,取长补短彼此促进,看起来 Google+ 也不例外. 通过带有 NFC 的手机,Google+ 应用可以读取 NFC 标签从而快速分享内容. 当然直到 NFC 普及之前估计难火热起来. Google 已经宣传 NFC(near-field communications/近场通信)有一段时间,他们还推出了基于 NFC 的 Google Wallet(Google 钱包)服务.

MegaPad,23 英寸的 Android 平板?[视频]

- SotongDJ - 谷安——谷奥Android专题站
你可能已经有了 10 英寸平板,不过你想要个更大的屏幕么. Android 改装发烧友 Martin Drashkov 就有这样的想法,因为它构建了一个 23 英寸的触屏 Android 设备. 他将这个设备称为 MegaPad,而且它只花了 600 美刀左右就炮制出来了. Martin 认为更大的屏幕可以让“两个人同时使用”而且“也有同时开启两个不同需求的应用的可能性”.

Android 4.0 首个使用视频曝光

- 猪头小队长 - 爱范儿 · Beats of Bits
这年头各个公司的曝光策略似乎都不一样,苹果那边是几年如一日的保护壳曝光、酒吧丢手机;Google 似乎更偏爱 Ebay 一点,有人从 Ebay 上买到了一台 Nexus S,然后他惊奇地发现,系统居然是即将发布的 Android 4.0 冰淇淋三明治. 他很快拍摄了一段视频,并发给 Engadget.

下一代Android运行视频曝光

- Adam - cnBeta.COM
不用像在酒吧里面等待遗失的新iPhone那样麻烦,代号冰淇淋三明治的下一代Android操作系统已经亮相,近日在eBay上有网友在出售一款Nexus S,特别之处就在于该机运行有最新的下一代Android操作系统.

Android 4.0 真实视频泄露

- 阳勇 - 36氪
Eric Schmidt在Dreamforce大会上曾表示,Android的下一代操作系统Ice Cream Sandwich将在10月或11月发布,今天有一位用户在eBay上买了一部Nexus S,他惊讶的发现,他的手机系统有一点不一样,打开关于菜单,他发现这部手机运行的竟然是Ice Cream Sandwich.

Android示例大全教学视频

- Sense - ITeye论坛最新讨论
Android示例大全教学视频. 共30集,更新信息请关注http://www.innovation-office.net/android-api-video.htm. 以下是56视频网的地址,分集观看. 作者: zhouxing . 声明: 本文系JavaEye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任.

Android 4.0 SDK 移植到 Nexus One [视频]

- Will - 谷安——谷奥Android专题站
Youtube 上一名叫做 drl337md 的用户放出了一个 Nexus One 上运行 Android 4.0 的演示视频. 虽然 Nexus One 相比现在很多高端手机即将成为过去,但是似乎这个运行结果看起来不坏. 也许 Google 会优化后给 Nexus One 也带来 Ice Cream Sandwich.

Android三种播放视频的方式

- - CSDN博客推荐文章
在Android中,我们有三种方式来实现视频的播放:. 指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2、使用VideoView来播放. 在布局文件中使用VideoView结合MediaController来实现对其控制. 3、使用MediaPlayer类和SurfaceView来实现,这种方式很灵活.