googie
#!/usr/bin/env bash
set -euo pipefail
INPUT_DIR="${1:-}"
TARGET_FPS="${2:-30}"
if [[ -z "$INPUT_DIR" ]]; then
echo "Usage: $0 <directory with clips> [target fps (defaults to 30)]"
exit 1
fi
if [[ ! -d "$INPUT_DIR" ]]; then
echo "Error: directory does not exist: $INPUT_DIR"
exit 1
fi
OUTPUT_DIR="$INPUT_DIR/conv"
mkdir -p "$OUTPUT_DIR"
EXTENSIONS=(
mp4 avi wmv mpg mpeg mov
mkv m4v flv webm ts mts m2ts 3gp
)
shopt -s nullglob nocaseglob
for ext in "${EXTENSIONS[@]}"; do
for file in "$INPUT_DIR"/*."$ext"; do
filename="$(basename "$file")"
name="${filename%.*}"
output="$OUTPUT_DIR/${name}.mov"
echo "Konwersja: $file -> $output"
ffmpeg -y -i "$file" \
-map 0:v:0 -map "0:a?" \
-vf "fps=${TARGET_FPS}" \
-vsync cfr \
-c:v prores_ks -profile:v 1 \
-pix_fmt yuv422p \
-c:a pcm_s16le -ar 48000 \
"$output"
done
done
echo "Results in: $OUTPUT_DIR"
and then converting final exported video to h.265: #!/usr/bin/env bash
set -euo pipefail
INPUT="${1:-}"
CRF="${2:-21}"
PRESET="${3:-slow}"
if [[ -z "$INPUT" ]]; then
echo "Usage: $0 <input file> [crf=21] [preset=slow]"
exit 1
fi
if [[ ! -f "$INPUT" ]]; then
echo "Error: file does not exist: $INPUT"
exit 1
fi
DIR="$(dirname "$INPUT")"
FILE="$(basename "$INPUT")"
NAME="${FILE%.*}"
OUTPUT="$DIR/${NAME}_h265.mp4"
ffmpeg -y -i "$INPUT" \
-map 0:v:0 -map '0:a?' \
-c:v libx265 \
-preset "$PRESET" \
-crf "$CRF" \
-pix_fmt yuv420p \
-tag:v hvc1 \
-c:a aac \
-b:a 192k \
-movflags +faststart \
"$OUTPUT"
echo "Ready: $OUTPUT"Installation still requires workarounds and codecs support is limited, but having that aknowledged and accepted, the application is finally usable!
PS. I don't know where the h264 (and other codes?) limitation come from, since ffmpeg has full support of it. Or is it just business model? Weird.
There are whole guides online how to walk around these issues and even then I could not get the audio working. Somehow it relies on some old ALSA API, which is no longer maintained/supported on Ubuntu/Kubuntu, or I'm just too stupid to make it work. AI assistants could not provide working solution for me either.
I've moved back to Linux a year ago after around 10 years of Windows (and I used to use Linux Slackware for ~15 years beforehand). I am amazed how big progress the KDE made and whole Linux ecosystem. Gaming these days is just as easy as on Windows, which was my primary reason to switch to Windows. My printer just works now. Even music production is excellent on Linux now. There is plenty of great software options to choose from and they just work - as I would expect from the mature ecosystem.
This all feels so good, given how Linux is not pushing trash into my computer (OS-bound spyware/bloatware), has excellent, customizable UI. Full freedom. I do feel that I own my hardware.
Yet I miss DaVinci Resolve. For now I use Kdenlive, which is nice for simple editing, but feels unfinished, or I just don't know how to use it correctly.
1) Application memory consumption grows more than it should, because same extensions have to be loaded several times in the same application, but in separate threads;
2) Resources such as images (or any other kinds), or OO objects, cannot be transferred between threads efficiently, the only way is to serialize them to scalar representation, which then can be passed through either tsv (mentioned above) variables, or through a message to another thread - then deserialize them there. Apart from precious time which it costs, you also make a full copy of resource/object, growing memory consumption even more.
I'm aware of tsv package (shared variable), but this is just sharing scalar variables or arrays. You cannot share objects, procedures, namespaces, resources, etc - and that is the major reason for sharing memory across threads.