Last active
April 4, 2021 17:26
-
-
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
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
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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/