android 设置录制视频的时长与大小限制,超时、超大小时自动停止
2014-02-16 22:14
901 查看
项目中要用到录制视频,需要对视频的大小、录制时长做限制。所以开发了此demo。
1、原理很简单,对于超时控制:做个定时器,到时间自动停止。
2、对于文件大小控制:还是使用定时器,每个一定时间检测文件大小,超过设置大小自动停止。
本demo时长、文件大小设置使用的是SharedPreferences
media_recorder.xml文件:
AndroidManifest.xml文件中别忘了加权限哦:
1、原理很简单,对于超时控制:做个定时器,到时间自动停止。
2、对于文件大小控制:还是使用定时器,每个一定时间检测文件大小,超过设置大小自动停止。
本demo时长、文件大小设置使用的是SharedPreferences
package com.lbl; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnShowListener; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.hardware.Camera.Size; import android.media.MediaRecorder; import android.media.MediaRecorder.OnInfoListener; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import com.example.myandroiddemo.R; public class RecordVideo extends Activity{ // 程序中的两个按钮 private Button record , stop; TextView currentTimeLengthTextView, currentFileSizeTextView; // 系统的视频文件 private File videoFile ; private MediaRecorder mRecorder; // 显示视频预览的SurfaceView SurfaceView sView; // 记录是否正在进行录制 private boolean isRecording = false; private Handler handler; //控制时长seekBar private SeekBar timeLengthSeekBar; //控制文件大小seekBar private SeekBar fileSizeSeekBar; SharedPreferences sharedPreferences; private Camera camera; //控制时长定时器 private Timer timer_timeLength; //控制文件大小定时器 private Timer timer_fileSize; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.media_recorder); record = (Button) findViewById(R.id.record); stop = (Button) findViewById(R.id.stop); // 让stop按钮不可用。 stop.setEnabled(false); // 为两个按钮的单击事件绑定监听器 record.setOnClickListener(new OnButtonClick()); stop.setOnClickListener(new OnButtonClick()); // 获取程序界面中的SurfaceView sView = (SurfaceView) this.findViewById(R.id.sView); /** * 出现这些问题基本上都是以下两个方法参数导致的,每个手机的分辨率和预览大小支持都不一样,设置错误就会报错。 */ // sView.getHolder().setFixedSize(320, 280); // 设置该组件让屏幕不会自动关闭 sView.getHolder().setKeepScreenOn(true); sharedPreferences = getSharedPreferences("settings", MODE_PRIVATE); handler = new Handler(){ @Override public void handleMessage(Message msg) { if(msg.what == 0x123){ stop(); Toast.makeText(RecordVideo.this, "录制视频由于已超过最长时间,自动停止!", 200).show(); }else if(msg.what == 0x124){ stop(); Toast.makeText(RecordVideo.this, "录制视频由于已超过设置的最大文件大小,自动停止!", 200).show(); } } }; } class OnButtonClick implements OnClickListener{ @Override public void onClick(View v) { switch (v.getId()) { // 单击录制按钮 case R.id.record: if (!Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)){ Toast.makeText(RecordVideo.this , "SD卡不存在,请插入SD卡!" , Toast.LENGTH_SHORT).show(); return; } init(); start(); //启动停止录制的定时器 timer_timeLength = new Timer(); System.out.println(); System.out.println(sharedPreferences.getInt("maxTimeLength", 0) * 1000); timer_timeLength.schedule(new EndTimerThread(), sharedPreferences.getInt("maxTimeLength", 0) * 1000); //每个1秒输出视频大小 // timer_fileSize = new Timer(); // timer_fileSize.schedule(new CheckFileSizeThread(), new Date(), 500); break; // 单击停止按钮 case R.id.stop: // 如果正在进行录制 stop(); break; } } } class OnSeekBarChange implements OnSeekBarChangeListener{ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(seekBar.getId() == R.id.timeLengthSeekBar){ currentTimeLengthTextView.setText("" + progress); }else{ currentFileSizeTextView.setText("" + progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } } /** * 初始化MediaRecoder * 参数设置顺序很重要,否则出错 * @throws IOException */ private void init(){ // 创建保存录制视频的视频文件 try { videoFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile() + "/myvideo.mp4"); } catch (IOException e) { e.printStackTrace(); } // 创建MediaPlayer对象 mRecorder = new MediaRecorder(); mRecorder.reset(); camera = Camera.open(); camera.setDisplayOrientation(90); Parameters parameters = camera.getParameters(); // List<Size> supportedPictureSizes = parameters.getSupportedPictureSizes(); // System.out.println("supportedPictureSizes================"); // for (Size size : supportedPictureSizes) { // System.out.println( "width: " + size.width + ";height:" + size.height); // } // List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes(); // System.out.println("supportedPreviewSizes================"); // for (Size size : supportedPreviewSizes) { // System.out.println( "width: " + size.width + ";height:" + size.height); // } // List<Size> supportedVideoSizes = parameters.getSupportedVideoSizes(); // System.out.println("supportedVideoSizes================"); // for (Size size : supportedVideoSizes) { // System.out.println( "width: " + size.width + ";height:" + size.height); // } camera.unlock(); mRecorder.setCamera(camera); // 设置从麦克风采集声音 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置从摄像头采集图像 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置视频文件的输出格式 // 必须在设置声音编码格式、图像编码格式之前设置 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //构造CamcorderProfile,使用高质量视频录制 // CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); // mRecorder.setProfile(camcorderProfile); // 设置声音编码的格式 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 设置图像编码的格式 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); /** *设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错 *且这里的分辨率必须是该camera支持的 */ List<Size> supportedVideoSizes = parameters.getSupportedVideoSizes(); long maxFileSize = Long.parseLong(200 * 1024 + "");//如果获取不到视频分辨率信息则默认设置个100k if(null != supportedVideoSizes && supportedVideoSizes.size() > 0){ mRecorder.setVideoSize(supportedVideoSizes.get(0).width, supportedVideoSizes.get(0).height); maxFileSize = Long.parseLong(sharedPreferences.getInt("maxFileSize", 0) * 1024 * 1024 + ""); }else{ Toast.makeText(RecordVideo.this, "无法获取视频分辨率信息,此处默认最大200K。", 200).show(); } // 每秒 4帧。。设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错 mRecorder.setVideoFrameRate(15); System.out.println("maxFileSize:"+maxFileSize); mRecorder.setMaxFileSize(maxFileSize); mRecorder.setOnInfoListener(new OnInfoListener() { @Override public void onInfo(MediaRecorder mr, int what, int extra) { if(what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED){ stop(); Toast.makeText(RecordVideo.this, "录制视频由于已超过设置的最大文件大小,自动停止!", 200).show(); } } }); mRecorder.setOutputFile(videoFile.getAbsolutePath()); // 指定使用SurfaceView来预览视频 mRecorder.setPreviewDisplay(sView.getHolder().getSurface()); } /** * 开始录制视频 * @throws IOException * @throws IllegalStateException */ private void start(){ if(!isRecording){ try { mRecorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 开始录制 mRecorder.start(); // 让record按钮不可用。 record.setEnabled(false); // 让stop按钮可用。 stop.setEnabled(true); isRecording = true; }else{ Toast.makeText(RecordVideo.this, "您正在录制,请先停止录制视频!", 200).show(); } } /** * 停止录制视频 */ private void stop(){ if (isRecording){ // 停止录制 mRecorder.stop(); // 释放资源 mRecorder.release(); mRecorder = null; camera.stopPreview(); camera.release(); camera = null; // 让record按钮可用。 record.setEnabled(true); // 让stop按钮不可用。 stop.setEnabled(false); isRecording = false; }else{ // Toast.makeText(RecordVideo.this, "对不起,您还没有开始录制视频!", 200).show(); } if(null != timer_timeLength){ timer_timeLength.cancel(); } if(null != timer_fileSize){ timer_fileSize.cancel(); } } /** * 停止录像定时器 */ class EndTimerThread extends TimerTask { @Override public void run() { handler.sendEmptyMessage(0x123); this.cancel(); } } // /** // * 检测文件大小,超过设置的最大值时停止录制 // */ // class CheckFileSizeThread extends TimerTask { // @Override // public void run() { // System.out.println("videoFile.length(): "+videoFile.length() + "; sharedPreferences.maxFileSize: " + sharedPreferences.getInt("maxFileSize", 0)); // System.out.println(videoFile.length()/1024/1024); // // if(videoFile.length()/1024/1024 >= sharedPreferences.getInt("maxFileSize", 0)){ // handler.sendEmptyMessage(0x124); // this.cancel(); // } // } // } /** * 设置按钮单机事件 * @param v */ public void setting(View v){ LinearLayout linearLayout = (LinearLayout)getLayoutInflater().inflate(R.layout.setting, null); AlertDialog alertDialog = new AlertDialog.Builder(RecordVideo.this).setTitle("设置").setIcon(R.drawable.ic_launcher) .setView(linearLayout) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //保存数据到SharedPreferences中 Editor editor = sharedPreferences.edit(); editor.putInt("maxTimeLength", timeLengthSeekBar.getProgress()); editor.putInt("maxFileSize", fileSizeSeekBar.getProgress()); //提交数据 editor.commit(); } }) .create(); //弹出设置对话框时初始化保存的试着信息 alertDialog.setOnShowListener(new OnShowListener() { @Override public void onShow(DialogInterface dialog) { currentTimeLengthTextView.setText(sharedPreferences.getInt("maxTimeLength", 0) + ""); currentFileSizeTextView.setText(sharedPreferences.getInt("maxFileSize", 0) + ""); timeLengthSeekBar.setProgress(sharedPreferences.getInt("maxTimeLength", 0)); fileSizeSeekBar.setProgress(sharedPreferences.getInt("maxFileSize", 0)); } }); alertDialog.show(); //获取设置界面的元素 timeLengthSeekBar = (SeekBar)linearLayout.findViewById(R.id.timeLengthSeekBar); fileSizeSeekBar = (SeekBar)linearLayout.findViewById(R.id.fileSizeSeekBar); currentTimeLengthTextView = (TextView) linearLayout.findViewById(R.id.currentTimeLength); currentFileSizeTextView = (TextView) linearLayout.findViewById(R.id.currentFileSize); //给seekBar添加监听器 timeLengthSeekBar.setOnSeekBarChangeListener(new OnSeekBarChange()); fileSizeSeekBar.setOnSeekBarChangeListener(new OnSeekBarChange()); } }
media_recorder.xml文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 显示视频预览的SurfaceView --> <SurfaceView android:id="@+id/sView" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"> <Button android:id="@+id/settintg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="设置" android:onClick="setting" /> <Button android:id="@+id/record" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始"/> <Button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="结束"/> </LinearLayout> </RelativeLayout>
AndroidManifest.xml文件中别忘了加权限哦:
<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"/>
相关文章推荐
- Android录制视频,可限制时长,限大小
- android GLSurfaceView匹配屏幕宽度及视频宽高比设置view大小
- Android从零开始(26)(设置全屏+横屏、相机拍照、视频录制)(新)
- 自动设置Android控件的占有屏幕的大小
- PHP做视频网站,让程序自动实现视频格式转换、设置视频大小、生成视频缩略图
- Android代码中动态设置图片的大小(自动缩放),位置
- android仿微信录制短视频,拍照,自动聚焦,手动聚焦,滑动缩放功能(Camera+TextureView+rxjava实现)
- android中几个小程序,打开照相机,自定义相机,设置固定大小的视频播放
- Android 视频录制限制时间
- Android 设置文件后缀名及限制文件的大小获取手机文件
- ym——Android从零开始(26)(设置全屏+横屏、相机拍照、视频录制)(新)
- MediaRecorder关于录制视频文件大小和录制时长的设置
- Android开发中遇到的问题(一)——自定义videoview设置视频大小,实现上下黑边
- Android logcat log size -- Android logcat log 大小限制如何设置
- Android之EditText设置长度限制提示和自动添加空格
- android开发,静音录制视频,在一般清晰度的前提下保证文件大小越小越好
- nginx限制上传大小和超时时间设置说明/php限制上传大小
- 设置tomcat启动超时,不会自动停止
- 微信Android自动播放视频(可交互,设置层级,无控制条,非X5)ffmpeg,jsmpeg.js,.ts视频
- Android代码中动态设置图片的大小(自动缩放),位置