基于时间戳Python的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

我有一个很酷的项目,我有一个带有视频字幕的.ttml文件,然后是.mp4视频

我想做的是弄清楚如何剪切视频,它只在时间戳上显示视频的一部分。所以基本上,对于每个时间戳,我必须在视频中保存那个人说的确切部分

获取时间戳可能不太具挑战性下面的代码就是这么做的,但是如何对齐这些时间戳以保存我的mp4文件的部分??。

  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工作