บทความนี้เป็นการควบคุมสำหรับการบันทึกวิดีโอสั้น ๆ ด้วย MediaRecorder คุณสามารถตั้งเวลา ขนาดพื้นที่ และจะเปิดกล้องในตอนแรกหรือไม่ ฯลฯ สำหรับการบันทึกวิดีโอ การควบคุมนี้เป็นการควบคุมแบบผสมผสานและสืบทอดมาจาก LinearLayout เพื่อป้องกันข้อผิดพลาด จำเป็นต้องใช้อินเทอร์เฟซ android.media.MediaRecorder.OnErrorListener
อินเทอร์เฟซการบันทึกวิดีโอขนาดเล็ก
MovieRecorderView.java
นำเข้า java.io.File; นำเข้า java.io.IOException; นำเข้า java.util.Timer; นำเข้า java.util.TimerTask; นำเข้า android.content.Context; นำเข้า android.content.res.TypedArray; นำเข้า android.hardware.Camera ;นำเข้า android.hardware.Camera.Parameters;นำเข้า android.media.MediaRecorder;นำเข้า android.media.MediaRecorder.AudioEncoder; นำเข้า android.media.MediaRecorder.AudioSource; นำเข้า android.media.MediaRecorder.OnErrorListener; นำเข้า android.media.MediaRecorder.OutputFormat; นำเข้า android.media.MediaRecorder.VideoEncoder; นำเข้า android.media.MediaRecorder .VideoSource;นำเข้า android.util.AttributeSet;นำเข้า android.view.LayoutInflater;นำเข้า android.view.SurfaceHolder;นำเข้า android.view.SurfaceHolder.Callback;นำเข้า android.view.SurfaceView;นำเข้า android.widget.LinearLayout;นำเข้า android.widget.ProgressBar; นำเข้า com.contron.dgyj.R; นำเข้า com.contron.dgyj.common.Globals;นำเข้า com.contron.dgyj.im.ImGlobal;นำเข้า com.lidroid.xutils.util.LogUtils; /** * การควบคุมการเล่นวิดีโอ* * @author liuyinjun * * @date 2015- 2-5 */public class MovieRecorderView ขยาย LinearLayout ใช้งาน OnErrorListener { private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; ProgressBar mProgressBar ส่วนตัว mMediaRecorder กล้องส่วนตัว mTimer ส่วนตัว // ความสูงความละเอียดวิดีโอ บูลีนส่วนตัว isOpenCamera;// ไม่ว่าจะเปิดกล้องตั้งแต่เริ่มต้น int mRecordMaxTime; // เวลาสูงสุดสำหรับการถ่ายภาพ int mTimeCount ส่วนตัว; // การนับเวลา ไฟล์ส่วนตัว mVecordFile = null; // ไฟล์สาธารณะ MovieRecorderView (บริบทบริบท) { นี้ (บริบท, null ); } MovieRecorderView สาธารณะ (บริบทบริบท, AttributeSet attrs) { นี่ (บริบท, attrs, } สาธารณะ MovieRecorderView (บริบทบริบท, AttributeSet attrs, int defStyle) { super (บริบท, attrs, defStyle); TypedArray a = context.obtainStyledAttributes (attrs, R.styleable.MovieRecorderView, defStyle, 0); .MovieRecorderView_width, 320);// ค่าเริ่มต้น 320 mHeight = a.getInteger(R.styleable.MovieRecorderView_height, 240); // ค่าเริ่มต้น 240 isOpenCamera = a.getBoolean(R.styleable.MovieRecorderView_is_open_camera, true); // ค่าเริ่มต้นเปิด mRecordMaxTime = a.getInteger(R.styleable. MovieRecorderView_record_max_time, 10);//ค่าเริ่มต้นคือ 10 LayoutInflater.from(context).inflate(R.layout.movie_recorder_view, this); mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); id .progressBar); mProgressBar.setMax(mRecordMaxTime);// ตั้งค่าจำนวนแถบความคืบหน้าสูงสุด mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(new CustomCallBack()); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); * @ วันที่ 5-2-58 */คลาสเรียนส่วนตัว CustomCallBack ใช้การโทรกลับ { @Override public void surfaceCreated(SurfaceHolder holder) { if (!isOpenCamera) return; try { initCamera(); } catch (IOException e) { // TODO auto-generated catch block e.printStackTrace(); @แทนที่ โมฆะสาธารณะ surfaceChanged (ตัวยึด SurfaceHolder, รูปแบบ int, ความกว้าง int, ความสูง int) { } @แทนที่ โมฆะสาธารณะ surfaceDestroyed (ที่ยึด SurfaceHolder) { if (!isOpenCamera) return; freeCameraResource(); } } /** * เตรียมใช้งานกล้อง* * @author liuyinjun * @date 2015-2-5 * @throws IOException */ private void initCamera() พ่น IOException { if (mCamera != null) { freeCameraResource(); } ลอง { mCamera = Camera.open(); } catch (ข้อยกเว้น e) { e.printStackTrace(); } if (mCamera == null) return; mSurfaceHolder); mCamera.startPreview(); mCamera.unlock(); } /** ตั้งค่ากล้องเป็นหน้าจอแนวตั้ง * * @author liuyinjun * @date 2015-2-5 */ private void setCameraParams() { if (mCamera != null) { พารามิเตอร์ params = mCamera.getParameters(); params.set("orientation " , "แนวตั้ง"); mCamera.setParameters(params); } } /** * เผยแพร่ทรัพยากรกล้อง* * @author liuyinjun * @ วันที่ 2015-2-5 */ โมฆะส่วนตัว freeCameraResource() { if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.lock(); mCamera = null; } } โมฆะส่วนตัว createRecordDir() { ไฟล์ SampleDir = new ไฟล์(Environment.getExternalStorageDirectory() + File.separator + "im/video/"); if (!sampleDir.exists()) { exampleDir.mkdirs(); } ไฟล์ vecordDir = exampleDir; // สร้างไฟล์ File.createTempFile("การบันทึก", ".mp4", vecordDir);//รูปแบบ mp4 LogUtils.i(mVecordFile.getAbsolutePath()); } catch (IOException e) { } } /** * การเริ่มต้น* * @author liuyinjun * @date 2015-2-5 * @throws IOException * / โมฆะส่วนตัว initRecord() พ่น IOException { mMediaRecorder = new MediaRecorder(); mMediaRecorder.reset(); mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); แหล่งสัญญาณวิดีโอ mMediaRecorder.setAudioSource(AudioSource.MIC);//แหล่งเสียง mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);//รูปแบบเอาต์พุตวิดีโอ mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);//รูปแบบเสียง mMediaRecorder.setVideoSize(mWidth, mHeight) ;//ตั้งค่าความละเอียด: // mMediaRecorder.setVideoFrameRate(16);// ฉันลบสิ่งนี้ออกไปแล้ว ดูเหมือนว่าจะไร้ประโยชน์ mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 512);// ตั้งค่าความถี่ของเฟรม จากนั้นมันจะชัดเจน ;/ / เอาต์พุตจะหมุน 90 องศา ทำให้บันทึกหน้าจอในแนวตั้งได้ mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP); // รูปแบบการบันทึกวิดีโอ // mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000); mMediaRecorder.prepare(); ลอง { mMediaRecorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); (); } } /** * เริ่มบันทึกวิดีโอ* * @author liuyinjun * @date 2015-2-5 * @param fileName * ตำแหน่งการจัดเก็บวิดีโอ * @param onRecordFinishListener * อินเทอร์เฟซการโทรกลับหลังจากถึงเวลาที่กำหนด */ บันทึกโมฆะสาธารณะ (สุดท้าย OnRecordFinishListener onRecordFinishListener) { this.mOnRecordFinishListener = onRecordFinishListener; createRecordDir(); ลอง { if (! isOpenCamera)//หากไม่ได้เปิดกล้อง ให้เปิด initCamera(); initRecord(); mTimeCount = 0; // กำหนดตัวนับเวลาใหม่ mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { // TODO วิธีการสร้างอัตโนมัติ stub mTimeCount++; mProgressBar. setProgress(mTimeCount);//ตั้งค่าแถบความคืบหน้าถ้า (mTimeCount == mRecordMaxTime) {// เมื่อถึงเวลาที่กำหนด ให้หยุดการถ่ายภาพ (mOnRecordFinishListener != null) mOnRecordFinishListener.onRecordFinish(); 0, 1000); /** * หยุดยิง * * @author liuyinjun * @date 2015-2-5 */ public void stop() { stopRecord(); releaseRecord(); freeCameraResource(); } /** * หยุดการบันทึก* * @author liuyinjun * @date 2015-2-5 */ public void stopRecord() { mProgressBar.setProgress(0); mTimer != null) mTimer.cancel(); ถ้า (mMediaRecorder != null) { // มันจะไม่ผิดพลาดหลังจากการตั้งค่า mMediaRecorder.setOnErrorListener(null); mMediaRecorder.setPreviewDisplay(null); ลอง { mMediaRecorder.stop(); } catch (IllegalStateException) { e.printStackTrace(); .printStackTrace (); } catch (ข้อยกเว้น e) { e.printStackTrace(); } /** * เผยแพร่ทรัพยากร * * @author liuyinjun * @date 2015-2-5 */ private void releaseRecord() { if (mMediaRecorder != null) { mMediaRecorder.setOnErrorListener(null); ลอง { mMediaRecorder.release() ; } catch (IllegalStateException e) { e.printStackTrace(); } catch (ข้อยกเว้น e) { e.printStackTrace(); } } mMediaRecorder = null; } public int getTimeCount() { return mTimeCount; } /** * @return the mVecordFile */ public File getmVecordFile() { return mVecordFile; } /** * การบันทึกเสร็จสิ้น อินเทอร์เฟซ * * @author liuyinjun * * @date 2015-2-5 */ อินเทอร์เฟซสาธารณะ OnRecordFinishListener { โมฆะสาธารณะ onRecordFinish(); } @แทนที่ โมฆะสาธารณะ onError (MediaRecorder mr, int what, int พิเศษ) { ลอง { if (mr != null) mr.reset( } catch (IllegalStateException e) { e.printStackTrace (); } catch (ข้อยกเว้น e) { e.printStackTrace();
movie_recorder_view.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout 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:พื้นหลัง="@android:สี/พื้นหลัง_dark" android:orientation="แนวตั้ง"> <SurfaceView android:id="@+id/surfaceview" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight ="1" /> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="2dp" /> </LinearLayout>
attrs.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout 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:พื้นหลัง="@android:สี/พื้นหลัง_dark" android:orientation="แนวตั้ง"> <SurfaceView android:id="@+id/surfaceview" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight ="1" /> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="2dp" /> </LinearLayout>
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าทุกคนจะชอบมัน