Я хотел добавить главы к своим закодированным mkvs, но я получаю файлы *.xml, когда загружаю их из Интернета. Так есть ли способ преобразовать его в FFMETADATAFILE, чтобы при кодировании с помощью ffmpeg я мог добавлять главы в свой mkv ??

Пример ввода

<?xml version="1.0"?>

<!-- <!DOCTYPE Chapters SYSTEM "matroskachapters.dtd"> -->

-<Chapters>


-<EditionEntry>

<EditionFlagDefault>1</EditionFlagDefault>

<EditionFlagHidden>0</EditionFlagHidden>


-<ChapterAtom>

<ChapterUID>95534594</ChapterUID>

<ChapterTimeStart>00:00:00.000000000</ChapterTimeStart>

<ChapterTimeEnd>00:01:30.000000000</ChapterTimeEnd>

<ChapterFlagHidden>0</ChapterFlagHidden>

<ChapterFlagEnabled>1</ChapterFlagEnabled>


-<ChapterDisplay>

<ChapterString>Chapter 1</ChapterString>

<ChapterLanguage>und</ChapterLanguage>

</ChapterDisplay>

</ChapterAtom>



</EditionEntry>

</Chapters>

Пример вывода

;FFMETADATA1
title=bike\\shed
;this is a comment
artist=FFmpeg troll team

[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line

Кстати, я использую ffmpeg только в режиме cli.

1
Soul Spark 6 Дек 2019 в 08:12

1 ответ

Лучший ответ

Хорошо, я написал этот удобный сценарий денди, который делает именно это. ссылка на суть

Сценарий

from bs4 import BeautifulSoup # pip install bs4
import re


with open(r"PATH/TO/CHAPTERS/XML/FILE.xml", 'r') as f:
    soup = BeautifulSoup(f.read(), 'html.parser')


chapters = soup.select('editionentry > chapteratom')
chapters_array = []


for chapter in chapters:
    time = re.search(r'(\d{2}):(\d{2}):(\d{2})', str(chapter))
    hrs = int(time.group(1))
    mins = int(time.group(2))
    secs = int(time.group(3))

    minutes = (hrs * 60) + mins
    seconds = secs + (minutes * 60)
    timestamp = (seconds * 1000)
    chap = {
        "title": re.sub(r'(=|;|#|\n)', r'\\\1', chapter.find('chapterstring').text),
        "startTime": timestamp
    }
    chapters_array.append(chap)

text = ";FFMETADATA1\n\n"

for i in range(len(chapters_array)-1):
    chap = chapters_array[i]
    title = chap['title']
    start = chap['startTime']
    end = chapters_array[i+1]['startTime']-1
    text += f"\n[CHAPTER]\nTIMEBASE=1/1000\nSTART={start}\nEND={end}\ntitle={title}\n"

text = text.strip()

print(text)

Как использовать?

Замените PATH/TO/CHAPTERS/XML/FILE.xml фактическим путем к файлу xml.

Убедитесь, что у вас установлен python 3.

Запустите python -m pip install bs4, чтобы установить зависимость.

И просто запускаем скрипт. (например, python script.py, где script.py - это имя, которое вы использовали для сохранения скрипта)

Если вам понравился мой ответ, отметьте его как принятый ответ на этот вопрос.

PS: этот сценарий был вдохновлен https://ikyle.me/blog/2020 / add-mp4-chapters-ffmpeg

1
ArjixGamer 3 Фев 2021 в 17:04