2013-09-08 4 views
0

Мне нужно уменьшить разрешение видео для некоторого файла mp4, и я решил использовать jcodec. Я попытался найти пример, как это сделать, но не нашел примеров. Любая информация об этом будет полезна.Как изменить разрешение видео с помощью jcodec

+0

Помог некоторые исследования и jcodec было не сделано для андроид, и вы получите много проблем .. Вы должны использовать: HTTP: // stackoverflow.com/questions/2645041/ffmpeg-for-a-android-using-tutorial-ffmpeg-and-android-mk –

+0

'jcodec не был создан для android' - [это неверно] (http: // jcodec .org/новости/no_deps.html). Также я не могу использовать 'ffmpeg', потому что я отправлю приложение на Blackberry10 – CAMOBAP

ответ

2

Я тоже искал ответ, но ничего не нашел.

Итак, я просмотрел код и понял, что масштабирование растрового изображения до передачи его в JCodec решает проблему.

Вот класс, который я использую. Обратите внимание, что это код для Android, в котором используется последний JCodec для Android.

public class DDVideoEncoder { 

    private static final String TAG = DDVideoEncoder.class.getSimpleName(); 

    private SequenceEncoder encoder; 


    public DDVideoEncoder(String filepath) throws IOException, OutOfMemoryError { 
     File out = new File(filepath); 
     encoder = new SequenceEncoder(out); 

    } 

    // returns false on out of memory error. 
    public Boolean addFrame(String filePath, int newSize) throws IOException { 

     // newSize indicates size of bitmap in percent 
     Bitmap bi = getResizedBitmap(filePath, newSize); 

     try { encoder.encodeImage(bi); } 
     catch (OutOfMemoryError outOfMemoryError) { Log.d(TAG, "encodeImage:" + outOfMemoryError); return false; } 
     catch (NullPointerException nil) { Log.d(TAG, "encodeImage:"+nil); return false; } 
     return true; 

    } 

    public void finishEncoding(){ 
     try { encoder.finish(); } 
     catch (IOException io) { 
      Log.d("DDVideoEncoder", "IOException"); } 
    } 

    // newSize indicates size of bitmap in percent of original. 
    //decodes image and scales it to reduce memory consumption 
    private Bitmap getResizedBitmap(String filePath, int newSize) { 

     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     //BitmapFactory.decodeStream(new FileInputStream(f),null,o); 
     BitmapFactory.decodeFile(filePath, o); 

     //The new size we want to scale to 
     final int REQUIRED_SIZE=newSize*10; 

     //Find the correct scale value. It should be the power of 2. 
     int scale=1; 
     while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE) 
      scale*=2; 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     //return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
     return BitmapFactory.decodeFile(filePath, o2); 
    } 
} 

И тогда вы можете использовать этот класс, как это:

try { 
    DDVideoEncoder tmpEncoder = new DDVideoEncoder(dir+vidName); 

    // write x frames 
    Log.d("test", "adding frame"); 

    try { tmpEncoder.addFrame(path, 50); } 
    catch (OutOfMemoryError outOfMemoryError){ Log.d("test", "oom"); break; } 
    catch (IOException io) { Log.d("CactusMemChecker", io.getMessage()); break; } 
    catch (IndexOutOfBoundsException oob) { Log.d("test", "oob"); break; } 

    // finish up 
    tmpEncoder.finishEncoding(); 

} catch (IOException e) { 
    Log.d("test", e.getMessage()); 
    testResult = false; 
} catch (OutOfMemoryError e) { 
    Log.d("test", e.getMessage()); 
    testResult = false; 
} catch (IndexOutOfBoundsException e) { 
    Log.d("test", e.getMessage()); 
    testResult = false; 
} 
+0

спасибо за ответ. Мне нужно некоторое время, чтобы попробовать его – CAMOBAP

+0

Что такое путь в 'tmpEncoder.addFrame (путь, 50);'? –

+0

Путь к растровому изображению – r0ber7