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) // 执行命令的代码(原逻辑保留即可) }
关键改动说明
- PIP视频处理:先对主视频(
videoPath1)执行scale和setdar,将其转为640x640、1:1的基础画布,再叠加缩放后的小窗口视频,最终输出的PIP视频参数完全符合要求。 - 分屏视频处理:先通过
hstack完成水平堆叠,再统一缩放为640x640并设置1:1宽高比,确保输出参数与PIP视频一致。 - 如果原视频帧率差异较大,可在命令中添加
-r 30(按需调整帧率值),放在-preset参数之前,统一所有视频的帧率,进一步避免concat滤镜异常。
合并代码无需修改
修改后生成的两个视频参数完全匹配,原mergeVideos()方法可直接正常执行,无需调整命令逻辑。
内容的提问来源于stack exchange,提问作者Utsav
相关产品推荐
相关产品推荐

