Android mp4 видео из интернета портится при загрузке - PullRequest
1 голос
/ 15 марта 2011

Я работаю над приложением, которое воспроизводит видеофайл в цикле.До сих пор я просто монтировал устройство и копировал видеофайл на SD-карту, а затем использовал путь к файлу, чтобы запустить его на моем VideoView.Я пытаюсь реализовать способ удаленного обновления видео, которое оно воспроизводит, поэтому я перешел на хранение своего видео в Интернете.Внутри приложения я проверяю наличие локальной копии и загружаю ее, если она не существует или существует более новая.Я проверил это на двух разных видео файлах .mp4s.После загрузки один из них воспроизводится в первый раз, но при попытке начать цикл снова, он говорит мне, что видео не может быть воспроизведено.Другой даже не воспроизводится в первый раз, он просто дает мне диалог, в котором говорится, что видео не может быть воспроизведено.Оба этих файла корректно работают с моим приложением, если я скопирую их на SD-карту через USB-кабель.Они работают, если я выхожу из приложения и загружаю их вручную с помощью чего-то еще (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-адрес dropbox в этом фрагменте неверен Я изменил его только для этого поста, в моем приложении URL-адрес указывает на файлправильно.И переменная PATH, используемая при создании файла, установлена ​​в моем коде вне этого фрагмента.

Есть ли что-то в этом фрагменте кода, которое может повредить мои файлы mp4?

1 Ответ

2 голосов
/ 15 марта 2011

Этот метод как-то повредил файл, я все еще не совсем уверен, как, но я изменил его часть, и теперь он исправлен.

Я сейчас использую это:

        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, и он работает правильно.

...