여러 mp4 파일을 최종 mp4의 챕터로 병합하는 방법은 무엇입니까?

여러 mp4 파일을 최종 mp4의 챕터로 병합하는 방법은 무엇입니까?

0001.mp4, 0002.mp4, ... 이라는 파일이 포함된 폴더가 있는데,
이 모든 파일을 에 병합하고 combined.mp4내부 장 표시를 갖기를 원합니다. 예를 들어 vlc에서 플레이할 때 타임라인에서 챕터 이름을 볼 수 있기 때문에 편리합니다.

여기에 이미지 설명을 입력하세요.

이걸 어떻게 만들 수 있나요 combined.mp4? 명령줄 스크립트를 사용 ffmpeg하고 다른 종속성이 없는 것이 더 좋습니다.

가지다비슷한질문인데 질문자는 핸드 브레이크를 사용하고 싶어했습니다.

답변1

장 정보는 파일 메타데이터에 저장됩니다. Ffmpeg를 사용하면 메타데이터를 파일로 내보내고 파일에서 메타데이터를 로드할 수 있습니다. 문서는 여기에 있습니다:ffmpeg 메타데이터 1

이제 .mp4 병합을 위한 메타데이터 파일을 준비해야 합니다. 먼저 모든 파일에서 결합된 파일을 생성한 다음 다른 파일을 생성하고 메타데이터를 삽입하지 않고도 이 작업을 한 번에 수행할 수 있습니다. 저장 공간을 절약합니다.

multiple_mp4_to_single_mp4_with_chapters.py나는 다음을 수행하는 Python 스크립트를 작성했습니다.

import subprocess
import os
import re


def make_chapters_metadata(list_mp4: list):
    print(f"Making metadata source file")

    chapters = {}
    for single_mp4 in list_mp4:
        number = single_mp4.removesuffix(".mp4")
        duration_in_microseconds = int((subprocess.run(f"ffprobe -v quiet -of csv=p=0 -show_entries format=duration {folder}/{single_mp4}", shell=True, capture_output=True).stdout.decode().strip().replace(".", "")))
        chapters[number] = {"duration": duration_in_microseconds}

    chapters["0001"]["start"] = 0
    for n in range(1, len(chapters)):
        chapter = f"{n:04d}"
        next_chapter = f"{n + 1:04d}"
        chapters[chapter]["end"] = chapters[chapter]["start"] + chapters[chapter]["duration"]
        chapters[next_chapter]["start"] = chapters[chapter]["end"] + 1
    last_chapter = f"{len(chapters):04d}"
    chapters[last_chapter]["end"] = chapters[last_chapter]["start"] + chapters[last_chapter]["duration"]

    metadatafile = f"{folder}/combined.metadata.txt"
    with open(metadatafile, "w+") as m:
        m.writelines(";FFMETADATA1\n")
        for chapter in chapters:
            ch_meta = """
[CHAPTER]
TIMEBASE=1/1000000
START={}
END={}
title={}
""".format(chapters[chapter]["start"], chapters[chapter]["end"], chapter)
            m.writelines(ch_meta)


def concatenate_all_to_one_with_chapters():
    print(f"Concatenating list of mp4 to combined.mp4")
    metadatafile = f"{folder}/combined.metadata.txt"
    os.system(f"ffmpeg -hide_banner -loglevel error -y -f concat -i list_mp4.txt -i {metadatafile} -map_metadata 1 combined.mp4")

if __name__ == '__main__':

    folder = "."  # Specify folder where the files 0001.mp4... are

    list_mp4 = [f for f in os.listdir(folder) if re.match(r'[0-9]{4}\.mp4', f)]
    list_mp4.sort()

    # Make the list of mp4 in ffmpeg format
    if os.path.isfile("list_mp4.txt"):
        os.remove("list_mp4.txt")
    for filename_mp4 in list_mp4:
        with open("list_mp4.txt", "a") as f:
            line = f"file '{filename_mp4}'\n"
            f.write(line)

    make_chapters_metadata(list_mp4)
    concatenate_all_to_one_with_chapters()

이제 mp4 파일이 있는 폴더에 넣고(또는 folder스크립트에서 변수를 편집하여) 실행할 수 있습니다.

$ ls
0001.mp4 0002.mp4 0003.mp4 0004.mp4 multiple_mp4_to_single_mp4_with_chapters.py
$ python multiple_mp4_to_single_mp4_with_chapters.py

이제 combined.mp4vlc에서 열리면 챕터 마커가 표시됩니다.


mp4box와 mp4chaps를 사용하여 이 작업을 수행하는 스크립트를 bash에서 보았습니다.이 점
이러한 종속성이 없는 bash 버전도 있습니다.이 점
Python에는 다른 버전이 있지만 병합된 파일을 두 번 생성합니다.이 점

관련 정보