Last active
November 9, 2022 17:13
-
-
Save tdr2d/3101b9bb1a9e6fdf287a0f7fe9173516 to your computer and use it in GitHub Desktop.
ffmpeg - convert videos using the VP9 codec - prepare multiple resolutions for DASH
This file contains 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
#!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
line 69: $size_params_30f