当前位置: 首页 > news >正文

Android之录制视频文件

直接使用实例演示(注意代码注释):

【0】Manifest文件

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hoo.videorecord" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="com.hoo.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-sdk android:minSdkVersion="7" /> <!--添加摄像头,录音权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.CAMERA"/> <!--添加SDCard的读写权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> </manifest>

【1】主界面布局文件

<?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>

【2】MainActivity

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实例 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); //每秒3帧 mediaRecorder.setVideoFrameRate(3); //设置视频编码方式 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置音频编码方式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //把录制下的视频保存到SDCard的根目录下 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()); } } } }

相关文章:

  • 在ASP.NET应用中执行后台任务
  • Gamma校正问题
  • Brendan Gregg ----Linux Performance Tools NEWS
  • 打印信息
  • Android中使用手势识别功能
  • hibernate之初学增删改查
  • Android之使用传感器获取相应数据
  • css实现文字两端对齐
  • jQuery高性能自己定义滚动栏美化插件
  • Visual Code中的智能提示
  • 什么是ODBC ?
  • Perfect or Good Enough – 关于测试程度的一些探讨
  • 得到存储过程中最后拼接出来的语句
  • python 同时打开两个文件以及打开文件的基本操作
  • open_basedir restriction in effect,解决php引入文件权限问题
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Docker容器管理
  • ES6之路之模块详解
  • Linux Process Manage
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpriteKit 技巧之添加背景图片
  • 程序员该如何有效的找工作?
  • 给初学者:JavaScript 中数组操作注意点
  • 老板让我十分钟上手nx-admin
  • 漂亮刷新控件-iOS
  • 如何合理的规划jvm性能调优
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • Java总结 - String - 这篇请使劲喷我
  • ​业务双活的数据切换思路设计(下)
  • #Ubuntu(修改root信息)
  • (06)Hive——正则表达式
  • (2)nginx 安装、启停
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)nginx 配置(nginx.conf)
  • (C++17) std算法之执行策略 execution
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (四) Graphivz 颜色选择
  • (五)MySQL的备份及恢复
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)WLAN定义和基本架构转
  • (译)2019年前端性能优化清单 — 下篇
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net Web项目创建比较不错的参考文章
  • .NET 使用配置文件
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @EnableConfigurationProperties注解使用
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录