Skip to content

Instantly share code, notes, and snippets.

@knzm
Created May 10, 2018 15:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save knzm/4dffdb1fed6223f09ee6b418217f9bc9 to your computer and use it in GitHub Desktop.
Save knzm/4dffdb1fed6223f09ee6b418217f9bc9 to your computer and use it in GitHub Desktop.
.PHONY: target clean clean-video-objs clean-audio-objs metadata pass1 pass2
video_width := 432
# video_crf := 23
video_bitrate := 192000
# video_2pass = no
ifeq ($(video_2pass),)
ifdef video_bitrate
video_2pass = yes
else
video_2pass = no
endif
endif
audio_bitrate := 128000
audio_sampling_rate := 44100
audio_data_format = aac@$(audio_sampling_rate)
# audio_data_format = aac
WORKDIR := work
PREFIX_CMD :=
SRC := mkv/title00.mkv
METADATA := metadata.ini
COVER := cover.jpg
TARGET := output.mp4
ifeq ($(video_2pass),yes)
VIDEO_TARGET = $(WORKDIR)/x264-2.m4v
VIDEO_OBJS = \
$(WORKDIR)/pass1.timestamp \
$(WORKDIR)/pass2.timestamp \
$(WORKDIR)/x264-0.log \
$(WORKDIR)/x264-0.log.mbtree \
$(WORKDIR)/x264-1.m4v \
$(WORKDIR)/x264-2.m4v
else
VIDEO_TARGET = $(WORKDIR)/x264.m4v
VIDEO_OBJS = \
$(WORKDIR)/x264.m4v
endif
AUDIO_TARGET = $(WORKDIR)/aac.m4a
AUDIO_OBJS = \
$(WORKDIR)/alac.m4a \
$(WORKDIR)/aac.m4a
target: $(TARGET)
clean:
rm -f $(TARGET) $(VIDEO_OBJS) $(AUDIO_OBJS)
clean-video-objs:
rm -f $(VIDEO_OBJS)
clean-audio-objs:
rm -f $(AUDIO_OBJS)
metadata:
ffmpeg -i $(SRC) -f ffmetadata - 2> /dev/null
$(TARGET): $(VIDEO_TARGET) $(AUDIO_TARGET) $(METADATA) $(COVER)
$(PREFIX_CMD) ffmpeg \
-loglevel warning \
-y \
-i $(METADATA) \
-i $(VIDEO_TARGET) \
-i $(AUDIO_TARGET) \
-i $(COVER) \
-codec copy \
-map_metadata 0 \
-map_chapters 0 \
-map 1 \
-map 2 \
$@
pass1: $(WORKDIR)/pass1.timestamp
pass2: $(WORKDIR)/pass2.timestamp
$(WORKDIR)/x264-0.log: $(WORKDIR)/pass1.timestamp
$(WORKDIR)/x264-1.m4v: $(WORKDIR)/pass1.timestamp
$(WORKDIR)/x264-2.m4v: $(WORKDIR)/pass2.timestamp
video_filter_format = format=yuv420p
video_filter_scale = scale=$(video_width):-1:flags=lanczos
video_filter = $(video_filter_format),$(video_filter_scale)
# video_filter_decimate = mpdecimate,setpts=N/FRAME_RATE/TB
# video_filter = $(video_filter_format),$(video_filter_scale),$(video_filter_decimate)
# audio_filter_decimate = asetpts=N/SAMPLE_RATE/TB
# audio_filter = $(audio_filter_decimate)
FFMPEG_COMMON_FLAGS = \
-threads 0 \
-loglevel warning \
-guess_layout_max 0 \
-y
FFMPEG_VIDEO_FLAGS = \
-codec:v libx264 \
-preset medium \
-tune film,fastdecode \
-profile:v main \
-level 3.0 \
-movflags +faststart
ifdef video_filter
FFMPEG_VIDEO_FLAGS += -vf "$(video_filter)"
endif
ifdef video_crf
FFMPEG_VIDEO_FLAGS += -crf $(video_crf)
endif
ifdef video_bitrate
FFMPEG_VIDEO_FLAGS += -b:v $(video_bitrate)
endif
FFMPEG_AUDIO_FLAGS = \
-codec:a alac
ifdef audio_filter
FFMPEG_AUDIO_FLAGS +=
-af "$(audio_filter)"
endif
$(WORKDIR)/x264.m4v: $(SRC)
$(PREFIX_CMD) ffmpeg \
$(FFMPEG_COMMON_FLAGS) \
-fflags +genpts \
-i $(SRC) \
$(FFMPEG_VIDEO_FLAGS) \
-an \
$@
$(WORKDIR)/pass1.timestamp: $(SRC)
$(PREFIX_CMD) ffmpeg \
$(FFMPEG_COMMON_FLAGS) \
-fflags +genpts \
-i $(SRC) \
$(FFMPEG_VIDEO_FLAGS) \
-pass 1 \
-passlogfile $(WORKDIR)/x264 \
-an \
$(WORKDIR)/x264-1.m4v
touch $@
$(WORKDIR)/pass2.timestamp: $(WORKDIR)/x264-0.log $(SRC)
$(PREFIX_CMD) ffmpeg \
$(FFMPEG_COMMON_FLAGS) \
-fflags +genpts \
-i $(SRC) \
$(FFMPEG_VIDEO_FLAGS) \
-pass 2 \
-passlogfile $(WORKDIR)/x264 \
-an \
$(WORKDIR)/x264-2.m4v
touch $@
$(WORKDIR)/alac.m4a: $(SRC)
$(PREFIX_CMD) ffmpeg \
$(FFMPEG_COMMON_FLAGS) \
-i $(SRC) \
$(FFMPEG_AUDIO_FLAGS) \
-vn \
$@
$(WORKDIR)/aac.m4a: $(WORKDIR)/alac.m4a
$(PREFIX_CMD) afconvert \
-f m4af \
-d $(audio_data_format) \
-b $(audio_bitrate) \
$(WORKDIR)/alac.m4a \
$@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment