Skip to content

Instantly share code, notes, and snippets.

@philshem
Last active May 2, 2020 10:48
Show Gist options
  • Select an option

  • Save philshem/3cb8e1de2629543a9e15b72d78f136f1 to your computer and use it in GitHub Desktop.

Select an option

Save philshem/3cb8e1de2629543a9e15b72d78f136f1 to your computer and use it in GitHub Desktop.
ghana says goodbye to coronavirus protestors https://twitter.com/philshem/status/1256535940442591232
# made by @philshem
# https://twitter.com/philshem/status/1256535940442591232
# the unlicense https://unlicense.org/
# requires youtube-dl and ffmpeg (easily installed with homebrew or conda)
# download the video
youtube-dl jS0bjDbWydw --output raw.mp4
# get dimensions
# 1920 × 1080 in this case
# https://superuser.com/a/841379/442118
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 raw.mp4
# (optional) get video length https://superuser.com/a/945604/442118
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -sexagesimal raw.mp4
# cut video into pieces
# (adding -c copy is faster but messes up durations)
# https://superuser.com/a/141343/442118
# https://stackoverflow.com/a/35520705/2327328
ffmpeg -ss 0.00 -to 24.0 -i raw.mp4 stage.001.mp4 -y
ffmpeg -ss 24.01 -to 31.0 -i raw.mp4 stage.002.mp4 -y
ffmpeg -ss 31.01 -to 39.0 -i raw.mp4 stage.003.mp4 -y
ffmpeg -ss 39.01 -to 46.0 -i raw.mp4 stage.004.mp4 -y
ffmpeg -ss 46.01 -to 51.92 -i raw.mp4 stage.005.mp4 -y
# make montage of same video pieces https://trac.ffmpeg.org/wiki/Create%20a%20mosaic%20out%20of%20several%20input%20videos
# 2x2
ffmpeg -i stage.002.mp4 -i stage.002.mp4 -i stage.002.mp4 -i stage.002.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.002a.mp4 -y
# 4x4
ffmpeg -i stage.003.mp4 -i stage.003.mp4 -i stage.003.mp4 -i stage.003.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.003a.mp4 -y
ffmpeg -i edit.003a.mp4 -i edit.003a.mp4 -i edit.003a.mp4 -i edit.003a.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.003b.mp4 -y
# 8x8
ffmpeg -i stage.004.mp4 -i stage.004.mp4 -i stage.004.mp4 -i stage.004.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.004a.mp4 -y
ffmpeg -i edit.004a.mp4 -i edit.004a.mp4 -i edit.004a.mp4 -i edit.004a.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.004b.mp4 -y
ffmpeg -i edit.004b.mp4 -i edit.004b.mp4 -i edit.004b.mp4 -i edit.004b.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.004c.mp4 -y
# 16x16
ffmpeg -i stage.005.mp4 -i stage.005.mp4 -i stage.005.mp4 -i stage.005.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.005a.mp4 -y
ffmpeg -i edit.005a.mp4 -i edit.005a.mp4 -i edit.005a.mp4 -i edit.005a.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.005b.mp4 -y
ffmpeg -i edit.005b.mp4 -i edit.005b.mp4 -i edit.005b.mp4 -i edit.005b.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.005c.mp4 -y
ffmpeg -i edit.005c.mp4 -i edit.005c.mp4 -i edit.005c.mp4 -i edit.005c.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540" -c:v libx264 edit.005d.mp4 -y
# convert to mpeg because mp4 doesn't work with concat
ffmpeg -i stage.001.mp4 stage.001.mpeg
ffmpeg -i edit.002a.mp4 edit.002a.mpeg
ffmpeg -i edit.003b.mp4 edit.003b.mpeg
ffmpeg -i edit.004c.mp4 edit.004c.mpeg
ffmpeg -i edit.005d.mp4 edit.005d.mpeg
# setup to concat all files
echo file stage.001.mpeg > list.txt
echo file edit.002a.mpeg >> list.txt
echo file edit.003b.mpeg >> list.txt
echo file edit.004c.mpeg >> list.txt
echo file edit.005d.mpeg >> list.txt
# concat all prepped files into one output, back to mp4
ffmpeg -f concat -i list.txt output.mp4 -y
# check length of output
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -sexagesimal output.mp4
# cleanup staging files
rm -f stage.*.mp4 edit.*.mp4 raw.mp4 list.txt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment