2つのビデオクリップを1つにマージして並べて配置

2つのビデオクリップを1つにマージして並べて配置

2つのビデオクリップがあります。どちらも640x480で、最後の10分です。 1つはバックグラウンドオーディオを含み、もう1つは歌う俳優を含みます。 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その黒い領域の上にオーバーレイフィルタを使用してサイズをデフォルトで2倍にします。

源泉:https://superuser.com/questions/153160/join-videos-split-screen

答え3

これは2つのフィルタを使用して行うことができ、両方の入力のオーディオを含みます。

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"

パスワード

2つのビデオを並べて1つにまとめるコマンド

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

1 つのビデオに 2 つのビデオを順番に追加するコマンド

  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」は2番目のビデオパスです。
「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) {
           
        }

関連情報