Как прокомментировал Люк, вы можете использовать FFmpeg .
Вы можете использовать его как инструмент командной строки (выполнить его как внешнюю команду, используя subprocess
).
Вы также можете использовать Python binding ffmpeg- python.
Я решил использовать его в качестве командной строки - под Windows я положил ffmpeg.exe
в рабочую папку.
Есть проблемы с обрезкой видеофайла без перекодирования.
См .: Использование ffmpeg для обрезки видео .
Проблема в том, что без перекодирования вы можете обрезать видео только в ключевых кадрах .
Для простоты я сгенерировал несжатый необработанный видеофайл 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
Я разрешаю вам решать, как обращаться с проблема кодирования.
Вы можете усердно работать и найти способ обрезать во время ключевых кадров и сохранить качество видео или перекодировать видео, чтобы получить точное время обрезки и потерять некоторое качество.