Skip to content

Instantly share code, notes, and snippets.

@abakum
Last active April 4, 2021 17:26
Show Gist options
  • Save abakum/4620756a3f45e3f6874cc25809030fe3 to your computer and use it in GitHub Desktop.
Save abakum/4620756a3f45e3f6874cc25809030fe3 to your computer and use it in GitHub Desktop.
Convert 3D photos or panoramas from VR.JPG to playlist of MKV or MP4 for YouTube or 3DTV
setlocal enableDelayedExpansion
:forfiles
if "%~1"=="nul" (
call :doit "%~2"
goto :EOF
)
:main
if "%~1"=="" (
if not exist "%UserProfile%\SendTo\%~n0.lnk" (
if defined ChocolateyInstall (
"%ChocolateyInstall%\tools\shimgen.exe" -o "%UserProfile%\SendTo\%~n0.exe" -p "%~f0"
) else (
copy /b "%~f0" "%UserProfile%\SendTo\%~nx0"
)
echo "%~f0" is placed in "%UserProfile%\SendTo"
)
)
echo Run "VR2PL.bat" without parameters to place it in "%UserProfile%\SendTo"
echo Send files or dirs: "c:\d\e.vr.jpg" "c:\e" ... to "VR2PL"
echo or drop it to "VR2PL.bat"
echo Then look at "c:\PL"
set cmd="cmd /c "%~f0" nul "@path""
set hw=
set hh=
set loop=1
rem Edit ~~~~~~~~~~~~~~~~~~~~~~~~~~v
set oh=1080
set ow=1920
set sec=4
set fps=50
set sca=1
set cv=-profile:v high -tune stillimage
set ca=-c:a copy
:set ca=
set am=
:set am=1
set mp4=
:set mp4=1
set pfp=3
:set pfp=4
:set pfp=5
:set pfp=6
rem Edit --------------------------^
if "%pfp%"=="3" (
rem YouTube
set stereo_mode=left_right
set fp=framepack=sbs
if defined am set hw=/2
)
if "%pfp%"=="4" (
rem Polarized 3DTV
set stereo_mode=top_bottom
set fp=framepack=tab
if defined am set hh=/2
)
if "%pfp%"=="5" (
rem Active shutter 3DTV
set stereo_mode=block_lr
set fp=framepack=frameseq
set fps=%fps%/2
)
if "%pfp%"=="6" (
rem Anaglyph red/cyan color optimized with the least squares projection of dubois. Red filter on left eye, cyan filter on right eye
set stereo_mode=anaglyph_cyan_red
set fp=hstack,stereo3d=sbsl:arcd
)
:loop
if "%~1"=="" (
pause
goto :EOF
)
forfiles /s /p "%~1" /m *.vr.jpg /c %cmd% 2>nul||call :doit "%~1"
shift
goto :loop
:vr
set n1=%~n1
goto :EOF
:doit
call :vr "%~n1"
set inp="%~f1"
if defined mp4 (
set out="%~dp1..\PL\%n1%.mp4"
) else (
set out="%~dp1..\PL\%n1%.mkv"
)
set mkv="%~dp1..\PL\%n1%.mkv"
if exist %out% goto :EOF
if not exist %inp% goto :EOF
if /i not ".jpg"=="%~x1" goto :EOF
if not exist "%~dp1..\PL" md "%~dp1..\PL"
set jpg="%temp%\%n1%.jpg"
set mka="%temp%\%n1%.mka"
set ts="%temp%\%n1%.ts"
set mk3d="%temp%\%n1%.mkv"
del %jpg% %mka%
exiftool -XMP-GImage:ImageData -b -W %jpg% %inp%
if not exist %jpg% goto :EOF
for /f "tokens=1,2 delims=: usebackq" %%i in (`exiftool -s2 -ImageWidth -ImageHeight %inp%`) do set /a %%i=%%j+0
set /a dur=%sec%*%ImageWidth%*%oh%/%ow%/%ImageHeight%
set audio=
set cat=
if defined ca (
exiftool -XMP-GAudio:AudioData -b -W %mka% %inp%
if exist %mka% (
set audio=-i %mka%
set cat=%ca%
for /f "tokens=1 usebackq" %%i in (`exiftool -s3 -Duration %mka%`) do set dur=%%i
)
)
set filt=null
if "%ow%x%oh%"=="%ImageWidth%x%ImageHeight%" (
if "%hw%%hh%"=="" goto :lr
set filt=
goto :am
)
set /a sub=%sca%*%ImageHeight%*%ow%/%oh%
set filt=scale=iw*%sca%:ih*%sca%,
if "%sca%"=="1" set filt=
rem autopano
set filt=%filt%crop=ih*%ow%/%oh%:ih:(iw-%sub%)*n/(%dur%*%fps%),
set /a nw=%ImageHeight%*%ow%/%oh%
if "%nw%"=="%ImageWidth%" set filt=
:am
set filt=%filt%scale=%ow%%hw%:%oh%%hh%
:lr
call :try h264_qsv h264_nvenc h264_amf libx264
del %jpg% %mka% %ts% %mk3d%
goto :EOF
:try
if "%1"=="" goto :EOF
if not exist %temp%\%1@%ow%x%oh%.log ffmpeg -f lavfi -i color=s=%ow%x%oh% -frames:v 1 -c:v %1 %cv% -y %temp%\%1@%ow%x%oh%.mkv>%temp%\%1@%ow%x%oh%.log||del %temp%\%1@%ow%x%oh%.mkv
if exist %temp%\%1@%ow%x%oh%.mkv (
ffmpeg -hide_banner -loop %loop% -r %fps% -i %inp% -loop %loop% -r %fps% -i %jpg% -filter_complex "[0]%filt%[l],[1]%filt%[r],[l][r]%fp%" -t %dur% -aspect %ow%/%oh% -pix_fmt yuv420p -c:v %1 %cv% -y %ts%||del %ts%
ffmpeg -hide_banner -i %ts% %audio% -c:v copy %cat% -metadata stereo_mode=%stereo_mode% -y %mk3d%||del %mk3d%
if %pfp% leq 4 mkvpropedit -e track:v1 -s display-width=%ow% -s display-height=%oh% %mk3d%
if defined mp4 ffmpeg -hide_banner -i %mk3d% -c copy -strict unofficial -y %out%||del %out%
if not exist %out% copy /b %mk3d% %mkv%
goto :EOF
)
shift
goto :try
@abakum
Copy link
Author

abakum commented Apr 4, 2021

Run "VR2PL.bat" without parameters to place it in "%UserProfile%\SendTo"
Send files or dirs: "c:\d\e.vr.jpg" "c:\e" ... to "VR2PL"
or drop it to "VR2PL.bat"
Then look at "c:\PL"

Thanks:
https://developers.google.com/vr/reference/cardboard-camera-vr-photo-format
https://exiftool.org/
https://ffmpeg.org/
https://mkvtoolnix.download/
https://chocolatey.org/

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