Last active
May 2, 2020 10:48
-
-
Save philshem/3cb8e1de2629543a9e15b72d78f136f1 to your computer and use it in GitHub Desktop.
ghana says goodbye to coronavirus protestors https://twitter.com/philshem/status/1256535940442591232
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
| # 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