You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中FFmpeg视频合并:需统一PIP与分屏视频分辨率

解决FFmpeg生成PIP/分屏视频后无法合并的问题

核心问题:生成的画中画(PIP)和水平分屏视频分辨率、宽高比不一致,导致concat滤镜执行无响应。需要修改视频生成命令,直接输出640x640分辨率、1:1宽高比的视频,满足合并要求。

依赖配置(无需修改)

//app -> build.gradle
implementation "com.writingminds:FFmpegAndroid:0.3.2"

修改后的视频生成代码

直接在生成PIP和分屏视频的FFmpeg命令中,加入分辨率和宽高比统一的处理逻辑:

private fun connectFfmPeg() {
    val overlayX = 10
    val overlayY = 10
    val overlayWidth = 200
    val overlayHeight = 350
    // 目标分辨率和宽高比
    val targetResolution = "640:640"
    val targetAspectRatio = "1:1"

    outputFile1 = createVideoPath().absolutePath
    outputFile2 = createVideoPath().absolutePath

    // 生成PIP视频的命令:先将主视频统一为目标参数,再叠加小窗口
    val cmd1 = arrayOf(
        "-y",
        "-i",
        videoPath1,
        "-i",
        videoPath2,
        "-filter_complex",
        "[0:v]scale=$targetResolution,setdar=$targetAspectRatio [main]; [1:v]scale=$overlayWidth:$overlayHeight [pip]; [main][pip] overlay=$overlayX:$overlayY",
        "-preset",
        "ultrafast",
        outputFile1
    )

    // 生成水平分屏视频的命令:先堆叠再统一为目标参数
    val cmd2 = arrayOf(
        "-y",
        "-i",
        videoPath1,
        "-i",
        videoPath2,
        "-filter_complex",
        "[0:v][1:v]hstack,scale=$targetResolution,setdar=$targetAspectRatio",
        "-preset",
        "ultrafast",
        outputFile2
    )

    val ffmpeg = FFmpeg.getInstance(this)
    // 执行命令的代码(原逻辑保留即可)
}

关键改动说明

  1. PIP视频处理:先对主视频(videoPath1)执行scale和setdar,将其转为640x640、1:1的基础画布,再叠加缩放后的小窗口视频,最终输出的PIP视频参数完全符合要求。
  2. 分屏视频处理:先通过hstack完成水平堆叠,再统一缩放为640x640并设置1:1宽高比,确保输出参数与PIP视频一致。
  3. 如果原视频帧率差异较大,可在命令中添加-r 30(按需调整帧率值),放在-preset参数之前,统一所有视频的帧率,进一步避免concat滤镜异常。

合并代码无需修改

修改后生成的两个视频参数完全匹配,原mergeVideos()方法可直接正常执行,无需调整命令逻辑。

内容的提问来源于stack exchange,提问作者Utsav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:19:55