두 개의 비디오 클립을 하나로 병합하여 나란히 배치

두 개의 비디오 클립을 하나로 병합하여 나란히 배치

두 개의 비디오 클립이 있습니다. 둘 다 640x480이며 마지막 10분입니다. 하나는 배경 오디오를 포함하고 다른 하나는 노래하는 배우를 포함합니다. 1280x480 크기의 10분짜리 비디오 클립을 만들고 싶습니다(즉, 비디오를 서로 옆에 배치하고 동시에 재생하면서 두 클립의 오디오를 믹싱하고 싶습니다). ffmpeg/avidemux를 사용하여 이 작업을 수행하는 방법을 알아내려고 노력 중이지만 지금까지 아무 것도 얻지 못했습니다. merge라고 검색하면 모두 Join이라고 나옵니다.

어떤 제안이 있으십니까?

답변1

솔직히 써보세요수락된 답변프레임이 많이 떨어지게 만들었습니다.

그러나 hstackfilter_complex를 사용하면 완벽하게 유동적인 출력이 생성됩니다.

ffmpeg -i left.mp4 -i right.mp4 -filter_complex hstack output.mp4

답변2

ffmpeg \
  -i input1.mp4 \
  -i input2.mp4 \
  -filter_complex '[0:v]pad=iw*2:ih[int];[int][1:v]overlay=W/2:0[vid]' \
  -map '[vid]' \
  -c:v libx264 \
  -crf 23 \
  -preset veryfast \
  output.mp4

input1.mp4이는 원본 비디오와 동일한 크기의 검정색으로 오른쪽을 채운 다음 input2.mp4해당 검정색 영역 위에 오버레이 필터를 사용하여 크기를 기본적으로 두 배로 늘립니다.

원천:https://superuser.com/questions/153160/join-videos-split-screen

답변3

이는 단 두 개의 필터를 사용하여 수행할 수 있으며 두 입력의 오디오가 모두 포함됩니다.

ffmpeg -i left.mp4 -i right.mp4 -filter_complex \
"[0:v][1:v]hstack=inputs=2[v]; \
 [0:a][1:a]amerge[a]" \
-map "[v]" -map "[a]" -ac 2 output.mp4
  • 스택각 영상은 나란히 배치됩니다.
  • 아마거두 입력의 오디오를 단일 다중 채널 오디오 스트림으로 결합하여 -ac 2스테레오로 만듭니다. 이 옵션이 없으면 두 입력이 모두 스테레오인 경우 오디오 스트림이 4채널이 될 수 있습니다.

답변4

계층적 의존성

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"은 첫 번째 비디오 경로입니다.
"videoFileTwo"는 두 번째 비디오 경로입니다.
"outputFile"은 결합된 비디오 경로이며, 이것이 최종 출력 경로입니다.

비디오 출력 경로 생성

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) {
           
        }

관련 정보