2016-08-20 2 views
0

Я не вижу ничего плохого в своем коде, но всякий раз, когда я проверяю размер сжатого файла в целевом местоположении, я вижу только, что размер файла был уменьшен только на 2 или 3 КБ, что слишком мало для большие файлы масштабируются примерно до 650 МБ.Как сжать большие файлы с помощью DeflaterOutputStream?

public static void main(String[] args) throws Exception 
    { 
    FileInputStream fin = new FileInputStream("filetobecompressed.mp4"); 
    FileOutputStream fout = new FileOutputStream("compressedfile.mp4"); 
    DeflaterOutputStream dout = new DeflaterOutputStream(fout); 
    byte b[] = new byte[8192]; 
    int r; 
    float tracker = 0; 
    while((r=fin.read(b))!=-1) 
    { 
     dout.write(b,0,r); 
     dout.flush(); 
     tracker += (float)r/1000000f; 
     System.out.println(tracker + "MB compressed"); 
    } 
    dout.finish(); 
    fin.close(); 
    fout.close(); 
    dout.close(); 
    System.out.println("Compression successful"); 
} 

Заранее спасибо.

+0

BTW каждый раз, когда вы вызываете 'flush()' вы добавляете бит данных со сжатыми файлами. Он приводит к заключению все, над чем он работает в этот момент. –

ответ

2

Вы не сможете сжать файл MP4. Формат (ы) файла MP4 обычно выполняет собственное сжатие, поэтому нет избыточности для общего (без потерь) компрессора для устранения.

Попробуйте сжать тот же файл с помощью утилиты сжатия командной строки. Я предсказываю, что у вас будет минимальное сжатие.

Единственный способ, которым вы могли бы получить дальнейшее сжатие для (уже) сжатого аудио/видеофайла, - использовать кодеки для форматирования для распаковки, а затем повторно сжимать при более низком качестве. Очевидно, вы жертвуете качеством аудио/видео при этом.

Смежные вопросы