Объедините два видеоклипа в один, поместив их рядом друг с другом

Используйте zsh . В нем есть метод сортировки и выбора файлов по размеру (и по дате, что используется чаще). Zsh является частью стандартной установки в OSX / macOS, но может потребоваться отдельная установка в других вариантах Unix.

Способ выбора (и сортировки) файлов с использованием критериев, отличных от имени, - это квалификаторы glob . Например, чтобы перечислить 10 самых больших файлов в каталоге, используйте OL для сортировки по уменьшению размера ( l ength) и [1,10] для перечисления первые 10:

ls -ldU *(OL[1,10])

Сделать это без zsh сложнее, особенно если вам нужно справиться с именами файлов, содержащими специальные символы. Пока ваши имена файлов не содержат непечатаемых символов или символов новой строки, вы можете проанализировать вывод ls .

ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done

40
04.10.2015, 14:58
3 ответа

Честно говоря, использование принятого ответа привело к большому количеству пропущенных кадров.

Тем не менее, использование комплекса фильтров hstack_дало идеально плавный выходной сигнал:

ffmpeg -i left.mp4 -i right.mp4 -filter_complex hstack output.mp4
85
27.01.2020, 19:35
ffmpeg -y -ss 0 -t 5 -i inputVideo1.mp4 -ss 0 -t 5 -i inputVideo2.mp4 -i BgPaddingImage.jpg -filter_complex nullsrc=size=720*720[base];[base][2:v]overlay=1,format=yuv420p[base1];[0:v]setpts=PTS-STARTPTS,scale=345*700[upperleft];[1:v]setpts=PTS-STARTPTS,scale=345*700[upperright];[base1][upperleft]overlay=shortest=1:x=10:y=10[tmp1];[tmp1][upperright]overlay=shortest=1:x=366:y=10 -c:a copy -strict experimental -ss 0 -t 5 -preset ultrafast -an output.mp4

Добавьте два видео бок о бок, а также добавьте наложенное изображение, которое будет отображаться на видео. Отступы с помощью. Вы можете изменить фоновое изображение [BgPaddingImage.jpg]здесь установите путь к своему фоновому изображению.

Показать это ниже. Видео, созданное командой сверху

enter image description here

5
27.01.2020, 19:35

Зависимость Gradle

implementation "com.writingminds:FFmpegAndroid:0.3.2"

Код

Команда для объединения двух видео рядом в одно

val cmd : arrayOf("-y", "-i", videoFile!!.path, "-i", videoFileTwo!!.path, "-filter_complex", "hstack", outputFile.path)

Команда для добавления двух видео (друг за другом )в одно

  val cmd : arrayOf("-y", "-i", videoFile!!.path, "-i", videoFileTwo!!.path, "-strict", "experimental", "-filter_complex",
                        "[0:v]scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v0];[1:v] scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1",
                        "-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "1920x1080", "-vcodec", "libx264", "-crf", "27",
                        "-q", "4", "-preset", "ultrafast", outputFile.path)

Примечание:

"videoFile" is your first video path.
"videoFileTwo" is your second video path.
"outputFile" is your combined video path which is our final output path

Чтобы создать путь вывода видео

fun createVideoPath(context: Context): File {
        val timeStamp: String = SimpleDateFormat(Constant.DATE_FORMAT, Locale.getDefault()).format(Date())
        val imageFileName: String = "APP_NAME_"+ timeStamp + "_"
        val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES)
        if (storageDir != null) {
            if (!storageDir.exists()) storageDir.mkdirs()
        }
        return File.createTempFile(imageFileName, Constant.VIDEO_FORMAT, storageDir)
    }

Код для выполнения команды

try {
            FFmpeg.getInstance(context).execute(cmd, object : ExecuteBinaryResponseHandler() {
                override fun onStart() {

                }

                override fun onProgress(message: String?) {
                    callback!!.onProgress(message!!)
                }

                override fun onSuccess(message: String?) {
                    callback!!.onSuccess(outputFile)
                }

                override fun onFailure(message: String?) {
                    if (outputFile.exists()) {
                        outputFile.delete()
                    }
                    callback!!.onFailure(IOException(message))
                }

                override fun onFinish() {
                    callback!!.onFinish()
                }
            })
        } catch (e: Exception) {
            
        } catch (e2: FFmpegCommandAlreadyRunningException) {
           
        }
0
11.11.2021, 07:44

Теги

Похожие вопросы