如何将 VideoView 拍摄的视频保存到外置 SD 卡?
How to save video taken from VideoView to external SD card?
我正在尝试保存视频,我已经成功捕获并放入我的 VideoView
到我的 SD 卡中。进行了大量研究,但我发现没有任何简单直接的方法可以解决我的问题。
我能够将照片保存到 SD 卡,使用非常相似的代码(除了不是 Uri
参数,而是 Bitmap
参数),所以我认为代码应该是相似的,但有一部分(我认为?)缺失,图像通常会在其参数中压缩图像,视频不会压缩,所以我的代码 uriVideo.setOutputFile(video.getPath());
中有一行是错误的(红色错误) .但这是需要发生一些事情才能使视频适合保存的地方。虽然这只是一个猜测。那就是照片线被压缩的地方。
然后在我的 saveVideo()
方法完成后,我在我的代码的另一个地方的 VideoView
上调用这个方法。
我错过了什么?谢谢...
// save your video to SD card
private void saveVideo(final Uri uriVideo){
// click the video to save it
mVideoView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
boolean success = false;
String root = Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_MOVIES).toString();
File myDir = new File(root + "/Saved iCute Videos");
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String videoName = "Video-"+ n +".mp4";
File file = new File (myDir, videoName);
if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
uriVideo.setOutputFile(video.getPath()); // WRONG
out.flush();
out.close();
success = true;
} catch (Exception e) {
e.printStackTrace();
}
if (success) {
Toast.makeText(getApplicationContext(), "Video saved!",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(),
"Error during video saving", Toast.LENGTH_LONG).show();
}
}
});
}
事实证明这有多个问题。第一个是 OnClickListener
不能与 VideoView
一起使用,它必须是 OnTouchListener
。然后,我必须得到一个绝对路径,而不仅仅是一个简单的 getPath()
。然后再写一行,我必须在创建文件对象的目录和名称后调用 createNewFile()。甚至不需要任何其他文件 I/O 代码。
最后的工作方法是:
// save your video to SD card
protected void saveVideo(final Uri uriVideo){
// click the video to save it
mVideoView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
boolean success = false;
// make the directory
File vidDir = new File(android.os.Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_MOVIES) + File.separator + "Saved iCute Videos");
vidDir.mkdirs();
// create unique identifier
Random generator = new Random();
int n = 100;
n = generator.nextInt(n);
// create file name
String videoName = "Video_" + n + ".mp4";
File fileVideo = new File(vidDir.getAbsolutePath(), videoName);
try {
fileVideo.createNewFile();
success = true;
} catch (IOException e) {
e.printStackTrace();
}
if (success) {
Toast.makeText(getApplicationContext(), "Video saved!",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(),
"Error during video saving", Toast.LENGTH_LONG).show();
}
return true;
}
});
}
我正在尝试保存视频,我已经成功捕获并放入我的 VideoView
到我的 SD 卡中。进行了大量研究,但我发现没有任何简单直接的方法可以解决我的问题。
我能够将照片保存到 SD 卡,使用非常相似的代码(除了不是 Uri
参数,而是 Bitmap
参数),所以我认为代码应该是相似的,但有一部分(我认为?)缺失,图像通常会在其参数中压缩图像,视频不会压缩,所以我的代码 uriVideo.setOutputFile(video.getPath());
中有一行是错误的(红色错误) .但这是需要发生一些事情才能使视频适合保存的地方。虽然这只是一个猜测。那就是照片线被压缩的地方。
然后在我的 saveVideo()
方法完成后,我在我的代码的另一个地方的 VideoView
上调用这个方法。
我错过了什么?谢谢...
// save your video to SD card
private void saveVideo(final Uri uriVideo){
// click the video to save it
mVideoView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
boolean success = false;
String root = Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_MOVIES).toString();
File myDir = new File(root + "/Saved iCute Videos");
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String videoName = "Video-"+ n +".mp4";
File file = new File (myDir, videoName);
if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
uriVideo.setOutputFile(video.getPath()); // WRONG
out.flush();
out.close();
success = true;
} catch (Exception e) {
e.printStackTrace();
}
if (success) {
Toast.makeText(getApplicationContext(), "Video saved!",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(),
"Error during video saving", Toast.LENGTH_LONG).show();
}
}
});
}
事实证明这有多个问题。第一个是 OnClickListener
不能与 VideoView
一起使用,它必须是 OnTouchListener
。然后,我必须得到一个绝对路径,而不仅仅是一个简单的 getPath()
。然后再写一行,我必须在创建文件对象的目录和名称后调用 createNewFile()。甚至不需要任何其他文件 I/O 代码。
最后的工作方法是:
// save your video to SD card
protected void saveVideo(final Uri uriVideo){
// click the video to save it
mVideoView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
boolean success = false;
// make the directory
File vidDir = new File(android.os.Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_MOVIES) + File.separator + "Saved iCute Videos");
vidDir.mkdirs();
// create unique identifier
Random generator = new Random();
int n = 100;
n = generator.nextInt(n);
// create file name
String videoName = "Video_" + n + ".mp4";
File fileVideo = new File(vidDir.getAbsolutePath(), videoName);
try {
fileVideo.createNewFile();
success = true;
} catch (IOException e) {
e.printStackTrace();
}
if (success) {
Toast.makeText(getApplicationContext(), "Video saved!",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(),
"Error during video saving", Toast.LENGTH_LONG).show();
}
return true;
}
});
}