Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Java объединение видеофайлов в один FFmpeg

#java #видео #ffmpeg #javacv


Код:

for (File f : files) {
            FrameGrabber grabber = new FFmpegFrameGrabber(f.getPath());
            grabber.start();
            while ((frame = grabber.grab()) != null) {
                recorder.record(frame);
            }
            grabber.stop();
        }


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


Ответы

Ответ 1



Посмотрите в сторону FfmpegController.concatAndTrimFilesMP4Stream(): package org.ffmpeg.android.test; import java.io.File; import java.util.ArrayList; import java.util.Locale; import net.sourceforge.sox.SoxController; import org.ffmpeg.android.Clip; import org.ffmpeg.android.FfmpegController; import org.ffmpeg.android.ShellUtils; public class ConcatTest { public static void test (String videoRoot, String fileTmpPath, String fileOut, double fadeLen) throws Exception { File fileTmp = new File(fileTmpPath); File fileAppRoot = new File(""); File fileVideoRoot = new File(videoRoot); FfmpegController fc = new FfmpegController(null, fileTmp); SoxController sxCon = new SoxController(null, fileAppRoot, null); ArrayList listVideos = new ArrayList(); String[] fileList = fileVideoRoot.list(); for (String fileVideo : fileList) { if (fileVideo.endsWith("mp4")) { Clip clip = new Clip(); clip.path = new File(fileVideoRoot,fileVideo).getCanonicalPath(); fc.getInfo(clip); clip.duration = clip.duration-fadeLen; listVideos.add(clip); } } Clip clipOut = new Clip (); clipOut.path = new File(fileOut).getCanonicalPath(); fc.concatAndTrimFilesMP4Stream(listVideos, clipOut, false, false, new ShellUtils.ShellCallback() { @Override public void shellOut(String shellLine) { System.out.println("fc>" + shellLine); } @Override public void processComplete(int exitValue) { if (exitValue < 0) System.err.println("concat non-zero exit: " + exitValue); } }); } } Взято отсюда

Ответ 2



Возможно это вам поможет: cmd="( " h264options="-vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \ -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \ -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \ -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \ -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\ -qmax 51 -qdiff 4" outfile="out-`date +%F-%H%M.%S`.mp4" for i; do cmd="${cmd}ffmpeg -i $i -ab 256000 -vb 10000000 -mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -f mpeg -; " done cmd="${cmd} ) | ffmpeg -y -i - -threads 8 ${h264options} -vb 10000000 -acodec libfaac -ar 44100 -ab 128k -s 1280x720 ${outfile}" echo "${cmd}" eval ${cmd}

Комментариев нет:

Отправить комментарий