在 Android 中录制、保存和播放视频

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10278865/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 03:07:28  来源:igfitidea点击:

Record, save and play a video in Android

androidandroid-camera

提问by Vikas Gupta

I am trying to make an app that records a video using the camera app, and then saves that video on SD card so I can play it. I have some code but I'm lost on how to continue as I'm a beginner in Android.

我正在尝试制作一个使用相机应用程序录制视频的应用程序,然后将该视频保存在 SD 卡上以便我可以播放它。我有一些代码,但由于我是 Android 初学者,我不知道如何继续。

My Activity:

我的活动:

public class Camcorder extends Activity {

     private CamcorderView camcorderView; 
     private boolean recording = false; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
          super.onCreate(savedInstanceState);
          //irrelevant code

          camcorderView = (CamcorderView) findViewById(R.id.camcorder_preview); 
     } 

     @Override 
     public boolean onKeyDown(int keyCode, KeyEvent event) 
     { 
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) 
         { 
          if (recording) { 
                camcorderView.stopRecording();
                finish(); 
            } else { 
                recording = true; 
                camcorderView.startRecording(); 
            } 
             return true; 
         } 
         return super.onKeyDown(keyCode, event); 
     }       
}

CamcorderView class:

摄像机视图类:

public class CamcorderView extends SurfaceView implements
    SurfaceHolder.Callback {

MediaRecorder recorder;
SurfaceHolder holder;
String outputFile = "/sdcard/default.mp4";

public CamcorderView(Context context, AttributeSet attrs) {
    super(context, attrs);

    holder = getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    // recorder.setVideoSize(480, 320);
    // recorder.setVideoFrameRate(15);
    // recorder.setMaxDuration(10000);
}

public void surfaceCreated(SurfaceHolder holder) {
    recorder.setOutputFile(outputFile);
    recorder.setPreviewDisplay(holder.getSurface());
    if (recorder != null) {
        try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            Log.e("IllegalStateException", e.toString());
        } catch (IOException e) {
            Log.e("IOException", e.toString());
        }
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
}

public void surfaceDestroyed(SurfaceHolder holder) {
}

public void setOutputFile(String filename)
{
    outputFile = filename;
    recorder.setOutputFile(filename);
}

public void startRecording()
{
    recorder.start();
}

public void stopRecording()
{
    recorder.stop();
    recorder.release();
}
}

回答by Syeda Zunaira

Well its very simple to record videos in android by using this simple code

那么使用这个简单的代码在android中录制视频非常简单

First on a button click simple start an Intent

首先在按钮上单击简单的启动一个意图

Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
            if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
                startActivityForResult(takeVideoIntent,
                        CAMERA_REQUEST_CODE_VEDIO);
            }

than onActivityResultmethod

onActivityResult方法

Uri videoUri = data.getData();
                path = Utils.getRealPathFromURI(videoUri, this);
                manageVideo(path);///What ever you want to do with your vedio

and finally add permissions to the menifest

最后为清单添加权限

<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />

Hope it help others who are looking for help :)

希望它可以帮助正在寻求帮助的其他人:)

Thanks

谢谢

回答by Makvin

Uri contentUri="You record video uri";

try {
                                        Date date= new Date();
                                        android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", date);
                                        String Video_DIRECTORY = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + getString(R.string.app_name) + "/video/";
                                        File storeDirectory = new File(Video_DIRECTORY);

                                        try {
                                            if (storeDirectory.exists() == false) {
                                                storeDirectory.mkdirs();
                                            }


                                        } catch (Exception e) {
                                            e.printStackTrace();

                                        }
                                        File storeDirectory12 = new File(storeDirectory,date+".mp4");
                                        InputStream inputStream = getContentResolver().openInputStream(contentUri);
                                        FileOutputStream fileOutputStream = new FileOutputStream(storeDirectory12);
                                        copyStream(inputStream, fileOutputStream);
                                        fileOutputStream.close();
                                        inputStream.close();
                                    } catch (FileNotFoundException e) {
                                        Log.e("Exception", "" + e);
                                    } catch (IOException e) {
                                        Log.e("Exception", "" + e);
                                    }

回答by Dhananjay

    // Put this code in ,on Button click or in onCreate to Capture the Video 


  Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    videoUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
    startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);

  ////////////////////////////////


private static Uri getOutputMediaFileUri(int type){
    return Uri.fromFile(getOutputMediaFile(type));
}

private static File getOutputMediaFile(int type){
    // Check that the SDCard is mounted
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory() +"/YourDirectoryName");
    // Create the storage directory(MyCameraVideo) if it does not exist
    if (! mediaStorageDir.exists()){

        if (! mediaStorageDir.mkdirs()){

            Log.d("MyCameraVideo", "Failed to create directory MyCameraVideo.");
            return null;
        }
    }

    // Create a media file name
    // For unique file name appending current timeStamp with file name
    java.util.Date date= new java.util.Date();
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(date.getTime());

    File mediaFile;
    if(type == MEDIA_TYPE_VIDEO) {

        // For unique video file name appending current timeStamp with file name
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "VID_"+ timeStamp + ".mp4");

    } else {
        return null;
    }

    return mediaFile;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // After camera screen this code will execute
    if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE ) {

        if (resultCode == RESULT_OK) {
            videoUri = data.getData();

            // Video captured and saved to fileUri specified in the Intent
          //  Toast.makeText(getActivity(), "Video saved to: " +data.getData(), Toast.LENGTH_LONG).show();

        } else if (resultCode == RESULT_CANCELED) {

            // User cancelled the video capture
            Toast.makeText(getActivity(), "User cancelled the video capture.", Toast.LENGTH_LONG).show();

        } else {
           // Video capture failed, advise user
            Toast.makeText(getActivity(), "Video capture failed.", Toast.LENGTH_LONG).show();
        }
    }
}