Массив растровых изображений в видео с помощью ffmpeg - PullRequest
0 голосов
/ 14 февраля 2020

Я сталкиваюсь с текущей проблемой. У меня есть массив из 100 растровых изображений. это скриншоты, которые я взял из вида. Я использовал JCode c, чтобы сделать это для видео, но оно замедляется. Я надеюсь получить лучшие результаты с FFmpeg

Теперь я хочу использовать библиотеку FFmpeg. Были заданы вопросы Simillar, но я понятия не имею, как использовать ffmpeg и как мне использовать его в моем конкретном случае c. Все, что я вижу, это странные сложные команды. См .:

 File dir = your directory where image stores;
    String filePrefix = "picture"; //imagename prefix
    String fileExtn = ".jpg";//image extention
    filePath = dir.getAbsolutePath();
    File src = new File(dir, filePrefix + "%03d" + fileExtn);// image name should ne picture001, picture002,picture003 soon  ffmpeg takes as input valid

complexCommand = new String [] {"- i", sr c + "", "- c: v", "libx264", "- c: a", "aa c", "-vf", "setpts = 2 * PTS", "-pix_fmt", "yuv420p", "-crf", "10" , "-r", "15", "-shortest", "-y", "/ storage / emulated / 0 /" + app_name + "/ Video /" + app_name + "_Video" + number + ".mp4" };

Проблема в том, что в этом случае он использует путь. Мне нужно, чтобы это было из массива. И я понятия не имею, что делать со строкой (ComplexCommands): / Мои растровые изображения выглядят так:

Растровое изображение [] Растровые изображения = новые растровые изображения [100];

это будет заполнено позже .

, если кто-то ищет, как это сделать с JCode c:

 try {
                    out = NIOUtils.writableFileChannel( Environment.getExternalStorageDirectory().getAbsolutePath()+"/***yourpath***/output"+System.currentTimeMillis()+".mp4");
                    // for Android use: AndroidSequenceEncoder

                    AndroidSequenceEncoder encoder = new AndroidSequenceEncoder(out, Rational.R(25, 1));
                    for (int i = 0 ; i < 100 ; i++) {
                        // Generate the image, for Android use Bitmap

                        // Encode the image
                        System.out.println("LOO2P"+i);
                        encoder.encodeImage(bitmaps[i]);
                    }
                    // Finalize the encoding, i.e. clear the buffers, write the header, etc.
                    encoder.finish();

                } catch (FileNotFoundException e) {
                    System.out.println("fNF");
                    e.printStackTrace();

                } catch (IOException e) {
                    System.out.println("IOE");
                    e.printStackTrace();
                } finally {
                    System.out.println("IOSSE");
                    NIOUtils.closeQuietly(out);
                }

1 Ответ

0 голосов
/ 14 февраля 2020

Согласно вики ffmpeg , описанный вами способ - именно то, как это должно быть сделано. Чтобы реализовать это, вы должны записать каждое изображение из вашего массива в один файл в соответствии с описанными соглашениями об именах. Я не знаю, поможет ли это с вашими проблемами производительности, хотя. Запись изображений в файлы может быть выполнена следующим образом: этот ответ:

for (int i = 0; i<bitmapArray.length(); i++){
    // Write to file while incrementing the file name
    writeToFile(bitmapArray[i], i);
}

Насколько я мог найти, ffmpeg не поддерживает прямое кодирование из массива.

...