improve stream testing script (#2549)
* merge testContent.sh into ocContent.sh * detect ffmpeg ffmpeg or ffmpeg.exe in path, current dir, or parent dir * use ocTestStream in api test * enable verbose logging for api tests * log ffmpeg version * change ffmpeg lookup order * set path properly for using the local ffmpeg * rm double space from transcoder error logs * update tests for new video stream do not test bitrate * set test stream target to 127.0.0.1 * log ffmpeg path * update ffmpeg to v4.4.1 * improve logs * fix ffmpeg installer script * fix api test runner * fix logs * install fonts * cleanup * use ocTestStream.sh for all automated tests * cleanup ocTestStream.sh * cleanup test/automated/hls/run.sh * Fix misspell * fix ffmpeg installer in automated test runners * spell fix * cleanup script * rev quick api tests * cleanup tmp paths properly in automated tests * rm unused ffmpeg package * cleanup * fix s3 test * cache ffmpeg bin for automated tests * shellcheck allow source * rm missplaced file if backup fails * use ffmpeg full path * set lookup path for shellcheck
This commit is contained in:
parent
6e82dbf16f
commit
64d3c37fb2
2
.github/workflows/shellcheck.yml
vendored
2
.github/workflows/shellcheck.yml
vendored
@ -26,5 +26,5 @@ jobs:
|
|||||||
run: apt update && apt install -y shellcheck bash && shellcheck --version
|
run: apt update && apt install -y shellcheck bash && shellcheck --version
|
||||||
|
|
||||||
- name: Check shell scripts
|
- name: Check shell scripts
|
||||||
run: shopt -s globstar && ls **/*.sh && shellcheck --severity=info **/*.sh
|
run: shopt -s globstar && ls **/*.sh && shellcheck -x -P "SCRIPTDIR" --severity=info **/*.sh
|
||||||
shell: bash
|
shell: bash
|
||||||
|
@ -133,7 +133,7 @@ unit-tests:
|
|||||||
|
|
||||||
api-tests:
|
api-tests:
|
||||||
FROM --platform=linux/amd64 bdwyertech/go-crosscompile
|
FROM --platform=linux/amd64 bdwyertech/go-crosscompile
|
||||||
RUN apk add ffmpeg npm
|
RUN apk add npm font-noto && fc-cache -f
|
||||||
COPY . /build
|
COPY . /build
|
||||||
WORKDIR /build/test/automated/api
|
WORKDIR /build/test/automated/api
|
||||||
RUN npm install
|
RUN npm install
|
||||||
|
@ -132,7 +132,7 @@ func (t *Transcoder) Start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := _commandExec.Start(); err != nil {
|
if err := _commandExec.Start(); err != nil {
|
||||||
log.Errorln("Transcoder error. See ", logging.GetTranscoderLogFilePath(), " for full output to debug.")
|
log.Errorln("Transcoder error. See", logging.GetTranscoderLogFilePath(), "for full output to debug.")
|
||||||
log.Panicln(err, command)
|
log.Panicln(err, command)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ func (t *Transcoder) Start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorln("transcoding error. look at ", logging.GetTranscoderLogFilePath(), " to help debug. your copy of ffmpeg may not support your selected codec of", t.codec.Name(), "https://owncast.online/docs/codecs/")
|
log.Errorln("transcoding error. look at", logging.GetTranscoderLogFilePath(), "to help debug. your copy of ffmpeg may not support your selected codec of", t.codec.Name(), "https://owncast.online/docs/codecs/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -374,10 +374,9 @@ test('verify updated config values', async (done) => {
|
|||||||
test('verify admin stream details', async (done) => {
|
test('verify admin stream details', async (done) => {
|
||||||
const res = await getAdminResponse('status');
|
const res = await getAdminResponse('status');
|
||||||
|
|
||||||
expect(res.body.broadcaster.streamDetails.width).toBe(320);
|
expect(res.body.broadcaster.streamDetails.width).toBe(1280);
|
||||||
expect(res.body.broadcaster.streamDetails.height).toBe(180);
|
expect(res.body.broadcaster.streamDetails.height).toBe(720);
|
||||||
expect(res.body.broadcaster.streamDetails.framerate).toBe(24);
|
expect(res.body.broadcaster.streamDetails.framerate).toBe(60);
|
||||||
expect(res.body.broadcaster.streamDetails.videoBitrate).toBe(1269);
|
|
||||||
expect(res.body.broadcaster.streamDetails.videoCodec).toBe('H.264');
|
expect(res.body.broadcaster.streamDetails.videoCodec).toBe('H.264');
|
||||||
expect(res.body.broadcaster.streamDetails.audioCodec).toBe('AAC');
|
expect(res.body.broadcaster.streamDetails.audioCodec).toBe('AAC');
|
||||||
expect(res.body.online).toBe(true);
|
expect(res.body.online).toBe(true);
|
||||||
|
@ -1,19 +1,13 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
source ../tools.sh
|
||||||
|
|
||||||
TEMP_DB=$(mktemp)
|
TEMP_DB=$(mktemp)
|
||||||
|
|
||||||
# Install the node test framework
|
# Install the node test framework
|
||||||
npm install --quiet --no-progress
|
npm install --quiet --no-progress
|
||||||
|
|
||||||
# Download a specific version of ffmpeg
|
ffmpegInstall
|
||||||
if [ ! -d "ffmpeg" ]; then
|
|
||||||
mkdir ffmpeg
|
|
||||||
pushd ffmpeg >/dev/null || exit
|
|
||||||
curl -sL https://github.com/vot/ffbinaries-prebuilt/releases/download/v4.2.1/ffmpeg-4.2.1-linux-64.zip --output ffmpeg.zip >/dev/null
|
|
||||||
unzip -o ffmpeg.zip >/dev/null
|
|
||||||
PATH=$PATH:$(pwd)
|
|
||||||
popd >/dev/null || exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
pushd ../../.. >/dev/null || exit
|
pushd ../../.. >/dev/null || exit
|
||||||
|
|
||||||
@ -27,12 +21,12 @@ sleep 5
|
|||||||
|
|
||||||
# Start streaming the test file over RTMP to
|
# Start streaming the test file over RTMP to
|
||||||
# the local owncast instance.
|
# the local owncast instance.
|
||||||
ffmpeg -hide_banner -loglevel panic -stream_loop -1 -re -i ../test.mp4 -vcodec libx264 -profile:v main -sc_threshold 0 -b:v 1300k -acodec copy -f flv rtmp://127.0.0.1/live/abc123 &
|
../../ocTestStream.sh &
|
||||||
FFMPEG_PID=$!
|
FFMPEG_PID=$!
|
||||||
|
|
||||||
function finish {
|
function finish {
|
||||||
rm "$TEMP_DB"
|
|
||||||
kill $SERVER_PID $FFMPEG_PID
|
kill $SERVER_PID $FFMPEG_PID
|
||||||
|
rm -fr "$TEMP_DB" "$FFMPEG_PATH"
|
||||||
}
|
}
|
||||||
trap finish EXIT
|
trap finish EXIT
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
|
source ../tools.sh
|
||||||
|
|
||||||
TEMP_DB=$(mktemp)
|
TEMP_DB=$(mktemp)
|
||||||
BUILD_ID=$((RANDOM % 7200 + 600))
|
BUILD_ID=$((RANDOM % 7200 + 600))
|
||||||
BROWSER="electron" # Default. Will try to use Google Chrome.
|
BROWSER="electron" # Default. Will try to use Google Chrome.
|
||||||
@ -38,16 +40,7 @@ fi
|
|||||||
|
|
||||||
set -o nounset
|
set -o nounset
|
||||||
|
|
||||||
# Download a specific version of ffmpeg
|
ffmpegInstall
|
||||||
if [ ! -d "ffmpeg" ]; then
|
|
||||||
echo "Downloading ffmpeg..."
|
|
||||||
mkdir -p /tmp/ffmpeg
|
|
||||||
pushd /tmp/ffmpeg >/dev/null
|
|
||||||
curl -sL --fail https://github.com/vot/ffbinaries-prebuilt/releases/download/v4.2.1/ffmpeg-4.2.1-linux-64.zip --output ffmpeg.zip
|
|
||||||
unzip -o ffmpeg.zip >/dev/null
|
|
||||||
PATH=$PATH:$(pwd)
|
|
||||||
popd >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Build and run owncast from source
|
# Build and run owncast from source
|
||||||
echo "Building owncast..."
|
echo "Building owncast..."
|
||||||
@ -67,13 +60,13 @@ npx cypress run --browser "$BROWSER" --group "mobile-offline" --ci-build-id $BUI
|
|||||||
# Start streaming the test file over RTMP to
|
# Start streaming the test file over RTMP to
|
||||||
# the local owncast instance.
|
# the local owncast instance.
|
||||||
echo "Waiting for stream to start..."
|
echo "Waiting for stream to start..."
|
||||||
ffmpeg -hide_banner -loglevel panic -stream_loop -1 -re -i ../test.mp4 -vcodec libx264 -profile:v main -sc_threshold 0 -b:v 1300k -acodec copy -f flv rtmp://127.0.0.1/live/abc123 &
|
../../ocTestStream.sh &
|
||||||
STREAMING_CLIENT=$!
|
STREAMING_CLIENT=$!
|
||||||
|
|
||||||
function finish {
|
function finish {
|
||||||
echo "Cleaning up..."
|
echo "Cleaning up..."
|
||||||
rm "$TEMP_DB"
|
|
||||||
kill $SERVER_PID $STREAMING_CLIENT
|
kill $SERVER_PID $STREAMING_CLIENT
|
||||||
|
rm -fr "$TEMP_DB" "$FFMPEG_PATH"
|
||||||
}
|
}
|
||||||
trap finish EXIT SIGHUP SIGINT SIGTERM SIGQUIT SIGABRT SIGTERM
|
trap finish EXIT SIGHUP SIGINT SIGTERM SIGQUIT SIGABRT SIGTERM
|
||||||
|
|
||||||
|
@ -2,12 +2,7 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
function start_stream() {
|
source ../tools.sh
|
||||||
# Start streaming the test file over RTMP to
|
|
||||||
# the local owncast instance.
|
|
||||||
ffmpeg -hide_banner -loglevel panic -stream_loop -1 -re -i ../test.mp4 -vcodec libx264 -profile:v main -sc_threshold 0 -b:v 1300k -acodec copy -f flv rtmp://127.0.0.1/live/abc123 &
|
|
||||||
STREAMING_CLIENT=$!
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_storage_config() {
|
function update_storage_config() {
|
||||||
echo "Configuring external storage to use ${S3_BUCKET}..."
|
echo "Configuring external storage to use ${S3_BUCKET}..."
|
||||||
@ -23,15 +18,7 @@ TEMP_DB=$(mktemp)
|
|||||||
# Install the node test framework
|
# Install the node test framework
|
||||||
npm install --silent >/dev/null
|
npm install --silent >/dev/null
|
||||||
|
|
||||||
# Download a specific version of ffmpeg
|
ffmpegInstall
|
||||||
if [ ! -d "ffmpeg" ]; then
|
|
||||||
mkdir ffmpeg
|
|
||||||
pushd ffmpeg >/dev/null
|
|
||||||
curl -sL https://github.com/vot/ffbinaries-prebuilt/releases/download/v4.2.1/ffmpeg-4.2.1-linux-64.zip --output ffmpeg.zip >/dev/null
|
|
||||||
unzip -o ffmpeg.zip >/dev/null
|
|
||||||
PATH=$PATH:$(pwd)
|
|
||||||
popd >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
pushd ../../.. >/dev/null
|
pushd ../../.. >/dev/null
|
||||||
|
|
||||||
@ -40,18 +27,19 @@ go build -o owncast main.go
|
|||||||
./owncast -database "$TEMP_DB" &
|
./owncast -database "$TEMP_DB" &
|
||||||
SERVER_PID=$!
|
SERVER_PID=$!
|
||||||
|
|
||||||
function finish {
|
|
||||||
echo "Cleaning up..."
|
|
||||||
rm "$TEMP_DB"
|
|
||||||
kill $SERVER_PID $STREAMING_CLIENT
|
|
||||||
}
|
|
||||||
trap finish EXIT
|
|
||||||
|
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
sleep 5
|
sleep 5
|
||||||
|
|
||||||
# Start the stream.
|
# Start the stream.
|
||||||
start_stream
|
../../ocTestStream.sh &
|
||||||
|
STREAMING_CLIENT=$!
|
||||||
|
|
||||||
|
function finish {
|
||||||
|
echo "Cleaning up..."
|
||||||
|
kill $SERVER_PID $STREAMING_CLIENT
|
||||||
|
rm -fr "$TEMP_DB" "$FFMPEG_PATH"
|
||||||
|
}
|
||||||
|
trap finish EXIT
|
||||||
|
|
||||||
echo "Waiting..."
|
echo "Waiting..."
|
||||||
sleep 13
|
sleep 13
|
||||||
@ -73,7 +61,9 @@ sleep 5
|
|||||||
update_storage_config
|
update_storage_config
|
||||||
|
|
||||||
# start the stream.
|
# start the stream.
|
||||||
start_stream
|
../../ocTestStream.sh &
|
||||||
|
STREAMING_CLIENT=$!
|
||||||
|
|
||||||
echo "Waiting..."
|
echo "Waiting..."
|
||||||
sleep 13
|
sleep 13
|
||||||
|
|
||||||
|
Binary file not shown.
33
test/automated/tools.sh
Executable file
33
test/automated/tools.sh
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ffmpegInstall(){
|
||||||
|
# install a specific version of ffmpeg
|
||||||
|
|
||||||
|
FFMPEG_VER="4.4.1"
|
||||||
|
FFMPEG_PATH="$(pwd)/ffmpeg-$FFMPEG_VER"
|
||||||
|
|
||||||
|
if ! [[ -d "$FFMPEG_PATH" ]]; then
|
||||||
|
mkdir "$FFMPEG_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
pushd "$FFMPEG_PATH" >/dev/null || exit
|
||||||
|
|
||||||
|
if [[ -x "$FFMPEG_PATH/ffmpeg" ]]; then
|
||||||
|
|
||||||
|
ffmpeg_version=$("$FFMPEG_PATH/ffmpeg" -version | awk -F 'ffmpeg version' '{print $2}' | awk 'NR==1{print $1}')
|
||||||
|
|
||||||
|
if [[ "$ffmpeg_version" == "$FFMPEG_VER-static" ]]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
mv "$FFMPEG_PATH/ffmpeg" "$FFMPEG_PATH/ffmpeg.bk" || rm -f "$FFMPEG_PATH/ffmpeg"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f ffmpeg.zip
|
||||||
|
curl -sL --fail https://github.com/ffbinaries/ffbinaries-prebuilt/releases/download/v${FFMPEG_VER}/ffmpeg-${FFMPEG_VER}-linux-64.zip --output ffmpeg.zip >/dev/null
|
||||||
|
unzip -o ffmpeg.zip >/dev/null && rm -f ffmpeg.zip
|
||||||
|
chmod +x ffmpeg
|
||||||
|
PATH=$FFMPEG_PATH:$PATH
|
||||||
|
|
||||||
|
popd >/dev/null || exit
|
||||||
|
}
|
@ -1,55 +1,116 @@
|
|||||||
#!/usr/bin/env bash
|
#!/bin/bash
|
||||||
|
|
||||||
# A recent version of ffmpeg is required for the loop of the provided videos
|
# Requirements:
|
||||||
# to repeat indefinitely.
|
# ffmpeg (a recent version with loop video support)
|
||||||
# Example: ./test/ocTestStream.sh ~/Downloads/*.mp4 rtmp://localhost/live/abc123
|
# a Sans family font (for overlay text)
|
||||||
|
# awk
|
||||||
|
# readlink
|
||||||
|
|
||||||
if ! [[ $1 ]]
|
# Example: ./test/ocTestStream.sh ~/Downloads/*.mp4 rtmp://127.0.0.1/live/abc123
|
||||||
then
|
|
||||||
echo "ocTestStream is used for sending pre-recorded content to a RTMP server."
|
|
||||||
echo "Will default to localhost with the stream key of abc123 if one isn't provided."
|
ffmpeg_execs=( 'ffmpeg' 'ffmpeg.exe' )
|
||||||
echo "./ocTestStream.sh *.mp4 [RTMPDESINATION]"
|
ffmpeg_paths=( './' '../' '' )
|
||||||
|
|
||||||
|
for _ffmpeg_exec in "${ffmpeg_execs[@]}"; do
|
||||||
|
for _ffmpeg_path in "${ffmpeg_paths[@]}"; do
|
||||||
|
if [[ -x "$(command -v "${_ffmpeg_path}${_ffmpeg_exec}")" ]]; then
|
||||||
|
ffmpeg_exec="${_ffmpeg_path}${_ffmpeg_exec}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ${*: -1} == "--help" ]]; then
|
||||||
|
echo "ocTestStream is used for sending pre-recorded or internal test content to an RTMP server."
|
||||||
|
echo "Usage: ./ocTestStream.sh [VIDEO_FILES] [RTMP_DESINATION]"
|
||||||
|
echo "VIDEO_FILES: path to one or multiple videos for sending to the RTMP server (optional)"
|
||||||
|
echo "RTMP_DESINATION: URL of RTMP server with key (optional; default: rtmp://127.0.0.1/live/abc123)"
|
||||||
exit
|
exit
|
||||||
fi
|
elif [[ ${*: -1} == *"rtmp://"* ]]; then
|
||||||
|
|
||||||
# Make the destination optional and point to localhost with default key
|
|
||||||
if [[ ${*: -1} == *"rtmp://"* ]]; then
|
|
||||||
echo "RTMP server is specified"
|
echo "RTMP server is specified"
|
||||||
DESTINATION_HOST=${*: -1}
|
DESTINATION_HOST=${*: -1}
|
||||||
FILE_COUNT=$(( ${#} - 1 ))
|
FILE_COUNT=$(( ${#} - 1 ))
|
||||||
else
|
else
|
||||||
echo "RTMP server is not specified"
|
echo "RTMP server is not specified"
|
||||||
DESTINATION_HOST="rtmp://localhost/live/abc123"
|
DESTINATION_HOST="rtmp://127.0.0.1/live/abc123"
|
||||||
FILE_COUNT=${#}
|
FILE_COUNT=${#}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ FILE_COUNT -eq 0 ]]; then
|
if [[ -z "$ffmpeg_exec" ]]; then
|
||||||
echo "ERROR: ocTestStream needs a video file for sending to the RTMP server."
|
echo "ERROR: ffmpeg was not found in path or in the current directory! Please install ffmpeg before using this script."
|
||||||
exit
|
exit 1
|
||||||
|
else
|
||||||
|
ffmpeg_version=$("$ffmpeg_exec" -version | awk -F 'ffmpeg version' '{print $2}' | awk 'NR==1{print $1}')
|
||||||
|
echo "ffmpeg executable: $ffmpeg_exec ($ffmpeg_version)"
|
||||||
|
echo "ffmpeg path: $(readlink -f "$(which "$ffmpeg_exec")")"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CONTENT=${*:1:${FILE_COUNT}}
|
if [[ ${FILE_COUNT} -eq 0 ]]; then
|
||||||
|
echo "Streaming internal test video loop to $DESTINATION_HOST"
|
||||||
|
echo "...press ctrl+c to exit"
|
||||||
|
|
||||||
# Delete the old list of files if it exists
|
command "${ffmpeg_exec}" -hide_banner -loglevel panic -nostdin -re -f lavfi \
|
||||||
if test -f list.txt; then
|
-i "testsrc=size=1280x720:rate=60[out0];sine=frequency=400:sample_rate=48000[out1]" \
|
||||||
rm list.txt
|
-vf "[in]drawtext=fontsize=96: box=1: boxcolor=black@0.75: boxborderw=5: fontcolor=white: x=(w-text_w)/2: y=((h-text_h)/2)+((h-text_h)/-2): text='Owncast Test Stream', drawtext=fontsize=96: box=1: boxcolor=black@0.75: boxborderw=5: fontcolor=white: x=(w-text_w)/2: y=((h-text_h)/2)+((h-text_h)/2): text='%{gmtime\:%H\\\\\:%M\\\\\:%S} UTC'[out]" \
|
||||||
|
-nal-hrd cbr \
|
||||||
|
-metadata:s:v encoder=test \
|
||||||
|
-vcodec libx264 \
|
||||||
|
-acodec aac \
|
||||||
|
-preset veryfast \
|
||||||
|
-profile:v baseline \
|
||||||
|
-tune zerolatency \
|
||||||
|
-bf 0 \
|
||||||
|
-g 0 \
|
||||||
|
-b:v 6320k \
|
||||||
|
-b:a 160k \
|
||||||
|
-ac 2 \
|
||||||
|
-ar 48000 \
|
||||||
|
-minrate 6320k \
|
||||||
|
-maxrate 6320k \
|
||||||
|
-bufsize 6320k \
|
||||||
|
-muxrate 6320k \
|
||||||
|
-r 60 \
|
||||||
|
-pix_fmt yuv420p \
|
||||||
|
-color_range 1 -colorspace 1 -color_primaries 1 -color_trc 1 \
|
||||||
|
-flags:v +global_header \
|
||||||
|
-bsf:v dump_extra \
|
||||||
|
-x264-params "nal-hrd=cbr:min-keyint=2:keyint=2:scenecut=0:bframes=0" \
|
||||||
|
-f flv "$DESTINATION_HOST"
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
CONTENT=${*:1:${FILE_COUNT}}
|
||||||
|
|
||||||
|
rm -f list.txt
|
||||||
|
for file in $CONTENT
|
||||||
|
do
|
||||||
|
echo "file '$file'" >> list.txt
|
||||||
|
done
|
||||||
|
|
||||||
|
function finish {
|
||||||
|
rm list.txt
|
||||||
|
}
|
||||||
|
trap finish EXIT
|
||||||
|
|
||||||
|
echo "Streaming a loop of ${FILE_COUNT} video(s) to $DESTINATION_HOST"
|
||||||
|
if [[ ${FILE_COUNT} -gt 1 ]]; then
|
||||||
|
echo "Warning: If these files differ greatly in formats, transitioning from one to another may not always work correctly."
|
||||||
|
fi
|
||||||
|
echo "$CONTENT"
|
||||||
|
echo "...press ctrl+c to exit"
|
||||||
|
|
||||||
|
command "${ffmpeg_exec}" -hide_banner -loglevel panic -nostdin -stream_loop -1 -re -f concat \
|
||||||
|
-safe 0 \
|
||||||
|
-i list.txt \
|
||||||
|
-vcodec libx264 \
|
||||||
|
-profile:v high \
|
||||||
|
-g 48 \
|
||||||
|
-r 24 \
|
||||||
|
-sc_threshold 0 \
|
||||||
|
-b:v 1300k \
|
||||||
|
-preset veryfast \
|
||||||
|
-acodec copy \
|
||||||
|
-vf drawtext="fontsize=96: box=1: boxcolor=black@0.75: boxborderw=5: fontcolor=white: x=(w-text_w)/2: y=((h-text_h)/2)+((h-text_h)/4): text='%{gmtime\:%H\\\\\:%M\\\\\:%S}'" \
|
||||||
|
-f flv "$DESTINATION_HOST"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for file in $CONTENT
|
|
||||||
do
|
|
||||||
echo "file '$file'" >> list.txt
|
|
||||||
done
|
|
||||||
|
|
||||||
function finish {
|
|
||||||
rm list.txt
|
|
||||||
}
|
|
||||||
trap finish EXIT
|
|
||||||
|
|
||||||
echo "Streaming a loop of ${FILE_COUNT} videos to $DESTINATION_HOST."
|
|
||||||
if [[ FILE_COUNT -gt 1 ]]; then
|
|
||||||
echo "Warning: If these files differ greatly in formats transitioning from one to another may not always work correctly."
|
|
||||||
fi
|
|
||||||
echo "$CONTENT"
|
|
||||||
echo "...press ctl+c to exit"
|
|
||||||
|
|
||||||
ffmpeg -hide_banner -loglevel panic -stream_loop -1 -re -f concat -safe 0 -i list.txt -vcodec libx264 -profile:v high -g 48 -r 24 -sc_threshold 0 -b:v 1300k -preset veryfast -acodec copy -vf drawtext="fontfile=monofonto.ttf: fontsize=96: box=1: boxcolor=black@0.75: boxborderw=5: fontcolor=white: x=(w-text_w)/2: y=((h-text_h)/2)+((h-text_h)/4): text='%{gmtime\:%H\\\\\:%M\\\\\:%S}'" -f flv "$DESTINATION_HOST"
|
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
ffmpeg -hide_banner -loglevel panic -re -f lavfi \
|
|
||||||
-i "testsrc=size=1280x720:rate=60[out0];sine=frequency=400:sample_rate=48000[out1]" \
|
|
||||||
-vf "[in]drawtext=fontsize=96: box=1: boxcolor=black@0.75: boxborderw=5: fontcolor=white: x=(w-text_w)/2: y=((h-text_h)/2)+((h-text_h)/-2): text='Owncast Test Stream', drawtext=fontsize=96: box=1: boxcolor=black@0.75: boxborderw=5: fontcolor=white: x=(w-text_w)/2: y=((h-text_h)/2)+((h-text_h)/2): text='%{gmtime\:%H\\\\\:%M\\\\\:%S} UTC'[out]" \
|
|
||||||
-nal-hrd cbr \
|
|
||||||
-metadata:s:v encoder=test \
|
|
||||||
-vcodec libx264 \
|
|
||||||
-acodec aac \
|
|
||||||
-preset veryfast \
|
|
||||||
-profile:v baseline \
|
|
||||||
-tune zerolatency \
|
|
||||||
-bf 0 \
|
|
||||||
-g 0 \
|
|
||||||
-b:v 6320k \
|
|
||||||
-b:a 160k \
|
|
||||||
-ac 2 \
|
|
||||||
-ar 48000 \
|
|
||||||
-minrate 6320k \
|
|
||||||
-maxrate 6320k \
|
|
||||||
-bufsize 6320k \
|
|
||||||
-muxrate 6320k \
|
|
||||||
-r 60 \
|
|
||||||
-pix_fmt yuv420p \
|
|
||||||
-color_range 1 -colorspace 1 -color_primaries 1 -color_trc 1 \
|
|
||||||
-flags:v +global_header \
|
|
||||||
-bsf:v dump_extra \
|
|
||||||
-x264-params "nal-hrd=cbr:min-keyint=2:keyint=2:scenecut=0:bframes=0" \
|
|
||||||
-f flv "rtmp://127.0.0.1/live/abc123" >/dev/null
|
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
### Form fields
|
### Form fields
|
||||||
|
|
||||||
- Feel free to use the pre-styled `<TextField>` text form field or the `<ToggleSwitch>` compnent, in a group of form fields together. These have been styled and laid out to match each other.
|
- Feel free to use the pre-styled `<TextField>` text form field or the `<ToggleSwitch>` component, in a group of form fields together. These have been styled and laid out to match each other.
|
||||||
|
|
||||||
- `Slider`'s - If your form uses an Ant Slider component, follow this recommended markup of CSS classes to maintain a consistent look and feel to other Sliders in the app.
|
- `Slider`'s - If your form uses an Ant Slider component, follow this recommended markup of CSS classes to maintain a consistent look and feel to other Sliders in the app.
|
||||||
```
|
```
|
||||||
|
Loading…
x
Reference in New Issue
Block a user