基于时间戳Python的mp4视频再处理
我有一个很酷的项目,我有一个带有视频字幕的.ttml文件,然后是.mp4视频 我想做的是弄清楚如何剪切视频,它只在时间戳上显示视频的一部分。所以基本上,对于每个时间戳,我必须在视频中保存那个人说的确切部分 获取时间戳可能不太具挑战性下面的代码就是这么做的,但是如何对齐这些时间戳以保存我的mp4文件的部分??。基于时间戳Python的mp4视频再处理,python,video,time,timestamp,video-processing,Python,Video,Time,Timestamp,Video Processing,我有一个很酷的项目,我有一个带有视频字幕的.ttml文件,然后是.mp4视频 我想做的是弄清楚如何剪切视频,它只在时间戳上显示视频的一部分。所以基本上,对于每个时间戳,我必须在视频中保存那个人说的确切部分 获取时间戳可能不太具挑战性下面的代码就是这么做的,但是如何对齐这些时间戳以保存我的mp4文件的部分??。 time_chunks = [] total_time = datetime.timedelta() file_text = "".join(open(file_name).readl
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()))
我会很感激在这方面我能得到的任何帮助,代码会很好我今天有太多的理论哈哈。谢谢正如卢克评论的那样,你可以使用 您可以将其用作命令行工具(使用
子流程将其作为外部命令执行)。
您也可以使用Python绑定。
我选择将其用作命令行-在Windows下,我将ffmpeg.exe
放在工作文件夹中
在不重新编码的情况下剪切视频文件时出现问题。
请参阅:。
问题在于,如果不重新编码,您只能在关键帧中剪切视频
为了简单起见,我生成了一个未压缩的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_从_00_00.030_____到__00_00_01.420.avi
vid_从_00_00.030_____到__00_00_01.420.avi
vid_从_00_00_03.580____到__00_00_04.440.avi
vid_从_00_00_05.940____到__00_00_07.100.avi
vid_从_00_00_07.100____到__00_00_09.040.avi
我让您决定如何处理重新编码问题。
您可以努力工作,找到一种方法在关键帧的时间进行剪切并保持视频质量,或者重新编码视频,以获得精确的时间剪切,并降低一些质量 如果你想剪掉视频的一部分,你的朋友就是你的朋友。使用“-ss”指定开始时间,使用“-to”指定结束时间。所以类似于ffmpeg-i my_video.mp4-c copy-ss“00:00:10.323”-到“00:01:17.382”my_segment3.mp4
感谢Luke在@Luke工作