From 84add469367ba83f8f19af7de8e36168bc07eea1 Mon Sep 17 00:00:00 2001 From: bytedream Date: Thu, 7 Nov 2024 01:27:25 +0100 Subject: [PATCH] add ffmpeg camera public --- README.md | 4 +++ ffmpeg/compress-camera-public.sh | 56 ++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100755 ffmpeg/compress-camera-public.sh diff --git a/README.md b/README.md index e7a1d57..bc1ffdc 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ This repository contains some Linux scripts I am using to simplify some of my wo - DNS - [clear-cache.sh](dns/clear-cache.sh) - Clear the systemd DNS cache +- FFmpeg + - [compress-camera.sh](ffmpeg/compress-camera.sh) - Script to compress videos from my phone camera to an AV1 encoded 1080p video + - [compress-camera-public.sh](ffmpeg/compress-camera-public.sh) - Script to compress videos from my phone camera to AV1, VP9 and H264 videos to play them in browsers + - Patches - [spotify.sh](patches/spotify.sh) - Use [SpotX-Bash](https://github.com/SpotX-Official/SpotX-Bash) to patch a existing spotify installation diff --git a/ffmpeg/compress-camera-public.sh b/ffmpeg/compress-camera-public.sh new file mode 100755 index 0000000..c050df6 --- /dev/null +++ b/ffmpeg/compress-camera-public.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env sh + +verify_commands() { + commands=("ffmpeg" "ffprobe") + for command in "${commands[@]}"; do + which $command &> /dev/null + if [ $? -ne 0 ]; then + echo "command '$command' not found" + exit 1 + fi + done +} + +main() { + verify_commands + + for arg in "$@"; do + for file in $(ls "$arg"); do + filename="${file%.*}" + extension="${file##*.}" + if [ "$extension" != "mp4" ]; then + echo "Invalid filetype: $file (expected mp4)" + continue + fi + + width=$(ffprobe -v error -select_streams v:0 -show_entries stream=width -of default=noprint_wrappers=1:nokey=1 "$file") + height=$(ffprobe -v error -select_streams v:0 -show_entries stream=height -of default=noprint_wrappers=1:nokey=1 "$file") + rotation=$(ffprobe -v error -select_streams v:0 -show_entries stream_side_data=rotation -of default=noprint_wrappers=1:nokey=1 "$file") + if [ "$rotation" -eq "90" ] || [ "$rotation" -eq "-90" ]; then + new_width=height + new_height=width + width=new_width + height=new_height + fi + + if [ "$width" -gt "$height" ]; then + width=1920 + height=1080 + else + width=1080 + height=1920 + fi + + # av1 + ffmpeg -i "$file" -vf scale="$width:$height" -c:v libsvtav1 -preset 4 -crf 23 -pix_fmt yuv420p10le -svtav1-params tune=0:film-grain=8 -c:a copy "${filename}_av1.mp4" + # vp9 + ffmpeg -i "$file" -vf scale="$width:$height" -c:v libvpx-vp9 -crf 31 -b:v 1800k -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 8 -quality good -pass 1 -speed 4 -an -f null /dev/null + ffmpeg -i "$file" -vf scale="$width:$height" -c:v libvpx-vp9 -crf 31 -b:v 1800k -minrate 900k -maxrate 2610k -tile-columns 3 -g 240 -threads 8 -quality good -c:a libopus -pass 2 -speed 4 -y "${filename}_vp9.webm" + # h264 + ffmpeg -i "$file" -vf scale="$width:$height" -c:v libx264 -preset 4 -crf 17 -pix_fmt yuv420p10le -x264opts qp=0 -movflags +faststart -c:a copy "${filename}_h264.mp4" + done + done +} + +main $@ +