android视频实时监控并需要保存视频文件到本地

移动开发 码拜 7年前 (2015-11-25) 1742次浏览
为什么视频保存到本地是空的文件,是不是与Camera冲突还是什么的 ?

public class SocketCamera extends SurfaceView implements
		Camera.PreviewCallback, SurfaceHolder.Callback {
	public SocketCamera(Context arg0) {
		super(arg0);
	}
	private SurfaceHolder mSurfaceHolder = null;
	private Camera mCamera = null;
	private File myRecAudioFile;
	private File dir;
	private MediaRecorder recorder;
	public String sdcardDir = "/mnt/extsd/video/";
	/** 服务器名称 */
	private String pUsername = "XZY";
	/** 视频质量 */
	private int VideoQuality = 85;
	/** 发送视频宽度比例 */
	private float VideoWidthRatio = 100;
	/** 发送视频高度比例 */
	private float VideoHeightRatio = 100;
	/** 发送视频分辨率宽度 */
	private int VideoWidth = 0;
	/** 发送视频分辨率高度 */
	private int VideoHeight = 0;
	/** 视频格式索引 */
	private int VideoFormatIndex = 0;
	public void init(int Width, int Height) {
		VideoHeight = Height;
		VideoWidth = Width;
		mSurfaceHolder = getHolder();
		mSurfaceHolder.addCallback(this);
		mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		VideoWidthRatio = VideoWidthRatio / 100f;
		VideoHeightRatio = VideoHeightRatio / 100f;
		new MySendCommondThread("PHONECONNECT|" + pUsername + "|").start();
		if (recorder == null) {
			recorder = new MediaRecorder();
		}
		InitCamera();
		recorder();
	}
	private void InitCamera() {
		try {
			mCamera = Camera.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void recorder() {
		dir = new File(sdcardDir);
		if (!dir.exists()) {
			dir.mkdir();
		}
		try {
			myRecAudioFile = File
					.createTempFile("SP"+ new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date(System.currentTimeMillis())),".3gp", dir);// 创建临时文件
			// recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //
			// 录音源为麦克风
			// recorder.setMaxDuration(10000);// 最大期限
			recorder.setCamera(mCamera);
			recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 从照相机采集视频
			recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
			recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);// 设置视频编码方式
			recorder.setVideoSize(320, 240);
			recorder.setVideoFrameRate(20); // 每秒20帧
			// recorder.setPreviewDisplay(mSurfaceHolder.getSurface());// 预览
			recorder.setOutputFile(myRecAudioFile.getAbsolutePath());// 保存路径
			recorder.prepare();
			recorder.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		if (mCamera == null) {
			return;
		}
		mCamera.stopPreview();
		mCamera.setPreviewCallback(this);
		Camera.Parameters parameters = mCamera.getParameters();
		Size size = parameters.getPreviewSize();
		VideoWidth = size.width;
		VideoHeight = size.height;
		VideoFormatIndex = parameters.getPreviewFormat();
		mCamera.startPreview();

	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		try {
			if (mCamera != null) {
				mCamera.setPreviewDisplay(mSurfaceHolder);
				mCamera.startPreview();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		if (null != mCamera) {
			mCamera.setPreviewCallback(null);
			mCamera.stopPreview();
			mCamera.release();
			mCamera = null;
		}
		if (null != recorder) {
			recorder.stop();
			recorder.reset();
			recorder.release();
			recorder = null;
		}
	}
	@Override
	public void onPreviewFrame(byte[] data, Camera camera) {
		// TODO Auto-generated method stub
		try {
			if (data != null) {
				YuvImage image = new YuvImage(data, VideoFormatIndex,
						VideoWidth, VideoHeight, null);
				if (image != null) {
					ByteArrayOutputStream outstream = new ByteArrayOutputStream();
					image.compressToJpeg(new Rect(0, 0,
							(int) (VideoWidthRatio * VideoWidth),
							(int) (VideoHeightRatio * VideoHeight)),
							VideoQuality, outstream);
					outstream.flush();
					Thread th = new MySendFileThread(outstream, pUsername,
							Constant.SRVIP, 8511);
					th.start();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明android视频实时监控并需要保存视频文件到本地
喜欢 (1)
[1034331897@qq.com]
分享 (0)