在React Native中使用ffmpeg-kit-react-native合并N个视频遇阻
无音频视频合并的FFmpeg解决方案
一、输入视频参数一致时(分辨率、帧率、编码相同)
这种场景用concat demuxer效率最高,步骤如下:
- 先创建一个文本文件(比如
input.txt),每行按格式写入视频路径:file '/path/to/first.mp4' file '/path/to/second.mp4' ... - 执行FFmpeg命令:
ffmpeg -f concat -safe 0 -i input.txt -c:v copy -an -y ${outputVideoPath} - 参数解释:
-f concat:指定使用concat demuxer模式-safe 0:允许使用绝对路径(避免路径权限报错)-c:v copy:直接复制视频流,不重新编码,速度极快-an:彻底禁用音频输出,确保合并后无音频
二、输入视频参数不一致时(分辨率、帧率不同)
需要用filter_complex的concat滤镜统一视频参数,命令如下:
ffmpeg -i ${videoPaths.join(' -i ')} -filter_complex "[0:v][1:v][2:v]concat=n=${videoPaths.length}:v=1:a=0[v]" -map "[v]" -c:v libx264 -preset medium -crf 23 -an -y ${outputVideoPath}
- 参数解释:
-filter_complex "[0:v][1:v][2:v]concat=n=${videoPaths.length}:v=1:a=0[v]":按输入顺序拼接所有视频流,仅保留视频轨道-c:v libx264:用H.264编码统一输出视频格式-preset medium:平衡编码速度与压缩质量,可按需换成fast(更快)或slow(压缩比更高)-crf 23:控制视频质量,18-28为常用区间,数值越小质量越高-an:明确禁用音频,确保输出无音频
三、你之前命令的问题点
- 第一条命令中的
-shortest会让输出视频长度等于最短的输入视频,这大概率不是你要的合并效果 - 第二条命令缺少明确的音频禁用参数,且
-strict -2是旧版FFmpeg兼容AAC的冗余参数,这里完全不需要 - 如果输入视频分辨率不一致,concat滤镜要求所有输入流分辨率统一,你之前的scale滤镜写法可能存在适配问题,建议在参数不一致时用上面的第二种命令
在react-native中使用ffmpeg-kit-react-native时,注意:
- 确保视频路径是应用可访问的绝对路径(Android注意文件权限,iOS注意沙箱路径)
- 用concat demuxer时,要在应用临时目录创建
input.txt,避免读写权限问题
内容的提问来源于stack exchange,提问作者Madhav
相关产品推荐
相关产品推荐

