FFmpeg在Ubuntu Desktop i386 16.04.4系统下拼接多段短视频时遭遇循环及缓冲区溢出问题求助
FFmpeg在Ubuntu Desktop i386 16.04.4系统下拼接多段短视频时遭遇循环及缓冲区溢出问题求助
问题描述
我从2016年开始用FFmpeg处理视频,现在需要拼接一批时长在4-180秒之间的短视频,操作设备是装了Windows 7和Ubuntu Desktop i386 16.04.4的笔记本。
之前我给视频文件创建了符号链接(比如把first.mp4链接成1,second.mp4链接成2),用下面的命令拼接8个视频,效果一直很好:
ffmpeg -i 1 -i 2 -i 3 -i 4 -i 5 -i 6 -i 7 -i 8 -sn -filter_complex [0][1][2][3][4][5][6][7]concat=n=8:v=1:a=1 -r 25 Begin25d.mp4
我用的FFmpeg版本是:
ffmpeg version 2.8.17-0ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
但当我尝试拼接13个视频时,FFmpeg开始弹出**“overflow buffer”**的警告,计算时间变得特别长,后续还出现了片段被循环重复拼接的问题。另外我还发现,如果让工具从文件读取滤镜脚本,它又没法同时从文件读取输入文件名,结果还是会导致片段被多次重复拼接。
解决方案建议
针对你在32位i386系统下拼接多文件遇到的问题,推荐用FFmpeg的concat demuxer替代之前的concat滤镜,这种方式对内存占用更低,能有效避免缓冲区溢出和循环拼接的问题:
- 先创建一个文本文件(比如命名为
filelist.txt),按拼接顺序写入所有视频文件的路径,每一行格式如下:
file '/home/yourname/videos/first.mp4' file '/home/yourname/videos/second.mp4' file '/home/yourname/videos/third.mp4' ...
如果视频和文本文件在同一目录,直接写文件名即可;路径有空格的话一定要用单引号括起来,避免识别错误。
- 执行下面的命令完成拼接:
ffmpeg -f concat -safe 0 -i filelist.txt -sn -r 25 Begin25d.mp4
-f concat:指定使用concat demuxer模式-safe 0:允许FFmpeg读取任意路径的文件(如果文件都在同一目录,这个参数可以省略)-sn和-r 25:和你之前的命令保持一致,分别用来禁用字幕流、设置输出帧率
这种方式是直接按文件顺序拼接视频流,不需要像concat滤镜那样把所有输入文件加载到内存里,非常适合32位系统和多文件拼接的场景。
另外你的FFmpeg版本比较旧,要是后续还有问题,可以考虑通过Ubuntu的ppa源升级到16.04支持的最新版本,新版本修复了不少旧bug,对多文件拼接的兼容性会更好。
备注:内容来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

