zoukankan      html  css  js  c++  java
  • Android学习笔记_27_多媒体之视频刻录

    一、配置文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.videorecord"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.videorecord.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-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>
    View Code

      布局文件:

    <RelativeLayout 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"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <SurfaceView
            android:id="@+id/surfaceView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        <RelativeLayout
            android:id="@+id/buttonlayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
             >
    
            <Button
                android:id="@+id/videostop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_marginRight="5dp"
                android:layout_toLeftOf="@+id/videorecord"
                android:onClick="record"
                android:enabled="false"
                android:text="@string/stop" />
    
            <Button
                android:id="@+id/videorecord"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_marginRight="59dp"
                android:onClick="record"
                android:text="@string/record" />
        </RelativeLayout>
    
    </RelativeLayout>
    View Code

    二、代码实现:

    package com.example.videorecord;
    
    import android.app.Activity;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    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;
    /**
     * 视频采集刻录
     * @author Administrator
     *
     */
    public class MainActivity extends Activity {
        private View layout;
        private SurfaceView surfaceView;
        private Button recordButton;
        private Button stopButton;
        private MediaRecorder recorder;
        private boolean record=false;
    
        @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);
            layout= this.findViewById(R.id.buttonlayout);
            recordButton= (Button) this.findViewById(R.id.videorecord);
            stopButton= (Button) this.findViewById(R.id.videostop);
            //确定surfaceView什么时候被时间
            surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
            /*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/
            surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            surfaceView.getHolder().setFixedSize(176, 144);    //设置分辨率
            surfaceView.getHolder().setKeepScreenOn(true);//设置高亮
            
        }
        public void record(View v){
            try {
                switch (v.getId()) {
                case R.id.videorecord:
                    recorder = new MediaRecorder();
                    recorder.reset();                    
                    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频    
                    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //麦克风            
                    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//输出格式3gp
                    recorder.setVideoSize(320, 240);//视频大小
                    recorder.setVideoFrameRate(3); //每秒3帧,每秒从摄像头捕获多少画面        
                    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //设置视频编码方式    
                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置声音编码        
                    recorder.setOutputFile("/storage/sdcard0/360/"+System.currentTimeMillis()+".3gp");//文件输出位置    
                    //设置预览显示
                    recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
                    recorder.prepare();//预期准备
                    recorder.start();//开始刻录
                    record = true;
                    recordButton.setEnabled(false);
                    stopButton.setEnabled(true);
                    break;
                case R.id.videostop:
                    if(record){
                        recorder.stop();//停止刻录
                        record = false;
                        recorder.release();
                        recorder=null;
                    }            
                    recordButton.setEnabled(true);
                    stopButton.setEnabled(false);
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        //触摸事件
        public boolean onTouchEvent(MotionEvent event) {
            //手指按下屏幕
            if(event.getAction()==MotionEvent.ACTION_DOWN){
                layout.setVisibility(ViewGroup.VISIBLE);//显示布局
                return true;
            }
            return super.onTouchEvent(event);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }
  • 相关阅读:
    [原创]软件性能测试培训
    100w条记录分页,可以有多快?—— DataReader分页与SQL语句分页的对比测试(在线演示)
    【自然框架】注册会员活动——第一份代码的修改建议(第一版)
    加班有几种情况?兼谈讨论的方式。
    衔着树枝飞跃太平洋的傻鸟!(童话版)
    参加活动的好处。
    【自然框架】开源社区活动,会员注册的第一份代码!
    【自然框架】数据访问之精雕细琢(一)存储过程的参数
    自然框架开发系列(一):自然框架 和 AgileEAS.NET 合作,开发b/s的药店系统!
    自然框架开源社区的第一次活动——实现会员注册
  • 原文地址:https://www.cnblogs.com/lbangel/p/3463262.html
Copyright © 2011-2022 走看看