Skip to content

Instantly share code, notes, and snippets.

@noboomu
Last active November 7, 2024 01:48
Show Gist options
  • Select an option

  • Save noboomu/771871fcb989c31bc231614beb6ce422 to your computer and use it in GitHub Desktop.

Select an option

Save noboomu/771871fcb989c31bc231614beb6ce422 to your computer and use it in GitHub Desktop.
Generate Multiple Renditions and LL-HLS Streams from Source MP4
#!/bin/bash
# arg 1 is filename arg 2 is output directory
FILENAME=$1
VIDEO_NAME=`echo "${FILENAME%.*}"`
echo "Generating renditions for $VIDEO_NAME"
[ -d "$VIDEO_NAME" ] && rm -rf "$VIDEO_NAME"
mkdir $VIDEO_NAME
cd $VIDEO_NAME
cp ../$1 .
ffmpeg -i $1 -vf scale=1280:720 -c:v libx264 -b:v 2500k -an 720p.mp4
ffmpeg -i $1 -vf scale=854:480 -c:v libx264 -b:v 1500k -an 480p.mp4
ffmpeg -i $1 -vf scale=640:360 -c:v libx264 -b:v 800k -an 360p.mp4
echo "Renditions created. Encoding..."
resolutions=("720p" "480p" "360p")
for resolution in "${resolutions[@]}"; do
echo "generating $resolution stream"
mkdir ./$resolution
cd ./$resolution
ffmpeg -i "../$resolution.mp4" \
-c:v libx264 -preset veryfast -tune zerolatency \
-g 60 -sc_threshold 0 \
-hls_time 2 \
-hls_flags split_by_time \
-hls_segment_type fmp4 \
-hls_playlist_type vod \
-hls_segment_filename "./$resolution_%03d.m4s" \
"$resolution.m3u8"
cd ..
done
echo "Rendition streams generated"
IMAGE_NAME="$VIDEO_NAME"-poster.jpg
echo "image name $IMAGE_NAME"
ffmpeg -i $1 -vf "select=eq(n\,0)" -q:v 2 -frames:v 1 $IMAGE_NAME
jpegoptim -q -m50 $IMAGE_NAME
rm -rf *.mp4
echo "#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1500000,RESOLUTION=854x480
480p/480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p/360p.m3u8" > master.m3u8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment