Android录制视频(一)
发布日期:2021-06-30 11:22:39 浏览次数:2 分类:技术文章

本文共 5119 字,大约阅读时间需要 17 分钟。

mainActivity如下:

package c.c;import java.io.File;import java.io.IOException;import android.app.Activity;import android.content.pm.ActivityInfo;import android.hardware.Camera;import android.media.MediaRecorder;import android.media.MediaRecorder.OnInfoListener;import android.os.Bundle;import android.os.Environment;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.WindowManager;import android.widget.Button;/** * Demo描述: * 利用SurfaceView拍摄视频,较上一版增加了预览功能. *  * 注意: * 1 严重注意:MediaRecorder参数的设置.因手机不同而有差异 * 2 在设置MediaRecorder的参数时,应先设置: *   setVideoSource(),setAudioSource(),setOutputFormat(),setVideoEncoder(),setAudioEncoder *   然后再设置其余的参数,查看方法对应的API有提示 * 3 错误:mMediaRecorder.setVideoFrameRate(20); *   改正:mMediaRecorder.setVideoFrameRate(15); *   现象:在2.3上正常,4.0上报错 *   原因:每秒12-15帧之间足以表示运动,电视是30. *  * 说明: * 从Android录制视频(五)到Android录制视频(一)难度 * 逐渐上升也渐渐趋于完善. * */public class MainActivity extends Activity implements SurfaceHolder.Callback{	private Button mStartButton;	private Button mStopButton;	private Camera mCamera;	private SurfaceView mSurfaceView;	private SurfaceHolder mSurfaceHolder;	private MediaRecorder mMediaRecorder;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 去掉标题栏        requestWindowFeature(Window.FEATURE_NO_TITLE);        // 设置全屏		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,		WindowManager.LayoutParams.FLAG_FULLSCREEN);		// 设置横屏显示		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);        setContentView(R.layout.main);        init();    }    private void init(){    	mStartButton=(Button) findViewById(R.id.start_button);    	mStartButton.setOnClickListener(new ButtonClickListenerImpl());    	mStopButton=(Button) findViewById(R.id.stop_button);    	mStopButton.setOnClickListener(new ButtonClickListenerImpl());    	mSurfaceView=(SurfaceView) findViewById(R.id.surfaceView);    	mSurfaceHolder=mSurfaceView.getHolder();    	mSurfaceHolder.addCallback(this);    	mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }    private void initMediaRecorder(){    	//next codes is right for 2.3 and 4.0    	mMediaRecorder=new MediaRecorder();    	mMediaRecorder.setCamera(mCamera);    	//设置视频源    	mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);    	//设置音频源    	mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);    	//设置文件输出格式    	mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);    	//设置视频编码方式    	mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);    	//设置音频编码方式    	mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);    	//设置视频高和宽,注意文档的说明:    	//Must be called after setVideoSource().    	//Call this after setOutFormat() but before prepare().    	//设置录制的视频帧率,注意文档的说明:    	//Must be called after setVideoSource().    	//Call this after setOutFormat() but before prepare().    	mMediaRecorder.setVideoFrameRate(15);    	//设置预览画面    	mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());    	//设置输出路径    	mMediaRecorder.setOutputFile    	(Environment.getExternalStorageDirectory()+File.separator+System.currentTimeMillis()+".mp4");    	mMediaRecorder.setVideoSize(800, 480);    	//设置视频的最大持续时间    	mMediaRecorder.setMaxDuration(10000);    	//为MediaRecorder设置监听    	mMediaRecorder.setOnInfoListener(new OnInfoListener() {			public void onInfo(MediaRecorder mr, int what, int extra) {				if (what==MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {					System.out.println("已经达到最长录制时间");					if (mMediaRecorder!=null) {						mMediaRecorder.stop();						mMediaRecorder.release();						mMediaRecorder=null;					}				}							}		});    }        private class ButtonClickListenerImpl implements OnClickListener{		public void onClick(View v) {			if (v.getId()==R.id.start_button) {				try {					initMediaRecorder();					mMediaRecorder.prepare();					mMediaRecorder.start();				} catch (IllegalStateException e) {					e.printStackTrace();				} catch (IOException e) {					e.printStackTrace();				}			} 			if (v.getId()==R.id.stop_button) {				if (mMediaRecorder!=null) {					//mCamera.lock();					mCamera.stopPreview();					mMediaRecorder.stop();					mMediaRecorder.release();					mMediaRecorder=null;				}			}		}    }    //SurfaceHolder.Callback接口	public void surfaceCreated(SurfaceHolder holder) {        System.out.println("SurfaceView---->Created");                try {        	mCamera=Camera.open();			mCamera.setPreviewDisplay(mSurfaceHolder);			mCamera.startPreview();			mCamera.unlock();		} catch (IOException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}	public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {		System.out.println("SurfaceView---->Changed");	}	public void surfaceDestroyed(SurfaceHolder holder) {		System.out.println("SurfaceView---->Destroyed");		if (mMediaRecorder!=null) {			mMediaRecorder.stop();			mMediaRecorder.release();			mMediaRecorder=null;		}	}        }

main.xml如下:

 

转载地址:https://it9527.blog.csdn.net/article/details/8520672 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JNI入门完整详细示例
下一篇:Android录制视频(二)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月19日 22时52分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

autossh 2019-04-30
CUB-200鸟类数据集 2019-04-30
MMLab工具箱 —— Hook机制 2019-04-30
MMLab工具箱 —— Runner类 2019-04-30
动态语言 vs. 静态语言 2019-04-30
Python反射机制 2019-04-30
YAPF —— Python代码格式化工具 2019-04-30
MMOCR——config文件 2019-04-30
NCCL 2019-04-30
pip install git+ 2019-04-30
UGC 用户产生内容 2019-04-30
ranger 2019-04-30
slurm 2019-04-30
xfce4 2019-04-30
xrdp 2019-04-30
Raft算法 2019-04-30
Python计算文本BLEU分数 2019-04-30
swap内存(linux) 2019-04-30
人脸au 2019-04-30
torch.distributed 分布式 2019-04-30