Last active
August 30, 2022 23:59
-
-
Save ntrrgc/9a2c7742bf9d917b540cc8899682e923 to your computer and use it in GitHub Desktop.
Generate crazy MP4 edit lists to be added to media files for testing.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
# | |
# Generate crazy MP4 edit lists to be added to media files for testing. | |
# | |
# 1. Modify the timescales below with the actual values from the MP4 file. | |
# | |
# 2. Run the following commands to patch the file with Bento: | |
# | |
# # Remove previously existing edit list (optional, only if there is some) | |
# mp4edit --remove moov/trak/edts original.mp4 patched1.mp4 | |
# # Generate the new ones | |
# python gen-edit-lists.py | |
# # Insert the new edit lists | |
# mp4edit --insert moov/trak[0]:edts_video.box:-1 patched{1,2}.mp4 | |
# mp4edit --insert moov/trak[1]:edts_audio.box:-1 patched{2,3}.mp4 | |
# | |
import struct | |
from collections import namedtuple | |
Edit = namedtuple("Edit", ["duration", "media_time", "media_rate"]) | |
movie_timescale = 600 | |
video_track_timescale = 24000 | |
audio_track_timescale = 48000 | |
def gen_desired_edits(track_timescale): | |
return [ | |
# First 5 seconds of the movie consist of the track media from | |
# [4, 4+5) s. | |
Edit(5 * movie_timescale, 4 * track_timescale, 1), | |
# The following 90 seconds of the movie consist of the track media from | |
# [40, 40+90) s. | |
Edit(90 * movie_timescale, 40 * track_timescale, 1), | |
# The following 20 seconds in the movie, there is nothing. | |
Edit(20 * movie_timescale, -1, 1), | |
# Then, 10 seconds of video from the beginning of the track | |
Edit(10 * movie_timescale, 0 * track_timescale, 1), | |
# Then, 5 seconds of still image from the second 1 of the track | |
Edit(5 * movie_timescale, 1 * track_timescale, 0), | |
] | |
def gen_elst(desired_edits): | |
flags = 0 | |
version = 1 if any( | |
edit.duration > 0xFFFFFFFF or edit.media_time > 0xFFFFFFFF | |
for edit in desired_edits | |
) else 0 | |
contents = struct.pack(">LL", (version << 24) | flags, len(desired_edits)) | |
for edit in desired_edits: | |
if version == 1: | |
contents += struct.pack(">Qq", edit.duration, edit.media_time) | |
else: | |
contents += struct.pack(">Ll", edit.duration, edit.media_time) | |
contents += struct.pack(">hh", edit.media_rate, 0) | |
# Write the header | |
return struct.pack(">L", 8 + len(contents)) + b"elst" + contents | |
def gen_edts(desired_edits): | |
elst = gen_elst(desired_edits) | |
return struct.pack(">L", 8 + len(elst)) + b"edts" + elst | |
if __name__ == '__main__': | |
with open("edts_audio.box", "wb") as f: | |
f.write(gen_edts(gen_desired_edits(audio_track_timescale))) | |
with open("edts_video.box", "wb") as f: | |
f.write(gen_edts(gen_desired_edits(video_track_timescale))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
€/usr/bin/python3
• Generieren Sie verrückte MP4-Bearbeitungslisten, die Zu den Mediendateien zum Testen hinzugefügt werden sollen.
1. Ändern Sie die folgenden Zeitskalen mit den tatsächlichen Werten aus der MP4-Datei.
2. Führen Sie die folgenden Befehle aus, um die Datei mit Bento zu patchen:
• Entfernen Sie zuvor vorhandene Bearbeitungsliste (optional, nur wenn es einige gibt)
mp4edit --entfernen moov/trak/edts original.mp4 gepatcht1.mp4
• Generieren Sie die neuen
• Python-gen-edit-lists.py
• Einfügen der neuen Bearbeitungslisten
mp4edit --insert moov/trak[0]:edts_video.box:-1 gepatcht.mp4
mp4edit --insert moov/trak[1]:edts_audio.box:-1 gepatcht.mp4
Importstruktur
aus Sammlungen importieren namedtuple
Edit = namedtuple("Edit", ["duration", "media_time", "media_rate"])
movie_timescale = 600
video_track_timescale = 24000
audio_track_timescale = 48000
def gen_desired_edits(track_timescale):
Rückgabe [
• Die ersten 5 Sekunden des Films bestehen aus den Track-Medien
[4, 4+5) s.
Bearbeiten(5 * movie_timescale, 4 * track_timescale, 1),
• Die folgenden 90 Sekunden des Films bestehen aus den Track-Medien
[40, 40+90) s.
Bearbeiten(90 * movie_timescale, 40 * track_timescale, 1),
• Die folgenden 20 Sekunden im Film, gibt es nichts.
Bearbeiten(20 * movie_timescale, -1, 1),
• Dann, 10 Sekunden Video vom Anfang der Spur
Bearbeiten(10 * movie_timescale, 0 * track_timescale, 1),
• Dann 5 Sekunden Standbild aus der zweiten 1 der Spur
Bearbeiten(5 * movie_timescale, 1 * track_timescale, 0),
]
def gen_elst(desired_edits):
Flags = 0
Version = 1 falls vorhanden(
bearbeiten. Dauer > 0xFFFFFFFF oder bearbeiten. media_time > 0xFFFFFF
zur Bearbeitung in desired_edits
) sonst 0
def gen_edts(desired_edits):
elst = gen_elst(desired_edits)
return struct. Packung(">L", 8 + len(elst)) + b"edts" + elst
if name == 'main':
mit open("edts_audio.box", "wb") wie f:
f. schreiben(gen_edts(gen_desired_edits(audio_track_timescale)))