44# DEFAULT VALUES
55# #################################################################################
66
7- VIDEO_SAMPLE_URL=https://archive.org/download/e-dv548_lwe08_christa_casebeer_003.ogg/e-dv548_lwe08_christa_casebeer_003.mp4
7+ # Big Buck Bunny is the default source video
8+ BUNNY_ZIP_URL=" https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_60fps_normal.mp4.zip"
9+ BUNNY_ZIP_FILE=" bbb_sunflower_1080p_60fps_normal.mp4.zip"
10+ BUNNY_VIDEO_FILE=" bbb_sunflower_1080p_60fps_normal.mp4"
11+ INTERVIEW_VIDEO_URL=" https://archive.org/download/e-dv548_lwe08_christa_casebeer_003.ogg/e-dv548_lwe08_christa_casebeer_003.mp4"
12+
13+ VIDEO_SAMPLE_URL=" $BUNNY_VIDEO_FILE " # Default to bunny (will be downloaded if needed)
814WIDTH=640
915HEIGHT=480
10- VIDEO_DURATION=00:00:30
16+ VIDEO_DURATION=00:00:05
17+ START_POSITION=00:00:52
1118PADDING_DURATION_SEC=1
1219AUDIO_SAMPLE_RATE_HZ=48000
1320TONE_FREQUENCY_HZ=1000
1421AUDIO_CHANNELS_NUMBER=2
1522FPS=30
23+ USE_BUNNY=true # Bunny is default
1624FFMPEG_LOG=" -loglevel error"
17- TARGET_VIDEO=./test.y4m
18- TARGET_AUDIO=./test.wav
1925GENERATE_DEFAULT_REF=false
2026DEFAULT_VIDEO_REF=./test-no-padding.yuv
2127DEFAULT_AUDIO_REF=./test-no-padding.wav
2228FONT=./arial.ttf
2329CLEANUP=true
2430GET_ORIGINAL_STATS=false
25- USAGE=" Usage: ` basename $0 ` [-d=duration] [-p=padding_duration_sec] [--game] [--generate_default_ref] [--no_cleanup] [--clean] [-v=video_url] [-w=width] [-h=height] [-a=audio_url] [-f=fps] [--original]"
31+ GENERATE_STREAMING=true
32+ USAGE=" Usage: $( basename $0 ) [-d=duration] [-p=padding_duration_sec] [--game] [--interview] [--generate_default_ref] [--no_cleanup] [--clean] [--no-streaming] [-v=video_url] [-w=width] [-h=height] [-a=audio_url] [-f=fps] [--original]"
2633
2734# #################################################################################
2835# FUNCTIONS
@@ -120,6 +127,16 @@ for i in "$@"; do
120127 case $i in
121128 --game)
122129 VIDEO_SAMPLE_URL=https://ia802808.us.archive.org/6/items/ForniteBattle8/fornite%20battle%202.mp4
130+ USE_BUNNY=false
131+ VIDEO_DURATION=00:00:30
132+ START_POSITION=00:00:00
133+ shift
134+ ;;
135+ --interview)
136+ VIDEO_SAMPLE_URL=" $INTERVIEW_VIDEO_URL "
137+ USE_BUNNY=false
138+ VIDEO_DURATION=00:00:15
139+ START_POSITION=00:00:00
123140 shift
124141 ;;
125142 --generate_default_ref)
@@ -143,6 +160,10 @@ for i in "$@"; do
143160 exit 0
144161 shift
145162 ;;
163+ --no-streaming)
164+ GENERATE_STREAMING=false
165+ shift
166+ ;;
146167 -v=* )
147168 VIDEO_SAMPLE_URL=" ${i#* =} "
148169 shift
@@ -178,17 +199,63 @@ done
178199# INIT
179200# #################################################################################
180201
202+ # Download Big Buck Bunny if it's the source and doesn't exist yet
203+ if [ " $USE_BUNNY " = true ]; then
204+ # Download zip if not exists
205+ if [ ! -f " $BUNNY_ZIP_FILE " ] && [ ! -f " $BUNNY_VIDEO_FILE " ]; then
206+ echo " Downloading Big Buck Bunny video from blender.org..."
207+ if command -v curl & > /dev/null; then
208+ curl -L -o " $BUNNY_ZIP_FILE " " $BUNNY_ZIP_URL " --progress-bar
209+ elif command -v wget & > /dev/null; then
210+ wget -O " $BUNNY_ZIP_FILE " " $BUNNY_ZIP_URL "
211+ else
212+ echo " Error: curl or wget required"
213+ exit 1
214+ fi
215+ fi
216+
217+ # Unzip if video file doesn't exist
218+ if [ ! -f " $BUNNY_VIDEO_FILE " ]; then
219+ echo " Extracting Big Buck Bunny video from zip..."
220+ unzip -o " $BUNNY_ZIP_FILE "
221+ fi
222+
223+ VIDEO_SAMPLE_URL=" $BUNNY_VIDEO_FILE "
224+ fi
225+
226+ # Determine media type from source URL
227+ case " $VIDEO_SAMPLE_URL " in
228+ * christa_casebeer* |* interview* )
229+ MEDIA_TYPE=" interview"
230+ ;;
231+ * ForniteBattle* )
232+ MEDIA_TYPE=" game"
233+ ;;
234+ * bbb_sunflower* |* BBB* )
235+ MEDIA_TYPE=" bunny"
236+ ;;
237+ * )
238+ MEDIA_TYPE=" custom"
239+ ;;
240+ esac
241+
242+ # Output filenames using consistent naming: {type}_{height}p_{fps}fps.{extension}
243+ BASE_NAME=" ${MEDIA_TYPE} _${HEIGHT} p_${FPS} fps"
244+ TARGET_VIDEO=" ./${BASE_NAME} .y4m"
245+ TARGET_AUDIO=" ./${MEDIA_TYPE} .wav"
246+ STREAMING_VIDEO=" ./${BASE_NAME} .h264"
247+ STREAMING_AUDIO=" ./${MEDIA_TYPE} .ogg"
181248
182249# #########################
183250# 1. Download video sample
184251# #########################
185252VIDEO_SAMPLE_NAME=$( echo ${VIDEO_SAMPLE_URL##*/ } | sed -e ' s/%20/ /g' )
186253
187254if [ ! -f " $VIDEO_SAMPLE_NAME " ]; then
188- echo " Content video ($VIDEO_SAMPLE_NAME ) not exits ... downloading"
255+ echo " Content video ($VIDEO_SAMPLE_NAME ) not exists ... downloading"
189256 wget $VIDEO_SAMPLE_URL
190257else
191- echo " Content video ($VIDEO_SAMPLE_NAME ) already exits "
258+ echo " Content video ($VIDEO_SAMPLE_NAME ) already exists "
192259fi
193260if [ -z " $FPS " ]; then
194261 FPS=$( ffprobe -v error -select_streams v -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 " $VIDEO_SAMPLE_NAME " )
208275# ######################
209276if [ " $GET_ORIGINAL_STATS " = false ]; then
210277 echo " Cutting original video (duration $VIDEO_DURATION )"
211- ffmpeg $FFMPEG_LOG -y -i " $VIDEO_SAMPLE_NAME " -ss 00:00:00 -t $VIDEO_DURATION -vf scale=" $WIDTH :$HEIGHT " ,setsar=1:1 -r $FPS test-no-frame-number.mp4
278+ ffmpeg $FFMPEG_LOG -y -i " $VIDEO_SAMPLE_NAME " -ss $START_POSITION -t $VIDEO_DURATION -vf scale=" $WIDTH :$HEIGHT " ,setsar=1:1 -r $FPS test-no-frame-number.mp4
212279 OUTPUT=" test-no-frame-number.mp4"
213280fi
214281
@@ -349,7 +416,59 @@ if $GENERATE_DEFAULT_REF; then
349416fi
350417
351418# ###############################
352- # 9. Delete temporal video files
419+ # 9. Generate streaming files (H.264 + Opus Ogg)
420+ # ###############################
421+ if $GENERATE_STREAMING ; then
422+ echo " =========================================="
423+ echo " Generating streaming media files for LiveKit"
424+ echo " =========================================="
425+
426+ # Get FPS as integer for keyint calculation
427+ FPS_INT=$( echo " $FPS " | awk ' {if ($1 ~ /\//) {split($1, a, "/"); print a[1]/a[2]} else {print $1}}' | awk ' {printf "%d", $1}' )
428+ if [ -z " $FPS_INT " ] || [ " $FPS_INT " -le 0 ]; then
429+ FPS_INT=30
430+ fi
431+
432+ # Generate H.264 Annex B video from test.mp4 (same content as QoE Y4M)
433+ echo " Generating H.264 video ($STREAMING_VIDEO )..."
434+ ffmpeg $FFMPEG_LOG -y -i test.mp4 \
435+ -c:v libx264 -preset veryfast -profile:v baseline \
436+ -pix_fmt yuv420p \
437+ -x264-params " keyint=$(( FPS_INT * 4 )) :min-keyint=$(( FPS_INT * 4 )) " \
438+ -bf 0 -b:v 2M \
439+ -an \
440+ -f h264 \
441+ " $STREAMING_VIDEO "
442+
443+ echo " -> $( ls -lh " $STREAMING_VIDEO " 2> /dev/null | awk ' {print $5}' || echo ' not found' ) "
444+
445+ # Generate Opus Ogg audio from test-audio-raw.wav (same content as QoE WAV)
446+ echo " Generating Opus audio ($STREAMING_AUDIO )..."
447+ ffmpeg $FFMPEG_LOG -y -i test-audio-raw.wav \
448+ -c:a libopus -page_duration 20000 \
449+ -ar $AUDIO_SAMPLE_RATE_HZ -ac $AUDIO_CHANNELS_NUMBER \
450+ -f opus \
451+ " $STREAMING_AUDIO "
452+
453+ echo " -> $( ls -lh " $STREAMING_AUDIO " 2> /dev/null | awk ' {print $5}' || echo ' not found' ) "
454+
455+ echo " "
456+ echo " Streaming files generated:"
457+ echo " Video: $( pwd) /$STREAMING_VIDEO "
458+ echo " Audio: $( pwd) /$STREAMING_AUDIO "
459+ echo " "
460+ echo " These files are compatible with LiveKit CLI's h264:// and opus:// protocols."
461+ echo " =========================================="
462+
463+ echo " "
464+ echo " =========================================="
465+ echo " All generated files:"
466+ ls -lh ./${BASE_NAME} .* 2> /dev/null | awk ' {print " " $NF " (" $5 ")"}'
467+ echo " =========================================="
468+ fi
469+
470+ # ###############################
471+ # 10. Delete temporal video files
353472# ###############################
354473if $CLEANUP ; then
355474 cleanup
0 commit comments