Bei diesem Artikel handelt es sich um eine Steuerung zum Aufzeichnen kurzer Videos mit MediaRecorder. Sie können die Zeit, die Speicherplatzgröße und das anfängliche Einschalten der Kamera usw. für die Videoaufzeichnung festlegen. Dieses Steuerelement ist ein Kombinationssteuerelement und erbt von LinearLayout. Um Fehler zu vermeiden, muss die Schnittstelle android.media.MediaRecorder.OnErrorListener implementiert werden.
Kleine Videoaufzeichnungsschnittstelle
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 ;import android.hardware.Camera.Parameters;import android.media.MediaRecorder;import 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;importieren 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; /** * Steuerung der Videowiedergabe* * @author liuyinjun * * @date 2015- 2-5 */public class MovieRecorderView erweitert LinearLayout implementiert OnErrorListener { private SurfaceView mSurfaceView; SurfaceHolder mSurfaceHolder; private MediaRecorder mMediaRecorder; private Timer OnRecordFinishListener; // Videoauflösungsbreite private int mHeight; privater boolescher Wert isOpenCamera;// Ob die Kamera von Anfang an eingeschaltet werden soll private int mRecordMaxTime; // Die maximale Zeit für eine Aufnahme private int mTimeCount // Zeitanzahl private File mVecordFile = null // File 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); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MovieRecorderView, defStyle, 0); mWidth = a.getInteger(R.styleable .MovieRecorderView_width, 320);// Standard 320 mHeight = a.getInteger(R.styleable.MovieRecorderView_height, 240); // Standard 240 isOpenCamera = a.getBoolean(R.styleable.MovieRecorderView_is_open_camera, true); // Standard open mRecordMaxTime = a.getInteger(R.styleable. MovieRecorderView_record_max_time, 10);//Der Standardwert ist 10 LayoutInflater.from(context).inflate(R.layout.movie_recorder_view, this); mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); mProgressBar = (ProgressBar) findViewById(R. id .progressBar); mProgressBar.setMax(mRecordMaxTime);// Legen Sie den maximalen Fortschrittsbalken fest mSurfaceHolder(); mSurfaceHolder.addCallback(new CustomCallBack()); a.recycle(); * @ Datum 5.2.2015 */ Privatunterricht CustomCallBack implementiert Callback { @Override public void surfaceCreated(SurfaceHolder) { if (!isOpenCamera) return; @Override public void surfaceChanged(SurfaceHolderholder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (!isOpenCamera) return; freeCameraResource(); } } /** * Initialisiere die Kamera* * @author liuyinjun * @date 2015-2-5 * @throws IOException */ private void initCamera() löst eine IOException aus { if (mCamera != null) { freeCameraResource( } try {); mCamera = Camera.open(); } Catch (Exception e) { e.printStackTrace(); if (mCamera == null) return; mSurfaceHolder); mCamera.startPreview(); mCamera.unlock(} /** * Stellen Sie die Kamera auf vertikalen Bildschirm ein * * @author liuyinjun * @date 2015-2-5 */ private void setCameraParams() { if (mCamera != null) { Parameters params = mCamera.getParameters(); params.set("orientation " , "portrait"); mCamera.setParameters(params); } } /** * Kameraressourcen freigeben* * @author liuyinjun * @date 2015-2-5 */ private void freeCameraResource() { if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.lock(); mCamera = null; } } private void createRecordDir() { File sampleDir = new File(Environment.getExternalStorageDirectory() + File.separator + "im/video/"); if (!sampleDir.exists()) { sampleDir.mkdirs(); } File vecordDir = sampleDir; // Datei erstellen try { mVecordFile = File.createTempFile("recording", ".mp4", vecordDir);//mp4 format LogUtils.i(mVecordFile.getAbsolutePath()); } Catch (IOException e) { } } /** * Initialisierung* * @author liuyinjun * @date 2015-2-5 * @throws IOException * / private void initRecord() löst eine IOException { mMediaRecorder = new aus MediaRecorder(); mMediaRecorder.reset(); if (mCamera != null) mMediaRecorder.setOnErrorListener(this);// Videoquelle mMediaRecorder.setAudioSource(AudioSource.MIC);//Audioquelle mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);//Videoausgabeformat mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);//Audioformat mMediaRecorder.setVideoSize(mWidth, mHeight) ;//Auflösung einstellen: // mMediaRecorder.setVideoFrameRate(16);// Ich habe das entfernt, es scheint nutzlos zu sein. mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 512);// Stellen Sie die Bildfrequenz ein und dann ist es klar. ;/ / Die Ausgabe wird um 90 Grad gedreht, wobei die vertikale Bildschirmaufzeichnung beibehalten wird. mMediaRecorder.prepare(); try { mMediaRecorder.start(); } Catch (IllegalStateException e) { e.printStackTrace(); } Catch (Exception e) { e.printStackTrace (); } } /** * Videoaufnahme starten* * @author liuyinjun * @date 2015-2-5 * @param fileName * Videospeicherort * @param onRecordFinishListener * Callback-Schnittstelle nach Erreichen der angegebenen Zeit */ public void record(final OnRecordFinishListener onRecordFinishListener) { this.mOnRecordFinishListener = onRecordFinishListener; try { if (! isOpenCamera)//Wenn die Kamera nicht eingeschaltet ist, öffnen Sie initCamera(); initRecord(); mTimeCount = 0; // Zeitzähler neu zuweisen mTimer.schedule(new TimerTask() { @Override public void run() { // TODO Automatisch generierter Methoden-Stub mTimeCount++; mProgressBar. setProgress(mTimeCount);//Legen Sie den Fortschrittsbalken fest, wenn (mTimeCount == mRecordMaxTime) {// Wenn die angegebene Zeit erreicht ist, stoppen Sie die Aufnahme stop(); if (mOnRecordFinishListener != null) mOnRecordFinishListener.onRecordFinish(); 0, 1000; /** * Hör auf zu schießen * * @author liuyinjun * @date 2015-2-5 */ public void stop() { stopRecord(); releaseRecord(); freeCameraResource(); } /** * Aufnahme stoppen* * @author liuyinjun */ public void stopRecord() { mProgressBar.setProgress(0); mTimer != null) mTimer.cancel(); if (mMediaRecorder != null) { // Es stürzt nach dem Festlegen nicht ab. mMediaRecorder.setPreviewDisplay(null); try { mMediaRecorder.stop(); { e.printStackTrace(); .printStackTrace(); } Catch (Exception e) { e.printStackTrace(} } } /** * Ressourcen freigeben * * @author liuyinjun * @date 2015-2-5 */ private void releaseRecord() { if (mMediaRecorder != null) { mMediaRecorder.setOnErrorListener(null); try { mMediaRecorder.release(); ; } Catch (IllegalStateException e) { e.printStackTrace( } Catch (Exception e) { e.printStackTrace(); } mMediaRecorder = null; } public int getTimeCount() { return mVecordFile */ public File getmVecordFile() { return mVecordFile; Schnittstelle * * @author liuyinjun * * @date 2015-2-5 */ öffentliche Schnittstelle OnRecordFinishListener { public void onRecordFinish(); } @Override public void onError(MediaRecorder mr, int what, int extra) { try { if (mr != null) mr.reset(); } Catch (IllegalStateException e) { e.printStackTrace (); } Catch (Ausnahme e) { e.printStackTrace();
movie_recorder_view.xml
<?xml version="1.0" binding="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" binding="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>
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.