Skip to content

Instantly share code, notes, and snippets.

@tdr2d
Last active November 9, 2022 17:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tdr2d/3101b9bb1a9e6fdf287a0f7fe9173516 to your computer and use it in GitHub Desktop.
Save tdr2d/3101b9bb1a9e6fdf287a0f7fe9173516 to your computer and use it in GitHub Desktop.
ffmpeg - convert videos using the VP9 codec - prepare multiple resolutions for DASH
#!/usr/bin/env bash
# Prepare the videos to be used over http with the MPEG-DASH protocol
# The vp9 codec is used for the videos because h265 is not supported by chrome and h264 is too big
# This script generates webm files
## DOCS
# https://developers.google.com/media/vp9/settings/vod/
# https://developer.mozilla.org/en-US/docs/Web/HTML/DASH_Adaptive_Streaming_for_HTML_5_Video
# http://wiki.webmproject.org/adaptive-streaming/instructions-to-playback-adaptive-webm-using-dash
# ffprobe: https://trac.ffmpeg.org/wiki/FFprobeTips
## PRE-REQUIRED-INSTALLATION : ffmpeg and libwebm
# OSX: brew install ffmpeg --with-libvpx --with-libvorbis
# Debian:
set -eo pipefail
INPUT=$1
OUTPUT_DIR=$2
DASH_PARAMS="-keyint_min 150 -g 150 -an -f webm -dash 1"
LOG_LEVEL="-hide_banner -loglevel info"
# Checks
if [[ -z $(which ffmpeg) ]]; then echo "Error: ffmpeg is not installed"; exit 1; fi
if [[ $# -ne 2 ]]; then echo "Usage: mp4_to_dash input_file.mp4 output_directory"; exit 1; fi
if [[ ! -f ${INPUT} ]]; then echo "Error: input_file not found"; exit 1; fi
if [[ ! -d ${OUTPUT_DIR} ]]; then echo "Error: output_directory not found"; exit 1; fi
# create new directory using the name of the video
f=$(basename $INPUT)
f=${f%.*} # name without extension, and without base
rm -rf ${OUTPUT_DIR}/${f}
mkdir -p ${OUTPUT_DIR}/${f}
prefix=${OUTPUT_DIR}/${f}/${f}
encode_audio() {
ffmpeg $LOG_LEVEL -i "$INPUT" -c:a libvorbis -b:a 128k -vn -f webm -dash 1 -y "${prefix}-audio-128k.webm"
}
getHeight() {
ffprobe -v error -select_streams v:0 -show_entries stream=height -of default=noprint_wrappers=1:nokey=1 "$INPUT"
}
encode(){
size_params=$1
output=$2
echo "ffmpeg $LOG_LEVEL -i $INPUT -c:v libvpx-vp9 $size_params $DASH_PARAMS -pass 1 -speed 4 -y $output"
ffmpeg $LOG_LEVEL -i $INPUT -c:v libvpx-vp9 $size_params $DASH_PARAMS -pass 1 -speed 4 -y $output && \
ffmpeg $LOG_LEVEL -i $INPUT -c:v libvpx-vp9 $size_params $DASH_PARAMS -pass 2 -speed 4 -y $output
}
encode_240p() {
size="320x240"
size_params="-s ${size} -b:v 150k -minrate 75k -maxrate 218k -tile-columns 0 -threads 2 -quality good -crf 37"
encode "$size_params" "${prefix}-${size}.webm"
}
encode_360p() {
size="640x360"
size_params="-s ${size} -b:v 276k -minrate 138k -maxrate 400k -tile-columns 1 -threads 4 -quality good -crf 36"
encode "$size_params" "${prefix}-${size}.webm"
}
encode_720p() {
size="1280x720"
size_params_30f="-s ${size} -b:v 1024k -minrate 512k -maxrate 1485k -tile-columns 2 -threads 8 -quality good -crf 32"
encode "$size_params_30f" "${prefix}-${size}-30f.webm"
size_params_60f="-s ${size} -b:v 1800k -minrate 900k -maxrate 2610k -tile-columns 2 -threads 8 -quality good -crf 32"
encode "$size_params_60f" "${prefix}-${size}-60f.webm"
}
video_original_height=$(getHeight)
encode_audio
encode_360p
if [[ "$video_original_height" -ge "720" ]]; then encode_720p; fi
@suvankarsarkar
Copy link

line 69: $size_params_30f

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment