init
This commit is contained in:
78
DASH-ffmpeg-VP9-encoder.sh
Normal file
78
DASH-ffmpeg-VP9-encoder.sh
Normal file
@@ -0,0 +1,78 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user