Skip to content

Instantly share code, notes, and snippets.

@yar
Last active August 22, 2018 21:09
Show Gist options
  • Save yar/5056e5bd303a23de98139365d2ff5d18 to your computer and use it in GitHub Desktop.
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
# 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