Browse Source
* 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 shellcheckpull/2555/head
12 changed files with 162 additions and 121 deletions
Binary file not shown.
@ -0,0 +1,33 @@
@@ -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 @@
@@ -1,55 +1,116 @@
|
||||
#!/usr/bin/env bash |
||||
#!/bin/bash |
||||
|
||||
# A recent version of ffmpeg is required for the loop of the provided videos |
||||
# to repeat indefinitely. |
||||
# Example: ./test/ocTestStream.sh ~/Downloads/*.mp4 rtmp://localhost/live/abc123 |
||||
# Requirements: |
||||
# ffmpeg (a recent version with loop video support) |
||||
# a Sans family font (for overlay text) |
||||
# awk |
||||
# readlink |
||||
|
||||
if ! [[ $1 ]] |
||||
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." |
||||
echo "./ocTestStream.sh *.mp4 [RTMPDESINATION]" |
||||
exit |
||||
fi |
||||
# Example: ./test/ocTestStream.sh ~/Downloads/*.mp4 rtmp://127.0.0.1/live/abc123 |
||||
|
||||
|
||||
ffmpeg_execs=( 'ffmpeg' 'ffmpeg.exe' ) |
||||
ffmpeg_paths=( './' '../' '' ) |
||||
|
||||
# Make the destination optional and point to localhost with default key |
||||
if [[ ${*: -1} == *"rtmp://"* ]]; then |
||||
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 |
||||
elif [[ ${*: -1} == *"rtmp://"* ]]; then |
||||
echo "RTMP server is specified" |
||||
DESTINATION_HOST=${*: -1} |
||||
FILE_COUNT=$(( ${#} - 1 )) |
||||
else |
||||
echo "RTMP server is not specified" |
||||
DESTINATION_HOST="rtmp://localhost/live/abc123" |
||||
DESTINATION_HOST="rtmp://127.0.0.1/live/abc123" |
||||
FILE_COUNT=${#} |
||||
fi |
||||
|
||||
if [[ FILE_COUNT -eq 0 ]]; then |
||||
echo "ERROR: ocTestStream needs a video file for sending to the RTMP server." |
||||
exit |
||||
if [[ -z "$ffmpeg_exec" ]]; then |
||||
echo "ERROR: ffmpeg was not found in path or in the current directory! Please install ffmpeg before using this script." |
||||
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 |
||||
|
||||
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 |
||||
if test -f list.txt; then |
||||
rm list.txt |
||||
fi |
||||
command "${ffmpeg_exec}" -hide_banner -loglevel panic -nostdin -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 "$DESTINATION_HOST" |
||||
|
||||
for file in $CONTENT |
||||
do |
||||
echo "file '$file'" >> list.txt |
||||
done |
||||
else |
||||
|
||||
function finish { |
||||
rm list.txt |
||||
} |
||||
trap finish EXIT |
||||
CONTENT=${*:1:${FILE_COUNT}} |
||||
|
||||
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" |
||||
rm -f list.txt |
||||
for file in $CONTENT |
||||
do |
||||
echo "file '$file'" >> list.txt |
||||
done |
||||
|
||||
function finish { |
||||
rm list.txt |
||||
} |
||||
trap finish 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" |
||||
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 |
||||
|
@ -1,29 +0,0 @@
@@ -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 |
Loading…
Reference in new issue