Last active
March 30, 2026 02:21
-
-
Save eladkarako/897174fa581b436c699b687503efbe48 to your computer and use it in GitHub Desktop.
ffmpeg quick audio visualization
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ::@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 | |
| ::------------------------------------------------------- | |
Author
eladkarako
commented
Mar 12, 2026

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