Android 在线 MP4 视频下载后损坏

发布于 2024-10-23 18:11:10 字数 2029 浏览 1 评论 0原文

我正在开发一个循环播放视频文件的应用程序。到目前为止,我只是安装设备并将视频文件复制到 SD 卡上,然后使用文件路径在我的 VideoView 上启动它。我正在尝试实现一种可以远程更新其播放的视频的方法,因此我已转向在线存储我的视频。在应用程序内部,我检查本地副本,如果不存在或有更新的副本,则进行下载。我已经在两个不同的视频文件(均为 .mp4)上进行了测试。下载其中一个后,第一次播放,但在尝试再次开始循环时,它告诉我视频无法播放。另一个甚至不会第一次播放,它只是给我一个对话框,说视频无法播放。如果我通过 USB 电缆将这两个文件复制到 SD 卡上,它们都可以在我的应用程序中正常工作。如果我退出我的应用程序并使用其他东西(dropbox)手动下载它们,它们就会起作用,但如果我从我的应用程序中下载它们,它们就不起作用。以下是我用来下载文件的代码:

public static void DownloadFromUrl(String fileName) {  //this is the downloader method
    try {
        URL url = new URL("http://dl.dropbox.com/u/myfile.mp4"); 
        File file = new File(PATH + fileName);
        long startTime = System.currentTimeMillis();
        Log.d(myTag, "download begining");
        Log.d(myTag, "download url:" + url);
        Log.d(myTag, "downloaded file name:" + fileName);


        /* Open a connection to that URL. */
        URLConnection ucon = url.openConnection();
        Log.i(myTag, "Opened Connection");

        /*
         * Define InputStreams to read from the URLConnection.
         */
        InputStream is = ucon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        Log.i(myTag, "Got InputStream and BufferedInputStream");
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos =  new BufferedOutputStream(fos);
        Log.i(myTag, "Got FileOutputStream and BufferedOutputStream");
        /*
         * Read bytes to the Buffer until there is nothing more to read(-1).
         */

        int current = 0;
        Log.i(myTag, "About to write");
        while ((current = bis.read()) != -1) {
            bos.write(current);
        }



        fos.close();
        Log.d(myTag, "download ready in"
                + ((System.currentTimeMillis() - startTime))
                + " sec");
    } catch (IOException e) {
        Log.d(myTag, "Error: " + e);
    }
}

我知道此代码段中的保管箱 url 不正确,我仅针对这篇文章更改了它,在我的应用程序中,url 正确指向文件。创建文件时使用的变量 PATH 是在此代码段之外的代码中设置的。

此代码片段是否有可能损坏我的 mp4 文件?

I am working on an application that plays a video file on a loop. Up until now I was just mounting the device and copying the video file onto the SD card and then using the file path to start it up on my VideoView. I am trying to implement a way that I can remotely update what video it plays so I have moved to storing my video online. Inside the app I check for a local copy and download if it doesn't exist, or if there is a newer one. I have tested it on two different video files both .mp4s. After downloading one of them plays the first time but upon trying to start again for the loop it tells me video cannot be played. The other won't even play the first time, it just gives me the dialog that says the video cannot be played. Both of these files work correctly with my app if I copy them onto the SD card via the USB cable. They work if I exit my app and manually download them with something else(dropbox) but not if I download them from within my app. Here is the code I am using to download the file:

public static void DownloadFromUrl(String fileName) {  //this is the downloader method
    try {
        URL url = new URL("http://dl.dropbox.com/u/myfile.mp4"); 
        File file = new File(PATH + fileName);
        long startTime = System.currentTimeMillis();
        Log.d(myTag, "download begining");
        Log.d(myTag, "download url:" + url);
        Log.d(myTag, "downloaded file name:" + fileName);


        /* Open a connection to that URL. */
        URLConnection ucon = url.openConnection();
        Log.i(myTag, "Opened Connection");

        /*
         * Define InputStreams to read from the URLConnection.
         */
        InputStream is = ucon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        Log.i(myTag, "Got InputStream and BufferedInputStream");
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos =  new BufferedOutputStream(fos);
        Log.i(myTag, "Got FileOutputStream and BufferedOutputStream");
        /*
         * Read bytes to the Buffer until there is nothing more to read(-1).
         */

        int current = 0;
        Log.i(myTag, "About to write");
        while ((current = bis.read()) != -1) {
            bos.write(current);
        }



        fos.close();
        Log.d(myTag, "download ready in"
                + ((System.currentTimeMillis() - startTime))
                + " sec");
    } catch (IOException e) {
        Log.d(myTag, "Error: " + e);
    }
}

I know the dropbox url in this snippet is not correct I changed it only for this post, in my app the url is pointing to a file correctly. And the variable PATH thats used when creating the File is set in my code outside of this snippet.

Is there something about this code snippet that could be corrupting my mp4 files?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

也只是曾经 2024-10-30 18:11:10

该方法以某种方式损坏了文件,我仍然不太确定如何,但我更改了其中的一部分,现在它已修复。

我现在使用这个:

        byte data[] = new byte[1024];
        long total = 0;
        int count;
        while ((count = bis.read(data)) != -1) {
            total += count;
            fos.write(data, 0, count);
        }

        fos.flush();
        fos.close();

而不是旧的 while 循环,并且它可以正常工作。

That method was corrupting the file somehow, I am still not quite sure how but I changed part of it and now it is fixed.

I am now using this:

        byte data[] = new byte[1024];
        long total = 0;
        int count;
        while ((count = bis.read(data)) != -1) {
            total += count;
            fos.write(data, 0, count);
        }

        fos.flush();
        fos.close();

instead of the old while loop and it works correctly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文