正如 Luke 所说,您可以使用 FFmpeg。
您可以将其用作命令行工具(使用subprocess将其作为外部命令执行)。
您还可以使用 Python 绑定ffmpeg-python。
我选择将其用作命令行 - 在 Windows 下,我将 ffmpeg.exe 放在工作文件夹中。
在不重新编码的情况下剪切视频文件存在问题。
请参阅:Using ffmpeg to cut up video.
问题是,如果不重新编码,您只能在 关键帧 中剪切视频。
为简单起见,我生成了一个未压缩的 AVI 原始视频文件,用于测试(所有帧都类似于关键帧)。
这是一个工作代码示例:
import ffmpeg
import datetime
from datetime import datetime as dt
from scrapy.selector import Selector
import subprocess as sp
file_name = 'subs.ttml'
in_vid_file = 'vid.avi'
# Build synthetic video, for testing (uncompressed AVI file):
##############################################################
sp.Popen('ffmpeg -r 30 -y -f lavfi -i testsrc=size=192x108:duration=300:rate=1 -c:v rawvideo -pix_fmt bgr24 ' + in_vid_file).wait()
##############################################################
time_chunks = []
total_time = datetime.timedelta()
file_text = "".join(open(file_name).readlines())
p_tags = Selector(text=file_text).xpath("//p").getall()
for ptag in p_tags:
begin = Selector(text=ptag).xpath("//@begin").get()
endie = Selector(text=ptag).xpath("//@end").get()
#start_time = dt.strptime(begin, '%H:%M:%S.%f') - datetime.datetime(1900, 1, 1)
#endie_time = dt.strptime(endie, '%H:%M:%S.%f') - datetime.datetime(1900, 1, 1)
#total_time += endie_time-start_time
#time_chunks.append((start_time.total_seconds(), endie_time.total_seconds()))
#Kepp the time in string format
time_chunks.append((begin, endie))
# Iterate time_chunks
for t in time_chunks:
beg_t = t[0]
end_t = t[1]
out_vid_file = 'vid_from_' + beg_t.replace(':', '_') + '___to___' + end_t.replace(':', '_') + '.avi'
# https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video
# Execute ffmpeg command in subprocess, and wait for finish.
# Example: ffmpeg -y -i vid.avi -c copy -ss 00:00:00.030 -to 00:00:01.420 vid_from_00_00_00.030___to___00_00_01.420.avi
sp.Popen('ffmpeg -y -i ' + in_vid_file + ' -c copy -ss ' + beg_t + ' -to ' + end_t + ' ' + out_vid_file).wait()
我使用以下subs.ttml 文件进行测试:
<p begin="00:00:00.030" end="00:00:01.420" style="s2">Due to the hustle and bustle of a sweet, floating city,</p>
<p begin="00:00:02.060" end="00:00:03.080" style="s2">Saying & ;It never relate me.</p>
<p begin="00:00:03.580" end="00:00:04.440" style="s2">The color of my heart is turning white</p>
<p begin="00:00:05.940" end="00:00:07.100" style="s2">But we can't do well, anyway</p>
<p begin="00:00:07.100" end="00:00:09.040" style="s2">So, cheers to your naughty smile.</p>
结果文件:
vid_from_00_00_00.030___to___00_00_01.420.avi
vid_from_00_00_00.030___to___00_00_01.420.avi
vid_from_00_00_03.580___to___00_00_04.440.avi
vid_from_00_00_05.940___to___00_00_07.100.avi
vid_from_00_00_07.100___to___00_00_09.040.avi
我让您决定如何处理重新编码问题。
你可以努力,想办法在关键帧的时间剪切,保持视频质量,或者重新编码视频,得到精确的时间剪切,并降低一些质量。