Last active
August 22, 2018 21:09
-
-
Save yar/5056e5bd303a23de98139365d2ff5d18 to your computer and use it in GitHub Desktop.
Concat video files that overlap in time using the framemd5 and demuxer method
This file contains 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
# Usage: ffmpeg $(( echo input1.mp4; echo input2.mp4 ) | python3 concat_overlapping_video_framemd5_demuxer.py concat_file.txt) -y -an output.mp4 | |
import os | |
import sys | |
import subprocess | |
ffmpeg_concat_file, md5_last_frame = open(sys.argv[1], 'w'), None | |
for video_path in map(os.path.abspath, list(map(str.strip, sys.stdin))): | |
framemd5 = subprocess.check_output(['ffmpeg', '-nostats', '-hide_banner', '-i', video_path, '-an', '-f', 'framemd5', '-c', 'copy', '-'], stderr = open(os.devnull, 'w')) | |
inpoint, tb_num, tb_den = 0, 1, 1 | |
for line in framemd5.split(b'\n'): | |
if line.startswith(b'#tb'): | |
tb_num, tb_den = list(map(int, line.split()[-1].split(b'/'))) | |
elif not line.startswith(b'#') and len(line) > 0: | |
splitted = line.split(b',') | |
md5, pts_time = splitted[-1].strip(), float(splitted[2]) * tb_num / tb_den | |
if md5 == md5_last_frame: | |
inpoint = pts_time | |
md5_last_frame = md5 | |
ffmpeg_concat_file.write('file {}\ninpoint {}\n'.format(video_path, inpoint)) | |
print('-nostats -hide_banner -avoid_negative_ts make_zero -fflags +genpts -f concat -safe 0 -i {} -c copy'.format(sys.argv[1])) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment