如何使用Python加入两个视频文件?

时间:2013-06-26 04:44:49

标签: python video ffmpeg webm

在这里,我尝试将第一个和第二个30秒长的视频文件从“path / connect.webm”剪切到字符串out和out1。有用。但我需要做的是连接这两个字符串并将其写入文件“path / final.webm”。这样我最后得到一个60秒长的视频文件“final.webm”。但现在我只得到第一个30秒长的视频作为输出。请帮我。非常感谢。

python中的代码:

import subprocess,os

fname = "/home/xincoz/test/final.webm"

fp = open(fname,'wb')

ffmpeg_command = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy",   "-ss", "00:00:00", "-t", "00:00:30","-f", "webm", "pipe:1"]

p = subprocess.Popen(ffmpeg_command,stdout=subprocess.PIPE)

out, err = p.communicate()

ffmpeg_command1 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy",   "-ss", "00:00:31", "-t", "00:00:30","-f", "webm", "pipe:1"]

p1 = subprocess.Popen(ffmpeg_command1,stdout=subprocess.PIPE)

out1, err1 = p1.communicate()

string = out + out1

print len(out)

print len(out1)

print len(string)

fp.write(string)

fp.close()

请帮帮我。

3 个答案:

答案 0 :(得分:8)

此代码适用于我。谢谢大家的帮助。非常感谢。

import subprocess
ffmpeg_command1 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy", "-ss", "00:00:00", "-t", "00:00:30", "/home/xincoz/test/output1.webm"]
ffmpeg_command2 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy", "-ss", "00:00:30", "-t", "00:00:30", "/home/xincoz/test/output2.webm"]
ffmpeg_command3 = ["mencoder", "-forceidx", "-ovc", "copy", "-oac", "pcm", "-o", "/home/xincoz/test/output.webm", "/home/xincoz/test/output1.webm", "/home/xincoz/test/output2.webm"]


subprocess.call(ffmpeg_command1)
subprocess.call(ffmpeg_command2)
subprocess.Popen(ffmpeg_command3)

答案 1 :(得分:6)

这似乎是任何理性的人在第一次尝试以编程方式处理视频时会问的两个问题之一。 '为什么我不能剪切和粘贴我想要的部分?'没有人回答,因为那些真正可以解释的人,对这个问题感到厌倦,像我这样的人自己有点想出来,不想看起来很愚蠢。但我不介意 - 所以这是实际的答案。

要剪辑和加入复杂的容器格式,它总是比您想象的更复杂,并且至少需要每个容器的解决方案。

如果您阅读ffmpeg faq,理论上您可以通过将视频重新格式化为mpg-v1(也许mpg-v2也可以)来连接视频,然后或多或少地执行您正在做的事情。

cat first_part.mpg second_part.mpg > joined_movie.mpg

实际上,joined_movie.mpg可能会也可能无法顺利运行。即使是在这种非常简单的格式中,也有一些数据可以预先显示,并且说#34;这个文件只需要很长一段时间。或类似的东西。所以你可以打开它并发现它只有30秒,但发现它会播放一分钟(或不播放,具体取决于播放器)。它可以轻松改正(我假设无损,或者不会在ffmpeg常见问题中推荐)。

但是你最终可能不想和mpg-v1一起工作。 Webm可能是一个合理的选择。从我收集的内容来看,webm容器来自MKV。对于音频,它使用vorbis,对于视频,它使用vp8。一个外行人到另一个人:vp8~H264(我向doom9论坛的任何人道歉,他们读到这个并且有心脏病发作)。无论如何,对于我们这些外行人来说,重要的一点是:这意味着它不仅不简单,而且实际上非常复杂 - 即使只是理解所有编码器参数也是一种生活方式。

我知道mp4box可以在mp4容器中使用h264视频做一些非常接近你想要的东西。如果您主要希望能够以编程方式剪切和加入视频,那么您当然可以采用mp4 / h264,但您可能是支持自由和诸如此类的,并且希望出于意识形态或金钱原因使用webm。如果你在webm中找到解决方案,我会很好奇。也许mkvtool可以工作,因为它接近mkv容器?

我猜你的文件已准备好进行流媒体播放,因为你正在谈论网络视频。所以看起来你真的应该能够将它们加在一起。但即使所有内容都被chunk交错,它也必须比添加它们更复杂,甚至添加它们然后调整标题/元数据以获得总播放时间。我推断复杂性,因为似乎没有很多工具可以使用,甚至mp4box也无法可靠/准确地完成这项工作。

如果您使用mp4,可以告诉mp4box加入以下文件:

mp4box -cat file1 -cat file2 -new joined

也许自由软件爱国者会发布如何从命令行剪切和加入webm文件而不重新编码。

祝你的项目好运。

答案 2 :(得分:-1)

我认为如果指定-i infile1 .... -i infile2 .... outfile,那么ffmpeg将为您提供所需的一切。