![如何剪切和合并 mp4 视频文件而无需重新编码](https://linux22.com/image/907888/%E5%A6%82%E4%BD%95%E5%89%AA%E5%88%87%E5%92%8C%E5%90%88%E5%B9%B6%20mp4%20%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E8%80%8C%E6%97%A0%E9%9C%80%E9%87%8D%E6%96%B0%E7%BC%96%E7%A0%81.png)
使用 Ubuntu 18.04,我在 mp4 容器(h.264/mp3 编解码器)中有一些截屏视频文件,有时我想合并(即 C.mp4 = A.mp4+B.mp4)或有时剪切删除一些间隔(例如 D.mp4 = A.mp4[0,320{seconds}]+A.mp4[325,340]+C.mp4)。
我现在正在使用 kdenlive,它可以运行,但它会重新编码所有内容,对于这样的任务来说似乎有点太多了。
有没有更简单的方法可以做到这一点而无需重新编码(甚至可能是首选的命令行或稳定的 Python / Julia / R / ..方式)?
我正在考虑使用类似 PDFtk 的 pdf 文件 :-))
PS:我确实尝试过ffmpeg -ss 00:00:05 -to 00:00:10 -i test1.mp4 test2.mp4
但是出现了错误:
选项(录制或转码停止时间)无法应用于输入 URL test1.mp4 - 您正在尝试将输入选项应用于输出文件或反之亦然。将此选项移到其所属文件之前。
我的文件具有相同的容器、编解码器和分辨率。
(我对视频方面的东西一无所知..)
编辑:我不想显得悲观,但我越看越觉得,我认为超级简单的事情实际上超级复杂。可惜没有人编写高级接口来执行这样的事情。我敢肯定我不是第一个有这种需要的人。
EDIT2:我发现電影,但它仍然远离我最初的想法(它重新编码并且它有比需要的更长的 API..我可以编写脚本但重新编码问题仍然存在):
pip install moviepy
from moviepy.editor import VideoFileClip, concatenate_videoclips
c1 = VideoFileClip("test1.mp4").subclip(0,5)
c2 = VideoFileClip("test1.mp4").subclip(10,15)
f = concatenate_videoclips([c1,c2])
f.write_videofile(test2.mp4)
答案1
你可以用 ffmpeg 来实现。你需要正确排序选项并添加两个选项:
ffmpeg -i INFILE.mp4 -vcodec copy -acodec copy -ss 00:01:00.000 -t 00:00:10.000 OUTFILE.mp4
从这里。
答案2
好吧,正如我在自己的问题中所说,这并不能解决重新编码的问题,但至少它是一个方便的界面。只需使用它
vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>
#!/usr/bin/python3
import sys, getopt, re
def printerror(errormsg):
print("*** vcat - concatenate video segments using moviepy ***\n")
print("ERROR:", errormsg,"\n")
print("Usage: vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>")
print("Optional start and end points should be given in seconds. If files have spaces should be quoted (e.g. \"input file.mp4[5-30]\").")
try:
from moviepy.editor import VideoFileClip, concatenate_videoclips
except ImportError:
printerror("You don't seem to have moviepy installed. Install it with `pip install moviepy`.")
exit(1)
def main(argv):
inputfiles_arg = ''
outputfile = ''
try:
opts, args = getopt.getopt(argv,"hi:o:",["input=","output="])
except getopt.GetoptError as err:
printerror(str(err))
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
printerror("")
sys.exit()
elif opt in ("-i", "--input"):
inputfiles_arg = arg
elif opt in ("-o", "--output"):
outputfile = arg
if outputfile =='':
printerror("Output file not specified")
iFiles = inputfiles_arg.split(',')
clips=[]
for iFile in iFiles:
subclip = re.search(r"\[([0-9\-\.]+)\]", iFile)
if subclip is None:
clips.append(VideoFileClip(iFile))
else:
dims = subclip.group(1).split('-')
if len(dims) != 2:
printerror("If a specific segment of a file is specified, this should be given as [startseconds-endseconds]")
iFile = iFile.replace("["+subclip.group(1)+"]",'')
clips.append(VideoFileClip(iFile).subclip(float(dims[0]),float(dims[1])))
f = concatenate_videoclips(clips)
f.write_videofile(outputfile)
if __name__ == "__main__":
main(sys.argv[1:])
免责声明:我有一段时间不使用 Python 了,所以肯定有更好的方法。顺便说一句,由于你可以在网上找到大量关于 Python 的文档,能够在几个小时内完成你想做的事情真是太好了。