前言
沒想過我會在這麼短時間再寫一篇。
今天吃飯的時候邊想,如果ffmpeg能把Samsung S25 Ultra 的3D影片轉成YouTube能吃的SBS LR影片的話,那是否有機會轉出照片呢?查了一下還真有。那應該可以來試試看。花了一些時間試還是成功了。現在有AI輔助起來debug比較快...。
##ReadMore##
紀錄
在reddit中找到了有人用ffmpeg讀HEIC的紀錄。那是不是套這個就進去了呢?從影片那邊可以猜到不是那麼容易。果然。ffmpeg解析Samsung S25U拍出來的影片訊息如下
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'c:\_ming\20260604_190809.heic':
Metadata:
major_brand : heic
minor_version : 0
compatible_brands: mif1heictmap
Duration: N/A, start: 0.000000, bitrate: N/A
Stream group #0:0[0x31]: Tile Grid: hevc (Main Still Picture) (hvc1 / 0x31637668), yuvj420p(pc, bt470bg/bt470bg/smpte170m), 4000x3000 (default)
Side data:
EXIF metadata: (893 bytes)
ICC Profile: (632 bytes)
Stream group #0:1[0x37]: Tile Grid: hevc (Main Still Picture) (hvc1 / 0x31637668), yuvj420p(pc), 1000x750
Stream group #0:2[0x69]: Tile Grid: hevc (Main Still Picture) (hvc1 / 0x31637668), yuvj420p(pc, bt470bg/bt470bg/smpte170m), 4000x3000
Side data:
ICC Profile: (632 bytes)
Stream group #0:3[0x9a]: Tile Grid: hevc (Main Still Picture) (hvc1 / 0x31637668), yuvj420p(pc, bt470bg/bt470bg/smpte170m), 4000x3000
Side data:
ICC Profile: (632 bytes)
Stream #0:48[0x32]: Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt470bg/bt470bg/smpte170m), 512x384, 1 fps, 1 tbr, 1 tbn
Side data:
ICC Profile: (632 bytes)
問了Gemini他說這是這照片由Group 0:0~3組成,從我前幾篇文章的紀錄很快速可以推測0是用來顯示的廣角主鏡頭照片,1是0的縮圖,2是廣角主鏡頭,3是超廣角鏡頭裁切,那要做的事情應該跟昨天差不多,就是套filter_complex濾鏡,左右交換,合併。於是LR的很快就生出來了,濾鏡跟影片差不多。
但我以前出3D照片比較喜歡出LRL,只是LRL現在因為太寬反而少人用,寧可用LRRL,所以就來做個LRRL...應該要很簡單...才怪!
這時候又遇到bug了,這濾鏡叫過第一次後再呼叫,看起來就會出現記憶體bug還甚麼之類的,總之如果只是用[0:g:3][0:g:2][0:g:2][0:g:3]這樣送進xstack處理就會爆炸,試了很久的結論是要先把照片複製出來,不能呼叫原始照片第二次,只要呼叫第二次就爆炸給你看。也不能用0:v,因為是用map拼成的,用0:v:2/0:v:3只會呼叫到第一張照片。最後解法是用split去複製group出來,我還多試了copy這個filter,看起來不行。成品就是下面兩個batch。已經做成不顯示訊息,可以把一票heic拖進去的形式。
本來迴圈想再改一改寫法想想還是算了,假日要結束了。
成品
samsung_s25_ultra_3d_capture_photo_to_sbs_LR.bat
chcp 65001
@echo off
setlocal
for /f %%t in ('powershell -command "[DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds()"') do set start=%%t
setlocal enabledelayedexpansion
set "FFMPEG_PATH=%~dp0\ffmpeg"
:: 1. Pre count
set "total_files=0"
for %%x in (%*) do (
set /a total_files+=1
)
echo ============================================
echo Total file: %total_files%
echo ============================================
echo.
:: 2. Start count
set "current_count=0"
:loop
if "%~1"=="" goto end
set /a current_count+=1
echo [Progess: %current_count% / %total_files%] Processing: "%~nx1"
"%FFMPEG_PATH%" -hide_banner -loglevel error -y -c:v hevc -i "%~1" -filter_complex "[0:g:3][0:g:2]hstack" -q:v 3 "%~dpn1.LR.jpg"
echo --------------------------------------------
shift
goto loop
:end
echo ============================================
echo Total file %total_files%. Process done.
echo ============================================
for /f %%t in ('powershell -command "[DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds()"') do set end=%%t
for /f %%d in ('powershell -command "%end% - %start%"') do set duration=%%d
echo Duration: %duration% ms
pause
samsung_s25_ultra_3d_capture_photo_to_sbs_LRRL.bat
chcp 65001
@echo off
setlocal
for /f %%t in ('powershell -command "[DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds()"') do set start=%%t
setlocal enabledelayedexpansion
set "FFMPEG_PATH=%~dp0\ffmpeg"
:: 1. Pre count
set "total_files=0"
for %%x in (%*) do (
set /a total_files+=1
)
echo ============================================
echo Total file: %total_files%
echo ============================================
echo.
:: 2. Start count
set "current_count=0"
:loop
if "%~1"=="" goto end
set /a current_count+=1
echo [Progess: %current_count% / %total_files%] Processing: "%~nx1"
"%FFMPEG_PATH%" -hide_banner -loglevel error -y -c:v hevc -i "%~1" -filter_complex "[0:g:3]split[a][d];[0:g:2]split[b][c];[a][b][c][d]xstack=grid=2x2" -q:v 3 "%~dpn1.LRRL.jpg"
:: Following are tested command.
:: succeed "%FFMPEG_PATH%" -hide_banner -y -c:v hevc -i "%~1" -filter_complex "[0:g:3]split[a][d];[0:g:2]split[b][c];[a][b][c][d]xstack=grid=2x2" -q:v 3 "%~dpn1.LRRL.jpg"
:: succeed "%FFMPEG_PATH%" -hide_banner -y -c:v hevc -i "%~1" -filter_complex "[0:g:3]split[a][d];[0:g:2]split[b][c];[a][b]hstack[t];[c][d]hstack[bn];[t][bn]vstack" -q:v 3 "%~dpn1.LRRL.jpg"
:: succeed "%FFMPEG_PATH%" -hide_banner -y -c:v hevc -i "%~1" -filter_complex "[0:g:3]split=2[v0][v3];[0:g:2]split=2[v1][v2];[v0][v1]hstack[top];[v2][v3]hstack[bottom];[top][bottom]vstack" -q:v 3 "%~dpn1.LRRL.jpg"
:: failed "%FFMPEG_PATH%" -hide_banner -y -c:v hevc -i "%~1" -filter_complex "[0:v]split=4[v1][v2][v3][v4];[v1][v2]hstack[top];[v3][v4]hstack[bottom];[top][bottom]vstack" -q:v 3 "%~dpn1.LRRL.jpg"
:: failed "%FFMPEG_PATH%" -hide_banner -y -c:v hevc -i "%~1" -filter_complex "[0:g:3][0:g:2]hstack[top];[0:g:2][0:g:3]hstack[bottom];[top][bottom]vstack" -q:v 3 "%~dpn1.LRRL.jpg"
:: failed "%FFMPEG_PATH%" -hide_banner -y -c:v hevc -i "%~1" -filter_complex "[0:g:3]scale=iw:ih[v0];[0:g:2]scale=w=iw_link(0):h=ih_link(0)[v1];[0:g:2]scale=w=iw_link(0):h=ih_link(0)[v2];[0:g:3]scale=w=iw_link(0):h=ih_link(0)[v3];[v0][v1][v2][v3]xstack=4:0_0|w0_0|0_h0|w0_h0" -q:v 3 "%~dpn1.LRRL.jpg"
:: failed "%FFMPEG_PATH%" -hide_banner -y -c:v hevc -i "%~1" -filter_complex "[0:g:3][0:g:2][0:g:2][0:g:3]xstack=4:0_0|w0_0|0_h1|w0_h1" -q:v 3 "%~dpn1.LRRL.jpg"
:: failed "%FFMPEG_PATH%" -hide_banner -y -c:v hevc -i "%~1" -filter_complex "[0:g:3]scale=iw:ih[a];[0:g:2]scale=iw:ih[b];[0:g:2]scale=iw:ih[c];[0:g:3]scale=iw:ih[d];[a][b][c][d]xstack=4:0_0|w0_0|0_h0|w0_h0" -q:v 3 "%~dpn1.LRRL.jpg"
:: failed "%FFMPEG_PATH%" -hide_banner -loglevel error -y -c:v hevc -i "%~1" -filter_complex "[0:g:3][0:g:2][0:g:2][0:g:3]xstack=grid=2x2" -q:v 3 "%~dpn1.LRRL.jpg"
echo --------------------------------------------
shift
goto loop
:end
echo ============================================
echo Total file %total_files%. Process done.
echo ============================================
for /f %%t in ('powershell -command "[DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds()"') do set end=%%t
for /f %%d in ('powershell -command "%end% - %start%"') do set duration=%%d
echo Duration: %duration% ms
pause
後記
有想過調用GPU,查的時候的確也有看到heic_cuvid這個filter,但啟動的時間太久,整體速度反而慢。或許有什麼可以掛批次的方法可以試…但我現在照片沒麼多,先這樣吧。
沒有留言:
張貼留言