Повторная обработка видео в формате mp4 на основе отметок времени Python - PullRequest
1 голос
/ 06 февраля 2020

У меня есть классный проект, где у меня есть файл .ttml с субтитрами видео, а затем у меня есть видео .mp4. The image below has the timestamps.

То, что я пытаюсь сделать, это выяснить, как я могу вырезать видео, где оно отображает только часть видео в метках времени. Таким образом, в основном для каждой отметки времени я должен сохранить именно ту часть в видео, где этот человек говорит это.

Получение временных меток может быть не слишком сложным, и приведенный ниже код делает это, но как мне выровнять эти временные метки, чтобы сохранить части моего файла 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()))

Я был бы признателен за любую помощь, которую я мог бы получить в этом, код был бы великолепен, у меня было слишком много теории для дня хаха Спасибо

1 Ответ

1 голос
/ 07 февраля 2020

Как прокомментировал Люк, вы можете использовать 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


Я разрешаю вам решать, как обращаться с проблема кодирования.
Вы можете усердно работать и найти способ обрезать во время ключевых кадров и сохранить качество видео или перекодировать видео, чтобы получить точное время обрезки и потерять некоторое качество.

...