Skip to content

Instantly share code, notes, and snippets.

@pazworld
Last active October 21, 2019 00:52
Show Gist options
  • Save pazworld/9c68b0e6559698c8d404190387752bb6 to your computer and use it in GitHub Desktop.
Save pazworld/9c68b0e6559698c8d404190387752bb6 to your computer and use it in GitHub Desktop.
Makefile merge two videos vertically with FFmpeg

Description

Makefile that merge two videos vertically with FFmpeg.

Tools

  • youtube-dl
  • FFmpeg
  • ffprobe

Files

  • chiko_src.mov (1920x1080, 28s) -> chiko_trimmed.mov (1370x700, 2s)
  • Youtube -> hazuki_src.mp4 (640x360, 60s) -> hazuki_trimmed.mp4 (640x360, 2s)
  • chiko_trimmed.mov + hazuki_trimmed.mp4 -> merged.mp4 (640x720, 2s) -> merged.gif

chiko_src.mov is not uploaded and only in my iPhone.

# inspect tasks:
# inspect_chiko : shows chiko mov file inspection
# inspect_hazuki_online : shows youtube available download formats
# inspect_hazuki_offline : shows hazuki mp4 file inspection
CHIKO_SRC := chiko_src.mov
CHIKO_TRIMMED := chiko_trimmed.mov
CHIKO_EYECATCH_START := 23
CHIKO_EYECATCH_DURATION := 2
CHIKO_CROP := "w=1370:h=700:x=234:y=200"
HAZUKI_SRC := hazuki_src.mp4
HAZUKI_SRC_URL := "https://www.youtube.com/watch?v=0Efumx0B9VI"
HAZUKI_TRIMMED := hazuki_trimmed.mov
HAZUKI_EYECATCH_START := 58
HAZUKI_EYECATCH_DURATION := 3
# 134 means 640x360 mp4 in that movie
HAZUKI_DOWNLOAD_FORMAT := 134
MERGED := merged.mp4
MERGED_GIF := merged.gif
CLEAN := ${CHIKO_TRIMMED} ${HAZUKI_SRC} ${HAZUKI_TRIMMED} \
${MERGED} ${MERGED_GIF}
all: ${MERGED_GIF}
clean:
rm ${CLEAN}
.PHONY: inspect_chiko
inspect_chiko:
ffprobe ${CHIKO_SRC}
.PHONY: inspect_hazuki_online
inspect_hazuki_online:
youtube-dl -F "${HAZUKI_SRC_URL}"
.PHONY: inspect_hazuki_offline
inspect_hazuki_offline:
ffprobe ${HAZUKI_SRC}
${HAZUKI_SRC}:
youtube-dl -f "${HAZUKI_DOWNLOAD_FORMAT}" -o "${HAZUKI_SRC}" \
"${HAZUKI_SRC_URL}"
${CHIKO_TRIMMED}: ${CHIKO_SRC}
ffmpeg -i ${CHIKO_SRC} \
-ss ${CHIKO_EYECATCH_START} -t ${CHIKO_EYECATCH_DURATION} \
-vf crop=${CHIKO_CROP} ${CHIKO_TRIMMED}
${HAZUKI_TRIMMED}: ${HAZUKI_SRC}
ffmpeg -i ${HAZUKI_SRC} \
-ss ${HAZUKI_EYECATCH_START} -t ${HAZUKI_EYECATCH_DURATION} \
${HAZUKI_TRIMMED}
${MERGED}: ${CHIKO_TRIMMED} ${HAZUKI_TRIMMED}
ffmpeg -i ${CHIKO_TRIMMED} -i ${HAZUKI_TRIMMED} \
-filter_complex " \
nullsrc=size=640x720 [base]; \
[0:v] setpts=PTS-STARTPTS, scale=640x360 [upper]; \
[1:v] setpts=PTS-STARTPTS, scale=640x360 [lower]; \
[base][upper] overlay=shortest=1 [tmp1]; \
[tmp1][lower] overlay=shortest=1:y=360 \
" \
-y -c:v libx264 ${MERGED}
${MERGED_GIF}: ${MERGED}
ffmpeg -i ${MERGED} -an -r 15 -pix_fmt rgb24 -f gif -y ${MERGED_GIF}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment