From b33f2677290bbbb6588ed1abce8f97fba4ec5b0c Mon Sep 17 00:00:00 2001 From: Jonas Smedegaard Date: Wed, 17 May 2017 20:16:04 +0200 Subject: Vary vp8 speed based on height. --- bin/capture+encode+serve | 32 +++++++++++++++++++++++--------- bin/decode+edit+encode | 5 +++-- bin/decode+edit+loop+encode+stream | 21 +++++++++++---------- bin/encodevideo+loop+stream | 21 +++++++++++---------- bin/loop+encode+stream | 21 +++++++++++---------- bin/stream | 25 +++++++++++++------------ 6 files changed, 72 insertions(+), 53 deletions(-) diff --git a/bin/capture+encode+serve b/bin/capture+encode+serve index ad97c24..26c5f40 100755 --- a/bin/capture+encode+serve +++ b/bin/capture+encode+serve @@ -47,45 +47,59 @@ my $HEIGHT = 240; my $FRAMERATE = 25; my $AUDIORATE = 48000; -# TODO: Vary vpx quality based on height -my $SPEED_VP8 = 15; - -# inspired by Apple HLS recommendations -# TODO: Externalize to site-specific configfile +# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html +# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer +# TODO: adjust height steps or bitrates for 4:3 aspect ratio +# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264 +# TODO: Externalize speeds to site-specific configfile my ( $VBITRATE, $SPEED_X264, $SPEED_X264_ALONE ); if ( $HEIGHT le 234 ) { $VBITRATE = 145000; - $SPEED_X264 = 'slow'; + $SPEED_X264 = 'fast'; $SPEED_X264_ALONE = 'fast'; + $SPEED_VP8 = 3; + $SPEED_VP8_ALONE = 2; } elsif ( $HEIGHT le 270 ) { $VBITRATE = 365000; $SPEED_X264 = 'faster'; $SPEED_X264_ALONE = 'fast'; + $SPEED_VP8 = 4; + $SPEED_VP8_ALONE = 2; } elsif ( $HEIGHT le 360 ) { $VBITRATE = 730000; - $SPEED_X264 = 'faster'; + $SPEED_X264 = 'veryfast'; $SPEED_X264_ALONE = 'fast'; + $SPEED_VP8 = 5; + $SPEED_VP8_ALONE = 3; } elsif ( $HEIGHT le 432 ) { $VBITRATE = 1100000; - $SPEED_X264 = 'veryfast'; + $SPEED_X264 = 'ultrafast'; $SPEED_X264_ALONE = 'fast'; + $SPEED_VP8 = 8; + $SPEED_VP8_ALONE = 4; } elsif ( $HEIGHT le 540 ) { $VBITRATE = 2000000; $SPEED_X264 = 'toofast'; $SPEED_X264_ALONE = 'veryfast'; + $SPEED_VP8_ALONE = 5; } elsif ( $HEIGHT le 720 ) { $VBITRATE = 3000000; $SPEED_X264 = 'toofast'; $SPEED_X264_ALONE = 'ultrafast'; + $SPEED_VP8_ALONE = 15; } -unless ($HEIGHTS_WEBM) { $SPEED_X264 = $SPEED_X264_ALONE } if ( toofast == $SPEED_X264 ) die "Not enough CPU - reduce size or streams"; +# TODO: implement codec-specific height pools +#if ( toofast == $SPEED_X264 ) { @HEIGHTS_MPEG = () }; +#unless (@HEIGHTS_MPEG) { $SPEED_VP8 = $SPEED_VP8_ALONE } +#unless (@HEIGHTS_WEBM) { $SPEED_X264 = $SPEED_X264_ALONE } + my $VCAPS = "video/x-raw,height=$HEIGHT"; my $ACAPS = "audio/x-raw,rate=$AUDIORATE,channels=2,depth=16"; diff --git a/bin/decode+edit+encode b/bin/decode+edit+encode index 96b7081..7499130 100755 --- a/bin/decode+edit+encode +++ b/bin/decode+edit+encode @@ -10,10 +10,11 @@ OUTPUT=../tmp/omni/show0/earth.webm HEIGHT=360 -# TODO: Vary vpx quality based on height SPEED_VP8=4 -# inspired by Apple HLS recommendations +# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html +# TODO: adjust height steps or bitrates for 4:3 aspect ratio +# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264 if [ $HEIGHT -le 234 ]; then VBITRATE=145000; elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; diff --git a/bin/decode+edit+loop+encode+stream b/bin/decode+edit+loop+encode+stream index d0888fb..5d9a89e 100755 --- a/bin/decode+edit+loop+encode+stream +++ b/bin/decode+edit+loop+encode+stream @@ -21,16 +21,17 @@ ITERATIONS=${3-0} # endless by default HEIGHT=360 -# TODO: Vary vpx quality based on height -SPEED_VP8=15 - -# inspired by Apple HLS recommendations - if [ $HEIGHT -le 234 ]; then VBITRATE=145000; -elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; -elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; -elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; -elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; -elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; +# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html +# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer +# TODO: adjust height steps or bitrates for 4:3 aspect ratio +# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264 +# TODO: Externalize speeds to site-specific configfile + if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_VP8=2; +elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_VP8=2; +elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_VP8=3; +elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_VP8=4; +elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_VP8=5; +elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_VP8=15; fi # based on http://www.webmproject.org/docs/encoder-parameters/#real-time-cbr-encoding-and-streaming diff --git a/bin/encodevideo+loop+stream b/bin/encodevideo+loop+stream index b0c5c4c..8a438f7 100755 --- a/bin/encodevideo+loop+stream +++ b/bin/encodevideo+loop+stream @@ -16,16 +16,17 @@ FIRSTPORT=${2:-5002} # even number - next 3 ports used too # TODO: resolve this or resize based on it HEIGHT=360 -# TODO: Vary vpx quality based on height -SPEED_VP8=15 - -# inspired by Apple HLS recommendations - if [ $HEIGHT -le 234 ]; then VBITRATE=145000; -elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; -elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; -elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; -elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; -elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; +# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html +# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer +# TODO: adjust height steps or bitrates for 4:3 aspect ratio +# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264 +# TODO: Externalize speeds to site-specific configfile + if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_VP8=2; +elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_VP8=2; +elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_VP8=3; +elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_VP8=4; +elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_VP8=5; +elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_VP8=15; fi # based on http://www.webmproject.org/docs/encoder-parameters/#real-time-cbr-encoding-and-streaming diff --git a/bin/loop+encode+stream b/bin/loop+encode+stream index 4151789..5331121 100755 --- a/bin/loop+encode+stream +++ b/bin/loop+encode+stream @@ -22,16 +22,17 @@ ABITRATE_OPUS=48000 # TODO HEIGHT=360 -# TODO: Vary vpx quality based on height -SPEED_VP8=15 - -# inspired by Apple HLS recommendations - if [ $HEIGHT -le 234 ]; then VBITRATE=145000; -elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; -elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; -elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; -elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; -elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; +# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html +# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer +# TODO: adjust height steps or bitrates for 4:3 aspect ratio +# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264 +# TODO: Externalize speeds to site-specific configfile + if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_VP8=2; +elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_VP8=2; +elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_VP8=3; +elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_VP8=4; +elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_VP8=5; +elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_VP8=15; fi # based on http://www.webmproject.org/docs/encoder-parameters/#real-time-cbr-encoding-and-streaming diff --git a/bin/stream b/bin/stream index a326003..b758a49 100755 --- a/bin/stream +++ b/bin/stream @@ -88,20 +88,21 @@ HEIGHT=270 HEIGHTS_WEBM="$HEIGHT" HEIGHTS_MPEG="$HEIGHT" -# TODO: Vary vpx quality based on height -SPEED_VP8=15 - -# inspired by Apple HLS recommendations -# TODO: Externalize to site-specific configfile - if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_X264=slow; SPEED_X264_ALONE=fast; -elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_X264=faster; SPEED_X264_ALONE=fast; -elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_X264=faster; SPEED_X264_ALONE=fast; -elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_X264=veryfast; SPEED_X264_ALONE=fast; -elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_X264=toofast; SPEED_X264_ALONE=veryfast; -elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_X264=toofast; SPEED_X264_ALONE=ultrafast; +# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html +# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer +# TODO: adjust height steps or bitrates for 4:3 aspect ratio +# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264 +# TODO: Externalize speeds to site-specific configfile + if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_X264=fast; SPEED_X264_ALONE=fast; SPEED_VP8=3; SPEED_VP8_ALONE=2; +elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_X264=faster; SPEED_X264_ALONE=fast; SPEED_VP8=4; SPEED_VP8_ALONE=2; +elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_X264=veryfast; SPEED_X264_ALONE=fast; SPEED_VP8=5; SPEED_VP8_ALONE=3; +elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_X264=ultrafast; SPEED_X264_ALONE=fast; SPEED_VP8=8; SPEED_VP8_ALONE=4; +elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_X264=toofast; SPEED_X264_ALONE=veryfast; SPEED_VP8_ALONE=5; +elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_X264=toofast; SPEED_X264_ALONE=ultrafast; SPEED_VP8_ALONE=15; fi +[ toofast != "$SPEED_X264" ] || HEIGHTS_MPEG= +[ -n "$HEIGHTS_MPEG" ] || SPEED_VP8="$SPEED_VP8_ALONE" [ -n "$HEIGHTS_WEBM" ] || SPEED_X264="$SPEED_X264_ALONE" -[ toofast != "$SPEED_X264" ] || exit1 "Not enough CPU - reduce size or streams" # shellcheck disable=SC2048,SC2059 echo_n() { -- cgit v1.2.3