Skip to content

Instantly share code, notes, and snippets.

@eladkarako
Last active March 30, 2026 02:21
Show Gist options
  • Select an option

  • Save eladkarako/897174fa581b436c699b687503efbe48 to your computer and use it in GitHub Desktop.

Select an option

Save eladkarako/897174fa581b436c699b687503efbe48 to your computer and use it in GitHub Desktop.
ffmpeg quick audio visualization
::@echo off
chcp 65001 1>nul 2>nul
pushd "%~dp0"
set "BASE=%CD%"
popd
set "BASE=%BASE:\=/%"
set "FILE_GIF=%BASE%/--_resources/green_ninja.gif"
::set "FILE_TTF=%BASE%/--_resources/courbd_with_slashed_zero.ttf"
set "FILE_TTF=%BASE%/--_resources/NotoSansMono-Black.ttf"
set "FILE_TTF=%FILE_TTF::=\:%"
:LOOP
if ["%~1"] EQU [""] ( goto END )
call :PROCEDURE_PROCESS "%~1"
shift
goto LOOP
::-----------------------------------------------------------------------------------------------------------------
:PROCEDURE_GET_METADATA
echo [INFO] getting meta data %~2 from %~1
set "METADATA_VALUE="
for /F "usebackq delims=" %%E IN (`call "ffprobe.exe" -hide_banner -loglevel quiet -i "%~1" -output_format "default=nokey=1:noprint_wrappers=1" -show_entries "format_tags=%~2"`) do (
set "METADATA_VALUE=%%E"
goto EXIT_LOOP_METADATA
)
:EXIT_LOOP_METADATA
echo [INFO] got - %METADATA_VALUE%
goto :eof
::-----------------------------------------------------------------------------------------------------------------
::-----------------------------------------------------------------------------------------------------------------
:PROCEDURE_PROCESS
pushd "%~dp1"
mkdir "%CD%\output" 1>nul 2>nul
set "FILENAME=%~1"
set "FILENAME=%FILENAME:\=/%"
call :PROCEDURE_GET_METADATA "%FILENAME%" "title"
set "METADATA_TITLE=%METADATA_VALUE%"
call :PROCEDURE_GET_METADATA "%FILENAME%" "artist"
set "METADATA_ARTIST=%METADATA_VALUE%"
call :PROCEDURE_GET_METADATA "%FILENAME%" "date"
set "METADATA_DATE=%METADATA_VALUE%"
call :PROCEDURE_GET_METADATA "%FILENAME%" "comment"
set "METADATA_COMMENT=%METADATA_VALUE:~23%"
set "ARGS="
set ARGS=%ARGS% -threads 2
set ARGS=%ARGS% -hide_banner
set ARGS=%ARGS% -err_detect "ignore_err"
set ARGS=%ARGS% -y
set ARGS=%ARGS% -probesize "600M"
set ARGS=%ARGS% -analyzeduration "600M"
set ARGS=%ARGS% -thread_queue_size 16384
set ARGS=%ARGS% -stream_loop "-1"
set ARGS=%ARGS% -i "file:%FILE_GIF%"
set ARGS=%ARGS% -probesize "600M"
set ARGS=%ARGS% -analyzeduration "600M"
set ARGS=%ARGS% -thread_queue_size 16384
set ARGS=%ARGS% -i "file:%FILENAME%"
set ARGS=%ARGS% -threads 2
set ARGS=%ARGS% -filter_complex "[0:v:0]scale=-2:1080:flags=neighbor
set ARGS=%ARGS%,pad=1920:1080:(1920-iw)/2:(1080-ih)/2:black
set ARGS=%ARGS%,setsar=1[bg];
set ARGS=%ARGS%[1:a:0]aformat=channel_layouts=mono
set ARGS=%ARGS%,compand
set ARGS=%ARGS%,showwaves=s=1920x1080:mode=cline:draw=full:rate=25:colors=cyan@0.50|aqua@0.50[waveform];
set ARGS=%ARGS%[bg][waveform]overlay=shortest=1[ol];
set ARGS=%ARGS%[ol]drawtext=fontfile='%FILE_TTF%':text_shaping=0:fix_bounds=0:x=30:y=30:fontsize=90:fontcolor=white@0.40:line_spacing=10:text='TITLE \:%METADATA_TITLE% '
set ARGS=%ARGS%,drawtext=fontfile='%FILE_TTF%':text_shaping=0:fix_bounds=0:x=30:y=130:fontsize=90:fontcolor=white@0.40:line_spacing=10:text='ARTIST\:%METADATA_ARTIST% '
set ARGS=%ARGS%,drawtext=fontfile='%FILE_TTF%':text_shaping=0:fix_bounds=0:x=30:y=230:fontsize=90:fontcolor=white@0.40:line_spacing=10:text='DATE \:%METADATA_DATE% '
set ARGS=%ARGS%,drawtext=fontfile='%FILE_TTF%':text_shaping=0:fix_bounds=0:x=30:y=330:fontsize=90:fontcolor=white@0.40:line_spacing=10:text='URL \:%METADATA_COMMENT% '
set ARGS=%ARGS%[outv]"
set ARGS=%ARGS% -map "[outv]"
set ARGS=%ARGS% -map "1:a:0"
set ARGS=%ARGS% -flags "+cgop+loop-unaligned-output_corrupt"
set ARGS=%ARGS% -fflags "+genpts+autobsf+discardcorrupt+igndts+ignidx"
set ARGS=%ARGS% -avoid_negative_ts "make_zero"
set ARGS=%ARGS% -use_wallclock_as_timestamps "1"
set ARGS=%ARGS% -max_muxing_queue_size 9999
set ARGS=%ARGS% -bufsize 8M
set ARGS=%ARGS% "-c:a" copy
::set ARGS=%ARGS% "-c:a" aac "-b:a" "128k" -ar "44100"
set ARGS=%ARGS% "-c:v" h264_qsv
set ARGS=%ARGS% -global_quality 20
set ARGS=%ARGS% -look_ahead 1
set ARGS=%ARGS% -look_ahead_depth 40
::set ARGS=%ARGS% "-c:v" libx264
set ARGS=%ARGS% -r 25
set ARGS=%ARGS% -crf 20
set ARGS=%ARGS% -preset veryslow
set ARGS=%ARGS% -pix_fmt yuv420p
set ARGS=%ARGS% -movflags "+faststart"
set ARGS=%ARGS% -tune stillimage
set ARGS=%ARGS% "-profile:v" high -level "5.0"
set ARGS=%ARGS% -bf 4
set ARGS=%ARGS% -shortest
::--- meta-data (do not copy from input)
set ARGS=%ARGS% -map_chapters "-1"
set ARGS=%ARGS% -map_metadata "-1"
::--- meta-data (write to global - container)
set ARGS=%ARGS% -metadata "title=%METADATA_TITLE%"
set ARGS=%ARGS% -metadata "artist=%METADATA_ARTIST%"
set ARGS=%ARGS% -metadata "date=%METADATA_DATE%"
set ARGS=%ARGS% -metadata "comment=%METADATA_COMMENT%"
set ARGS=%ARGS% -metadata "language=eng"
::--- meta-data (write to stream - stream selector - audio 0)
set ARGS=%ARGS% "-metadata:s:a:0" "title=%METADATA_TITLE%"
set ARGS=%ARGS% "-metadata:s:a:0" "artist=%METADATA_ARTIST%"
set ARGS=%ARGS% "-metadata:s:a:0" "date=%METADATA_DATE%"
set ARGS=%ARGS% "-metadata:s:a:0" "comment=%METADATA_COMMENT%"
::--- testing
::set ARGS=%ARGS% -to "00:00:02.000"
title %~n1
start "%~n1" /MIN /BELOWNORMAL /WAIT /B "ffmpeg.exe" %ARGS% "./output/%~n1.mkv"
popd
timeout /t 5
goto :eof
::----------------------------------------------------------------------------------------------------------
::-----------------------------------------------------------------------------------------------------------------
:END
pause
popd
exit /b 0
::-----------------------------------------------------------------------------------------------------------------
::-----------------------------------------------
:: simple visualization for audio.
:: - overlays: gif + meta-data text + waveform.
:: - noto sans mono, thickness 900.
:: - github.com/nanake/ffmpeg-tinderbox/releases/latest
:: - ffmpeg.org/ffmpeg-filters.html#drawtext-1
:: - hardware encoding for speed (40 frames / 1 second)
::-------------------------------------------------------
:: eladkarako 20260330018
::-------------------------------------------------------
@eladkarako
Copy link
Copy Markdown
Author

green_ninja

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment