هذه المقالة عبارة عن عنصر تحكم لتسجيل مقاطع الفيديو القصيرة باستخدام MediaRecorder. يمكنك ضبط الوقت وحجم المساحة وما إذا كان سيتم تشغيل الكاميرا في البداية وما إلى ذلك لتسجيل الفيديو. عنصر التحكم هذا عبارة عن عنصر تحكم مركب ويرث من LinearLayout لمنع الأخطاء، يجب تنفيذ واجهة android.media.MediaRecorder.OnErrorListener.
واجهة تسجيل فيديو صغيرة
MovieRecorderView.java
import java.io.File;import java.io.IOException;import java.util.Timer;import java.util.TimerTask; import android.content.Context;import android.content.res.TypedArray;import android.hardware.Camera; ؛ استيراد android.hardware.Camera.Parameters؛ استيراد android.media.MediaRecorder؛ استيراد android.media.MediaRecorder.AudioEncoder;import android.media.MediaRecorder.AudioSource;import android.media.MediaRecorder.OnErrorListener;import android.media.MediaRecorder.OutputFormat;import android.media.MediaRecorder.VideoEncoder;import android.media.MediaRecorder .VideoSource;استيراد android.util.AttributeSet;import android.view.LayoutInflater;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.widget.LinearLayout;import android.widget.ProgressBar; import com.contron.dgyj.R;import com.contron.dgyj.common.Globals;import com.contron.dgyj.im.ImGlobal;import com.lidroid.xutils.util.LogUtils /** * التحكم في تشغيل الفيديو* * @author liuyinjun * * @date 2015- 2-5 */ public class MovieRecorderView Extends LinearLayout Implements OnErrorListener { Private SurfaceView mSurfaceView Private; SurfaceHolder mSurfaceHolder; Private ProgressBar mProgressBar; Private MediaRecorder mMediaRecorder; Private Timer mOnRecordFinishListener; // واجهة رد الاتصال الخاصة بإكمال التسجيل; المنطق المنطقي الخاص هو isOpenCamera;// ما إذا كان سيتم تشغيل الكاميرا من البداية Private int mRecordMaxTime; // الحد الأقصى لوقت التصوير الخاص int mTimeCount; // عدد الوقت Private File mVecordFile = null; // ملف public MovieRecorderView(Context context) { this(context, null } public MovieRecorderView(Context context, AttributeSet attrs) { this(context, attrs, 0); MovieRecorderView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); .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); *@تاريخ2015-2-5*/ فئة خاصة CustomCallBack بتنفيذ Callback { @Override public void surfaceCreated(SurfaceHolderholder) { if (!isOpenCamera) return; حاول { initCamera() } Catch (IOException e) { // TODO Auto-generated cast block e.printStackTrace() } } @Override public void surfaceChanged(SurfaceHolder stand, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolderholder) { if (!isOpenCamera) return; freeCameraResource(); } } /** * تهيئة الكاميرا* * @author liuyinjun * @date 2015-2-5 * @throws IOException */ public void initCamera() يلقي IOException { if (mCamera != null) { freeCameraResource() } حاول { mCamera = Camera.open(); }catch (Exception e) { e.printStackTrace(); freeCameraResource(); } if (mCamera == null) return; mSurfaceHolder); mCamera.startPreview(); اضبط الكاميرا على الشاشة العمودية * * @author liuyinjun * @date 2015-2-5 */ Private void setCameraParams() { if (mCamera != null) { Parameters params = mCamera.getParameters(); " , "portrait"); mCamera.setParameters(params); } } /** * تحرير موارد الكاميرا* * @author liuyinjun * @date 2015-2-5 */ public void freeCameraResource() { if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera = null } } public void createRecordDir() { File SampleDir = new File(Environment.getExternalStorageDirectory() + File.separator + "im/video/"); if (!sampleDir.exists()) { SampleDir.mkdirs(); } File vecordDir = SampleDir; File.createTempFile("تسجيل"، ".mp4"، vecordDir);//تنسيق mp4 LogUtils.i(mVecordFile.getAbsolutePath()); }catch (IOException e) { } } /** * التهيئة* * @author liuyinjun * @date2015-2-5 * @throws IOException * / initRecord () باطل خاص يلقي IOException { mMediaRecorder = new MediaRecorder(); mMediaRecorder.reset(); if (mCamera != null) mMediaRecorder.setCamera(mCamera); mMediaRecorder.setOnErrorListener(this); مصدر الفيديو 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.setOutputFile(mVecordFile.getAbsolutePath()); mMediaRecorder.prepare(); حاول { mMediaRecorder.start(); } Catch (IllegalStateException e) { e.printStackTrace(); (); } } /** * بدء تسجيل الفيديو* * @author liuyinjun * @date 5-2-2015 * @param fileName * موقع تخزين الفيديو * @param onRecordFinishListener * واجهة رد الاتصال بعد الوصول إلى الوقت المحدد */ public void Record(final OnRecordFinishListener onRecordFinishListener) { this.mOnRecordFinishListener = onRecordFinishListener createRecordDir(); (! isOpenCamera)// إذا لم يتم تشغيل الكاميرا، فافتح initCamera(); initRecord(); mTimeCount = 0; // إعادة تعيين عداد الوقت mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { // TODO Auto-generated way stub mTimeCount++; mProgressBar. setProgress(mTimeCount);// اضبط شريط التقدم إذا (mTimeCount == mRecordMaxTime) {// عند الوصول إلى الوقت المحدد، توقف عن التصوير if (mOnRecordFinishListener != null) mOnRecordFinishListener.onRecordFinish(); } } }, 0, 1000); /** * توقف عن التصوير * * @author liuyinjun * @date 2015-2-5 */ public void stop() { stopRecord(); freeCameraResource(); } /** * إيقاف التسجيل* * @author liuyinjun * @date 2015-2-5 */ public void stopRecord() { mProgressBar.setProgress(0); mTimer != null) mTimer.cancel(); if (mMediaRecorder != null) { // لن يتعطل بعد الإعداد .printStackTrace ()؛ } Catch (Exception 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(); e.printStackTrace(); } } mMediaRecorder = null } public int getTimeCount() { return mTimeCount } /** * @return the mVecordFile */ public File getmVecordFile() { return mVecordFile } /** * رد اتصال إكمال التسجيل الواجهة * * @author liuyinjun * * @date 2015-2-5 */ الواجهة العامة OnRecordFinishListener { public void onRecordFinish(); } @Override public void onError(MediaRecorder mr, int What, int extra) { حاول { if (mr != null) mr.reset() } Catch (IllegalStateException e) { e.printStackTrace (); } Catch (Exception 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:background="@android:color/background_dark" android:orientation="vertical"> <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:background="@android:color/background_dark" android:orientation="vertical"> <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>
ما ورد أعلاه هو محتوى هذه المقالة بالكامل، وآمل أن تنال إعجابكم جميعًا.