Android 仅在最后2分钟保存录制的视频
如果我拍摄一个10分钟的视频,我希望只有视频的最后2分钟会保存在手机中,而不是整个10分钟。我该怎么做 当每次我按下按钮开始录制时,它会保存2分钟的视频,然后再按下按钮启动录像机时,它会保存2分钟的视频???,我该怎么做Android 仅在最后2分钟保存录制的视频,android,Android,如果我拍摄一个10分钟的视频,我希望只有视频的最后2分钟会保存在手机中,而不是整个10分钟。我该怎么做 当每次我按下按钮开始录制时,它会保存2分钟的视频,然后再按下按钮启动录像机时,它会保存2分钟的视频???,我该怎么做 package com.example.checkvidio; import android.app.Activity; import java.io.IOException; import java.text.SimpleDateFormat; import java.ut
package com.example.checkvidio;
import android.app.Activity;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Toast;
public class VideoWithSurfaceVw extends Activity{
//Starter Tutorial: http://sandyandroidtutorials.blogspot.co.uk/2013/05/android-video-capture-tutorial.html
private Camera myCamera;
private MyCameraSurfaceView myCameraSurfaceView;
private MediaRecorder mediaRecorder;
public static int orientation;
Button myButton;
SurfaceHolder surfaceHolder;
boolean recording;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recording = false;
setContentView(R.layout.activity_main);
//Get Camera for preview
myCamera = getCameraInstance();
//myCamera.setDisplayOrientation(90); //Doesn't error here, but doesn't affect video.
if(myCamera == null){
Toast.makeText(VideoWithSurfaceVw.this,
"Fail to get Camera",
Toast.LENGTH_LONG).show();
}
myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera,this);
FrameLayout myCameraPreview = (FrameLayout)findViewById(R.id.videoview);
myCameraPreview.addView(myCameraSurfaceView);
myButton = (Button)findViewById(R.id.mybutton);
myButton.setOnClickListener(myButtonOnClickListener);
}
Button.OnClickListener myButtonOnClickListener
= new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try{
if(recording){
// stop recording and release camera
mediaRecorder.stop(); // stop the recording
releaseMediaRecorder(); // release the MediaRecorder object
//Exit after saved
//finish();
myButton.setText("REC");
recording = false;
}else{
//Release Camera before MediaRecorder start
releaseCamera();
if(!prepareMediaRecorder()){
Toast.makeText(VideoWithSurfaceVw.this,
"Fail in prepareMediaRecorder()!\n - Ended -",
Toast.LENGTH_LONG).show();
finish();
}
mediaRecorder.start();
recording = true;
myButton.setText("STOP");
}
}catch (Exception ex){
ex.printStackTrace();
}
}};
private Camera getCameraInstance(){
// TODO Auto-generated method stub
Camera c = null;
try {
c = Camera.open(0); // attempt to get a Camera instance
}
catch (Exception e){
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}
private boolean prepareMediaRecorder(){
myCamera = getCameraInstance();
// set the orientation here to enable portrait recording.
setCameraDisplayOrientation(this,0,myCamera);
mediaRecorder = new MediaRecorder();
myCamera.unlock();
mediaRecorder.setCamera(myCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
mediaRecorder.setOutputFile("/sdcard/myvideo1.mp4");
mediaRecorder.setMaxDuration(60000); // Set max duration 60 sec.
mediaRecorder.setMaxFileSize(50000000); // Set max file size 50Mb
mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface());
mediaRecorder.setOrientationHint(VideoWithSurfaceVw.orientation);
try {
mediaRecorder.prepare();
} catch (IllegalStateException e) {
releaseMediaRecorder();
return false;
} catch (IOException e) {
releaseMediaRecorder();
return false;
}
return true;
}
@Override
protected void onPause() {
super.onPause();
releaseMediaRecorder(); // if you are using MediaRecorder, release it first
releaseCamera(); // release the camera immediately on pause event
}
private void releaseMediaRecorder(){
if (mediaRecorder != null) {
mediaRecorder.reset(); // clear recorder configuration
mediaRecorder.release(); // release the recorder object
mediaRecorder = new MediaRecorder();
myCamera.lock(); // lock camera for later use
}
}
private void releaseCamera(){
if (myCamera != null){
myCamera.release(); // release the camera for other applications
myCamera = null;
}
}
public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mHolder;
private Camera mCamera;
private Activity mActivity;
public MyCameraSurfaceView(Context context, Camera camera,Activity activity) {
super(context);
mCamera = camera;
mActivity=activity;
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
try {
setCameraDisplayOrientation(mActivity,0,mCamera);
previewCamera();
} catch (Exception e) {
e.printStackTrace();
}
}
public void previewCamera()
{
try
{
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
}
catch(Exception e)
{
//Log.d(APP_CLASS, "Cannot start preview", e);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
// The Surface has been created, now tell the camera where to draw the preview.
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing`enter code here`
result = (info.orientation - degrees + 360) % 360;
}
VideoWithSurfaceVw.orientation=result;
camera.setDisplayOrientation(result);
您可以设置2分钟后自动停止录像的限制。
或者,如果您想执行Android没有提供任何API的视频操作(如croping或trimming),您必须使用第三方库(如FFMPEG)。您可以设置限制,在2分钟后视频录制自动停止。
或者,如果您想执行Android没有提供任何API的视频操作(如croping或trimming),您必须使用第三方库(如FFMPEG)。您可以在谷歌和stackoverflow上的Android中找到FFMPEG库及其集成步骤。你也可以在一些博客上找到更多关于这方面的信息。事实上,我也在为此写博客。亲爱的Hardik Chauhan我需要一个视频文件,可以连续开始录制,但只连续保存2分钟的视频,并覆盖数据。你能问一下吗,没有完全了解您。我希望我的应用程序在一个文件上连续录制摄像头视频,该文件将成为视频文件,但长度不应超过2分钟,当我按下停止按钮并播放视频文件时,我将获得上次录制的视频的最后两分钟的视频。为此,您必须使用FFMPEG或其他视频库裁剪最后2分钟的视频。你可以在谷歌和stackoverflow上的android中找到FFMPEG库及其集成步骤。你也可以在一些博客上找到更多关于这方面的信息。事实上,我也在为此写博客。亲爱的Hardik Chauhan我需要一个视频文件,可以连续开始录制,但只连续保存2分钟的视频,并覆盖数据。你能问一下吗,没有完全了解您。我希望我的应用程序在一个文件上连续录制摄像头视频,该文件将成为视频文件,但长度不应超过2分钟,当我按下停止按钮并播放视频文件时,我将获得上次录制的视频的最后两分钟的视频。为此,您必须使用FFMPEG或其他视频库裁剪最后2分钟的视频。