在 Android 中捕获和录制新的视频文件

Capturing and recording new video files in Android

我有一个捕捉视频的应用程序,我已经设法将它保存在设备库中的视频文件中。

我唯一的问题是,当我录制新视频时,它只是覆盖了之前的文件。我试图寻找解决方案,但找不到在不覆盖以前的视频的情况下录制新视频的方法。

我的class是:

public class CameraVideoActivity extends Activity {

private final int VIDEO_REQUEST_CODE = 100;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera_video);
}

public void captureVideo(View view)
{
    Intent camera_intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    File video_file = getFilepath();
    Uri uri = FileProvider.getUriForFile(CameraVideoActivity.this, 
    BuildConfig.APPLICATION_ID + ".provider",video_file);
    camera_intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    camera_intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
    startActivityForResult(camera_intent, VIDEO_REQUEST_CODE);
    sendBroadcast(camera_intent);

    MediaScannerConnection.scanFile(CameraVideoActivity.this, new String[]{video_file.toString()}, null,
            new MediaScannerConnection.OnScanCompletedListener() 
            {
                public void onScanCompleted(String path, Uri uri) 
                {
                    Log.i("External Storage", "Scanned" + path + ":");
                    Log.i("External Storage", "-> uri=" + uri);
                }
            });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == VIDEO_REQUEST_CODE)
    {
        if (resultCode == RESULT_OK)
        {
            Toast.makeText(getApplicationContext(), "Video Successfully Recorded", Toast.LENGTH_LONG).show();
        }
        else
        {
            Toast.makeText(getApplicationContext(), "Video Not Recorded", Toast.LENGTH_LONG).show();
        }
    }
}

public File getFilepath()
{
    File root=new 
    File(Environment.getExternalStorageDirectory(),"/RecordedVideo/");  
    //you can replace RecordVideo by the specific folder where you want 
     to save the video
    if (!root.exists()) 
      {
        System.out.println("No directory");
        root.mkdirs();
      }

    File video_file = new File(root, "sample_video.mp4");
    return video_file;
}
}

您有 hard-coded 个输出目标。

作为一个选项,您可以向 getFilePath() 方法添加逻辑以管理文件名。

在您代码的 getFilepath() 方法中,File video_file = new File(root, "sample_video.mp4"); 总是 returns 同一个文件。因此之前的文件被覆盖。

你可以做的是,使用 current-epoch-time 作为文件名。也就是可以替换语句

File video_file = new File(root, "sample_video.mp4");

File video_file = new File(root, "sample_video_" + System.currentTimeMillis() + ".mp4");

因此每个文件都会有一个格式为 sample_video_<current_epoch_time>.mp4 的名称,最后一个文件不会被覆盖。