【问题标题】:How to save video taken from VideoView to external SD card?如何将 VideoView 拍摄的视频保存到外部 SD 卡?
【发布时间】:2015-02-21 04:34:38
【问题描述】:

我正在尝试保存一个视频,我已经成功捕获并放入我的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();
                }

            }
        });
    }

【问题讨论】:

  • 你能从 VideoView 获取视频吗?
  • 是的,它显示在VideoView,但它没有保存在任何地方,所以当我杀死应用程序时它消失了。
  • 从本地存储或使用网络播放 VideoView 中的视频?
  • 它来自相机。一些代码,它只是使用 Android 相机捕获视频,并在我回到我的活动后立即播放。但是从那里开始,我试图通过单击它来保存它。
  • 我在文档中唯一能找到的是“保存媒体文件”,但它并不完整。他们在这里创建了一个目录和一个文件名,但我不知道如何实际保存它。另外,所有视频都是Uri吗?我不需要设置类型(mp4)或其他东西吗?只是不确定。 developer.android.com/guide/topics/media/…

标签: android android-sdcard android-file android-videoview


【解决方案1】:

事实证明,这存在多个问题。第一个是您不能将OnClickListenerVideoView 一起使用,它必须是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;
            }
        });
    }

【讨论】:

  • 你有什么设备API?可能是目录问题。我发现在不同的设备上都是如此。例如,某些设备可能没有名为“电影”的目录。但是如果你能够创建一个文件,那么只有这样才能success = true。因此,如果您要成功祝酒,那么您的文件可能位于您不知道的 SD 卡中的某个位置。
  • 你从来没有在这里使用过uriVideo
  • 嗨@PriyankaSingh,您的问题似乎已得到解答。祝你好运。
  • @enadun 抱歉,代码一定被截断了。现在是很久以前了,我没有代码了。 :(
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 2021-01-07
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
相关资源
最近更新 更多