Try a convert vs stream function instead for video conversion.
This commit is contained in:
@@ -4,7 +4,23 @@ set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
: ${VIDEO_BITRATE:="1M"} # Only for encoding modes targeting bitrate
|
||||
: ${AUDIO_BITRATE:="192k"}
|
||||
|
||||
############## Setup #########################
|
||||
|
||||
function die {
|
||||
local status_code="$1"
|
||||
shift
|
||||
(>&2 echo "${@}")
|
||||
exit "$status_code"
|
||||
}
|
||||
|
||||
function log {
|
||||
(>&2 echo "${@}")
|
||||
}
|
||||
|
||||
############## Program #########################
|
||||
|
||||
function main {
|
||||
local cmd
|
||||
@@ -12,28 +28,10 @@ function main {
|
||||
shift
|
||||
if [ "$cmd" = "copy" ]; then
|
||||
copy "${@}"
|
||||
elif [ "$cmd" = "av1" ]; then
|
||||
av1 "${@}"
|
||||
elif [ "$cmd" = "stream_software_h264" ]; then
|
||||
stream_software_h264 "${@}"
|
||||
elif [ "$cmd" = "stream_hardware_h264" ]; then
|
||||
stream_hardware_h264 "${@}"
|
||||
elif [ "$cmd" = "preprocess_software_h264" ]; then
|
||||
preprocess_software_h264 "${@}"
|
||||
elif [ "$cmd" = "preprocess_hardware_h264" ]; then
|
||||
preprocess_hardware_h264 "${@}"
|
||||
elif [ "$cmd" = "vp9" ]; then
|
||||
vp9 "${@}"
|
||||
elif [ "$cmd" = "preprocess_hardware_vp9" ]; then
|
||||
preprocess_hardware_vp9 "${@}"
|
||||
elif [ "$cmd" = "vp8" ]; then
|
||||
vp8 "${@}"
|
||||
elif [ "$cmd" = "software_vp8" ]; then
|
||||
software_vp8 "${@}"
|
||||
elif [ "$cmd" = "preprocess_h264" ]; then
|
||||
preprocess_h264 "${@}"
|
||||
elif [ "$cmd" = "preprocess_vp8" ]; then
|
||||
preprocess_vp8 "${@}"
|
||||
elif [ "$cmd" = "convert" ]; then
|
||||
convert "${@}"
|
||||
elif [ "$cmd" = "stream" ]; then
|
||||
stream "${@}"
|
||||
elif [ "$cmd" = "webcam" ]; then
|
||||
webcam "${@}"
|
||||
elif [ "$cmd" = "encode_webcam" ]; then
|
||||
@@ -64,286 +62,106 @@ function copy {
|
||||
"rtsp://$USERNAME:$PASSWORD@172.16.16.251:8554/fetch"
|
||||
}
|
||||
|
||||
|
||||
|
||||
function av1 {
|
||||
# local additional_flags=()
|
||||
# additional_flags+=(--profile "$PROFILE")
|
||||
# (cd "$DIR/../" && cargo build --no-default-features "${additional_flags[@]}")
|
||||
|
||||
local destination_type="$1" # "stream" or "preprocess"
|
||||
local acceleration_type="$2" # "software" or "hardware"
|
||||
# shift 2
|
||||
|
||||
function convert {
|
||||
local args=()
|
||||
local acceleration_type="$1" # "software" or "hardware"
|
||||
local codec="$2" # "h264" or "av1"
|
||||
local file_to_cast="$3"
|
||||
local file_to_save="$4"
|
||||
|
||||
if [ "$destination_type" == "stream" ]; then
|
||||
args+=(-re -stream_loop -1)
|
||||
elif [ "$destination_type" == "preproces" ]; then
|
||||
|
||||
|
||||
# Verify parameters
|
||||
|
||||
|
||||
if [ "$acceleration_type" == "software" ]; then
|
||||
true
|
||||
elif [ "$acceleration_type" == "hardware" ]; then
|
||||
true
|
||||
else
|
||||
(>&2 echo "Unknown destination type: $destination_type")
|
||||
exit 1
|
||||
die 1 "Unknown acceleration type: $acceleration_type"
|
||||
fi
|
||||
|
||||
if [ "$codec" == "h264" ]; then
|
||||
true
|
||||
elif [ "$codec" == "av1" ]; then
|
||||
true
|
||||
else
|
||||
die 1 "Unknown codec: $codec"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Build command
|
||||
|
||||
|
||||
|
||||
if [ "$acceleration_type" == "software" ]; then
|
||||
true
|
||||
elif [ "$acceleration_type" == "hardware" ]; then
|
||||
args+=(-vaapi_device /dev/dri/renderD128)
|
||||
else
|
||||
(>&2 echo "Unknown acceleration type: $acceleration_type")
|
||||
exit 1
|
||||
fi
|
||||
|
||||
args+=(-i "$file_to_cast")
|
||||
|
||||
if [ "$acceleration_type" == "software" ]; then
|
||||
args+=(-c:v h264)
|
||||
elif [ "$acceleration_type" == "hardware" ]; then
|
||||
args+=(-vf 'format=nv12|vaapi,hwupload')
|
||||
args+=(-c:v h264_vaapi)
|
||||
else
|
||||
(>&2 echo "Unknown acceleration type: $acceleration_type")
|
||||
exit 1
|
||||
if [ "$codec" == "h264" ]; then
|
||||
if [ "$acceleration_type" == "software" ]; then
|
||||
args+=(-c:v h264)
|
||||
args+=(-profile:v high)
|
||||
args+=(-b:v "$VIDEO_BITRATE")
|
||||
elif [ "$acceleration_type" == "hardware" ]; then
|
||||
args+=(-vf 'format=nv12|vaapi,hwupload')
|
||||
args+=(-c:v h264_vaapi)
|
||||
args+=(-profile:v high)
|
||||
args+=(-b:v "$VIDEO_BITRATE")
|
||||
fi
|
||||
elif [ "$codec" == "av1" ]; then
|
||||
if [ "$acceleration_type" == "software" ]; then
|
||||
args+=(-c:v libsvtav1)
|
||||
args+=(-preset 4) # [0-13] default 10, lower = higher quality / slower encode
|
||||
args+=(-crf 20) # [0-63] default 35, lower = higher quality / larger file
|
||||
# Parameters: https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Parameters.md
|
||||
# fast-decode [0-2] default 0 (off), higher = faster decode
|
||||
# tune [0-2] default 1, Specifies whether to use PSNR or VQ as the tuning metric [0 = VQ, 1 = PSNR, 2 = SSIM]
|
||||
# film-grain-denoise, setting to 0 uses the original frames instead of denoising the film grain
|
||||
args+=(-svtav1-params "fast-decode=1:film-grain-denoise=0")
|
||||
elif [ "$acceleration_type" == "hardware" ]; then
|
||||
# -c:v av1_amf -quality quality
|
||||
args+=(-vf 'format=nv12|vaapi,hwupload')
|
||||
args+=(-c:v av1_vaapi)
|
||||
args+=(-b:v "$VIDEO_BITRATE")
|
||||
fi
|
||||
fi
|
||||
|
||||
args+=(-b:v 2M)
|
||||
args+=(-profile:v high)
|
||||
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
args+=(-bf 0)
|
||||
args+=(-strict -2)
|
||||
args+=(-c:a opus)
|
||||
args+=(-ac 2)
|
||||
args+=(-b:a 320k)
|
||||
args+=(-b:a "$AUDIO_BITRATE")
|
||||
args+=(-ar 48000)
|
||||
|
||||
if [ "$destination_type" == "stream" ]; then
|
||||
args+=(-f rtsp)
|
||||
args+=(-rtsp_transport tcp)
|
||||
args+=("rtsp://$USERNAME:$PASSWORD@172.16.16.251:8554/fetch")
|
||||
elif [ "$destination_type" == "preproces" ]; then
|
||||
args+=("$file_to_save")
|
||||
else
|
||||
(>&2 echo "Unknown destination type: $destination_type")
|
||||
exit 1
|
||||
fi
|
||||
args+=("$file_to_save")
|
||||
set -x
|
||||
</dev/null exec ffmpeg "${args[@]}"
|
||||
}
|
||||
|
||||
function stream_software_h264 {
|
||||
local file_to_cast
|
||||
file_to_cast="$3"
|
||||
function stream {
|
||||
local args=()
|
||||
local acceleration_type="$1" # "software" or "hardware"
|
||||
local codec="$2" # "h264" or "av1"
|
||||
|
||||
local USERNAME PASSWORD
|
||||
USERNAME="$1"
|
||||
PASSWORD="$2"
|
||||
local USERNAME="$3"
|
||||
local PASSWORD="$4"
|
||||
local file_to_cast="$5"
|
||||
|
||||
set -x
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
</dev/null exec ffmpeg \
|
||||
-re \
|
||||
-stream_loop -1 \
|
||||
-i "$file_to_cast" \
|
||||
-c:v h264 \
|
||||
-b:v 2M \
|
||||
-profile:v high \
|
||||
-bf 0 \
|
||||
-strict -2 \
|
||||
-c:a opus \
|
||||
-ac 2 \
|
||||
-b:a 320k \
|
||||
-ar 48000 \
|
||||
-f rtsp \
|
||||
-rtsp_transport tcp \
|
||||
"rtsp://$USERNAME:$PASSWORD@172.16.16.251:8554/fetch"
|
||||
}
|
||||
args+=(-re -stream_loop -1)
|
||||
|
||||
function stream_hardware_h264 {
|
||||
local file_to_cast
|
||||
file_to_cast="$3"
|
||||
|
||||
local USERNAME PASSWORD
|
||||
USERNAME="$1"
|
||||
PASSWORD="$2"
|
||||
|
||||
set -x
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
</dev/null exec ffmpeg \
|
||||
-re \
|
||||
-stream_loop -1 \
|
||||
-vaapi_device /dev/dri/renderD128 \
|
||||
-i "$file_to_cast" \
|
||||
-vf 'format=nv12|vaapi,hwupload' \
|
||||
-c:v h264_vaapi \
|
||||
-b:v 2M \
|
||||
-profile:v high \
|
||||
-bf 0 \
|
||||
-strict -2 \
|
||||
-c:a opus \
|
||||
-ac 2 \
|
||||
-b:a 320k \
|
||||
-ar 48000 \
|
||||
-f rtsp \
|
||||
-rtsp_transport tcp \
|
||||
"rtsp://$USERNAME:$PASSWORD@172.16.16.251:8554/fetch"
|
||||
}
|
||||
|
||||
function preprocess_software_h264 {
|
||||
local file_to_cast file_to_save
|
||||
file_to_cast="$1"
|
||||
file_to_save="$2"
|
||||
|
||||
set -x
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
</dev/null exec ffmpeg \
|
||||
-i "$file_to_cast" \
|
||||
-c:v h264 \
|
||||
-b:v 2M \
|
||||
-profile:v high \
|
||||
-bf 0 \
|
||||
-strict -2 \
|
||||
-c:a opus \
|
||||
-ac 2 \
|
||||
-b:a 320k \
|
||||
-ar 48000 \
|
||||
"$file_to_save"
|
||||
}
|
||||
|
||||
function preprocess_hardware_h264 {
|
||||
local file_to_cast file_to_save
|
||||
file_to_cast="$1"
|
||||
file_to_save="$2"
|
||||
|
||||
set -x
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
</dev/null exec ffmpeg \
|
||||
-vaapi_device /dev/dri/renderD128 \
|
||||
-i "$file_to_cast" \
|
||||
-vf 'format=nv12,hwupload' \
|
||||
-c:v h264_vaapi \
|
||||
-b:v 2M \
|
||||
-profile:v high \
|
||||
-bf 0 \
|
||||
-strict -2 \
|
||||
-c:a opus \
|
||||
-ac 2 \
|
||||
-b:a 320k \
|
||||
-ar 48000 \
|
||||
"$file_to_save"
|
||||
}
|
||||
|
||||
function vp9 {
|
||||
local file_to_cast
|
||||
file_to_cast="$3"
|
||||
|
||||
local USERNAME PASSWORD
|
||||
USERNAME="$1"
|
||||
PASSWORD="$2"
|
||||
|
||||
set -x
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
</dev/null exec ffmpeg \
|
||||
-re \
|
||||
-stream_loop -1 \
|
||||
-init_hw_device vaapi=foo:/dev/dri/renderD128 \
|
||||
-hwaccel vaapi \
|
||||
-hwaccel_output_format vaapi \
|
||||
-hwaccel_device foo \
|
||||
-i "$file_to_cast" \
|
||||
-filter_hw_device foo \
|
||||
-vf 'format=nv12|vaapi,hwupload' \
|
||||
-c:v vp9_vaapi \
|
||||
-bf 0 \
|
||||
-strict -2 \
|
||||
-c:a opus \
|
||||
-b:a 320k \
|
||||
-ar 48000 \
|
||||
-f rtsp \
|
||||
-rtsp_transport tcp \
|
||||
"rtsp://$USERNAME:$PASSWORD@172.16.16.251:8554/fetch"
|
||||
}
|
||||
|
||||
function preprocess_hardware_vp9 {
|
||||
local file_to_cast file_to_save
|
||||
file_to_cast="$1"
|
||||
file_to_save="$2"
|
||||
|
||||
set -x
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
</dev/null exec ffmpeg \
|
||||
-init_hw_device vaapi=foo:/dev/dri/renderD128 \
|
||||
-hwaccel vaapi \
|
||||
-hwaccel_output_format vaapi \
|
||||
-hwaccel_device foo \
|
||||
-i "$file_to_cast" \
|
||||
-filter_hw_device foo \
|
||||
-vf 'format=nv12|vaapi,hwupload' \
|
||||
-c:v vp9_vaapi \
|
||||
-bf 0 \
|
||||
-strict -2 \
|
||||
-c:a opus \
|
||||
-b:a 320k \
|
||||
-ar 48000 \
|
||||
"$file_to_save"
|
||||
}
|
||||
|
||||
function software_vp8 {
|
||||
local USERNAME PASSWORD
|
||||
USERNAME="$1"
|
||||
PASSWORD="$2"
|
||||
|
||||
local file_to_cast
|
||||
file_to_cast="$3"
|
||||
|
||||
set -x
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
# -strict -2 :: Enable support for experimental codecs like opus.
|
||||
# -b:v 2M :: Target 2 megabit/s
|
||||
# -crf 10 :: Target a quality level and adjust bitrate accordingly. This should be preferred, but ideally both should be used.
|
||||
</dev/null exec ffmpeg \
|
||||
-re \
|
||||
-stream_loop -1 \
|
||||
-i "$file_to_cast" \
|
||||
-c:v vp8 \
|
||||
-b:v 2M \
|
||||
-crf 10 \
|
||||
-bf 0 \
|
||||
-c:a opus \
|
||||
-b:a 320k \
|
||||
-ar 48000 \
|
||||
-strict -2 \
|
||||
-f rtsp \
|
||||
-rtsp_transport tcp \
|
||||
"rtsp://$USERNAME:$PASSWORD@172.16.16.251:8554/fetch"
|
||||
}
|
||||
|
||||
function preprocess_vp8 {
|
||||
local file_to_cast file_to_save
|
||||
file_to_cast="$1"
|
||||
file_to_save="$2"
|
||||
|
||||
set -x
|
||||
|
||||
# -bf 0 :: Disable b-frames because webrtc doesn't support h264 streams with b-frames.
|
||||
# -strict -2 :: Enable support for experimental codecs like opus.
|
||||
# -b:v 2M :: Target 2 megabit/s
|
||||
# -crf 10 :: Target a quality level and adjust bitrate accordingly. This should be preferred, but ideally both should be used.
|
||||
</dev/null exec ffmpeg \
|
||||
-i "$file_to_cast" \
|
||||
-c:v vp8 \
|
||||
-b:v 2M \
|
||||
-crf 10 \
|
||||
-bf 0 \
|
||||
-c:a opus \
|
||||
-b:a 320k \
|
||||
-ar 48000 \
|
||||
-strict -2 \
|
||||
"$file_to_save"
|
||||
args+=(-f rtsp)
|
||||
args+=(-rtsp_transport tcp)
|
||||
args+=("rtsp://$USERNAME:$PASSWORD@172.16.16.251:8554/fetch")
|
||||
}
|
||||
|
||||
function webcam {
|
||||
|
||||
Reference in New Issue
Block a user