2026/06/27

[note] Samsung S25Ultra 3d capture video from HEVC multiview .mp4 to SBS .mkv for YouTube, using NV GPU encoding (beta, unstable)

前言

最近買了一隻S25U,當初買的時候本來就打著支援雙鏡頭錄影的功能,或許能同時錄影兩個畫面拍3D,也曾想過買S24U但印象中超廣鏡頭是S25U比較好,沒想到真買S25U後發現原來S25U內建拍攝3D,前面的S24U沒有。我另一隻S23U也不支援,可惜了他的10倍光學。

比較麻煩的是,現在的生態用的不是十幾年前那種m4s和mpo,東西都要重學,前幾天才處理了相片的問題,先用copilot問有哪些程式可用,稍微快了點。停在生出LR照片的部分,只要能拆開左右,記得後面的動作應該會很快,雖然我以前的mpo轉LR照片流程都不知道被我丟哪了。

但天殺影片不是同個level的東西,花了超多時間一直重試,目前只有勉強有效的做法,稍微紀錄一下。

##ReadMore##

 

 

過程

我在過程中是以copilot主力+gemini小檢查,因為錯誤訊息太多分析不完。

Samsung S25 Ultra錄製的3D captrue影片是用HEVC規範的multilayer方式製作,用ffmpeg讀的時候顯示只有一個串流(非兩個串流,重點1),有side data,frame packed(重點2),右眼為主(重點3),雙眼距離18.223mm,視角66.496,過程中多次嘗試Copilot得出來的結果,是這個封裝有點難搞,會導致如果要加速壓縮影片遇到很多難關。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'c:\_ming\20260624_202026.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2026-06-24T12:21:27.000000Z
    location        : +25.8964+121.8964/
    location-eng    : +25.8964+121.8964/
    com.android.version: 16
    com.android.capture.fps: 30.000000
    com.samsung.android.utc_offset: +0800
  Duration: 00:01:00.67, start: 0.000000, bitrate: 58777 kb/s
  Stream #0:0[0x1](eng): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 3840x2160, 58457 kb/s, 29.98 fps, 30 tbr, 90k tbn (default) (multilayer)
    Metadata:
      creation_time   : 2026-06-24T12:21:27.000000Z
      handler_name    : VideoHandle
    Side data:
      Stereo 3D: unspecified, view: packed, primary eye: right, baseline: 18223, horizontal_disparity_adjustment: 0.0174, horizontal_field_of_view: 66.496
      Spherical Mapping: rectilinear
  Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
    Metadata:
      creation_time   : 2026-06-24T12:21:27.000000Z
      handler_name    : SoundHandle

上面是ffmpeg讀到的資訊,有對物理位置動了些小手腳。

 

 

Method1--x264 SW compsion

跟這邊提出來的方法差不多https://www.reddit.com/r/Quest3/comments/1rtu9k1/guide_to_view_samsung_xr_3d_spatial_video_on/?tl=zh-hans

而我的方式如下,另存成.bat檔後跟ffmpeg放一起,只要把影片拖進去batch,就會在影片位置生成上傳YouTube用的3d影片:

"%~dp0\ffmpeg" -i "%~1" ^
-filter_complex "[0:v:view:1][0:v:view:0]hstack" ^
-c:v libx264 -crf 20 ^
-c:a copy ^
-metadata:s:v stereo_mode=1 ^
"%~dpn1.yt3d.simple2.mkv"

在兩三年內的測試,有發現雖然youtube建議用mp4封裝加x264編碼(YouTube建議編碼)(YouTube 3D格式),但天殺的要用ffmpeg開啟264的3d flag太麻煩了(後面會提到),還不如加flag封裝成mkv。

這個方式使用libx264去壓,相容性理論上應該最好,但代價是超級吃CPU,4k的影片在電競筆電(i9-10880H)需要約錄影時間的十倍去軟體壓縮…。比較不重要的選項我在過程中我在過程中已經盡可能拔掉了,剩下應該都是需要的。-i輸入檔案,-filter_complex呼叫複雜濾鏡,對0:v的影片依照順序選擇view:1左眼(超廣角鏡頭)與view:0右眼(廣角鏡頭)(前面提到的重點3,所以在這邊要交換視角),用hstack排列,拋棄ai生成時會指定[out]與-map "[out]",-c:v指定libx264壓縮與畫質(數字越小越好),-c:a音訊直接copy,-metadata設定mkv用的立體旗標

測試時有發現win11現在拖進去的預設的工作目錄不是在%~dp0而是%~dp1,所以ffmpeg前加了強制指定目錄。

如果很堅持要用mp4的話可以用以下,本來沒打算弄的但試過還是有效。mp4只能使用frame-packing配合。

"%~dp0\ffmpeg" -i "%~1" ^
-filter_complex "[0:v:view:1][0:v:view:0]hstack" ^
-c:v libx264 -crf 20 -x264opts "frame-packing=3" ^
-c:a copy ^
"%~dpn1.yt3d.simple4.mp4"

 

 

Method2--x264 NVGPU compsion (FHD only)

"%~dp0\ffmpeg" -i "%~1" ^
-filter_complex "[0:v:view:1][0:v:view:0]hstack" ^
-c:v h264_nvenc -preset p5 -rc vbr -cq 19 ^
-c:a copy ^
-metadata:s:v:0 stereo_mode=1 ^
"%~dpn1.h264_nvenc.yt3d.s3.mkv"

查詢了一下之後,發現可以調用H264 + nVidia GPU加速,把codec換成h264_nvenc就好。但這邊有個幾個代價。

  • h264_nvenc不支援x264opt,所以只能用mkv封裝。
  • h264_nvenc只支援到4096x4096,我用copilot查詢的情況是,nVidia GPU 9xx~50xx,H264都只支援到4096*4096,但HEVC從10xx開始就支援8k,所以硬壓對應4k*2應該是可行的。

過程中我還試過呼叫cuda,想把影片放VRAM內加速,結果也是卡4k限制。理論上是還有還有降寬度解析度去上傳著方式但我不想這樣做…。至於能不能把影片旋轉後硬塞…,感覺好像可以但要找時間再研究。而且應該會犧牲高度解析度(2160->2048)。

 

 

Method3--HEVC NVGPU compsion (beta, unstable)

"%~dp0\ffmpeg" -i "%~1" ^
-filter_complex "[0:v:view:0]fps=60000/1001,settb=AVTB[v0]; [0:v:view:1]fps=60000/1001,settb=AVTB[v1]; [v1][v0]hstack=inputs=2[out]" ^
-map "[out]" ^
-map 0:a? ^
-c:v hevc_nvenc -preset p5 -rc:v vbr -cq 20 -b:v 0 ^
-c:a copy ^
-fps_mode cfr ^
-metadata:s:v:0 stereo_mode=1 ^
"%~dpn1.hevc_nvenc.fps2997.yt3d.mkv"

大魔王版,一看就知道command多超多,這也是這篇文章是beta與unstable的原因,因為錄出來的影片長時間時間軸會不會跑掉我也要找時間試試看。

前面提過重點一與重點二,Samsung S25 Ultra的3d錄影是單一串流,多視角,frame packed,HEVC_NVENC這邊在跑的時候似乎會遇到時間戳問題,Copilot的說法是x264對時間戳容忍度高,但HEVC不是,所以遇到這種multiview的狀況HEVC_NVENC對應不來。我還沒去驗證不靠GPU加速的一般lib會不會有這問題,但一般lib不能GPU加速的話就沒價值了所以我不會去試。試出來對應的解法是強制將view的fps拉高,並在後面鎖死FPS成CFR。

這個狀況更神奇的是我如果想拆單一視角影片還不一定能拆出來,本來想作為驗證用的但連驗證都沒辦法,Copilot給的解釋是用甚麼hwdownload/hwupload/scale等filter,他運作的還是HEVC的multiview還是沒被破壞掉。推測如果硬把影片做左右裁切後再stack就可以了,但為了單一視角的測試影片感覺有點太耗時間...不太想這樣做。

所以這個方法雖然可用,但時間戳是被重新生成過的,總frame數也會差個幾格,會不會真有個情形S25U錄影時的VFR強轉CFR會有問題也不知道,長時間是不是穩定的可能要再重試,但好處是4k影片可以GPU加速壓縮,前面Medho1的影片壓4k 1分鐘的影片,如果需要10分鐘,那這方法只需要2分鐘(依GPU能力而定,我是用筆電的RTX3050。)

 

 

結論

我要找時間試試看錄長時間影片用Method3有沒有問題zzzz,可以的話應該會是最好的方式,但最近工作好累zzz

 

 

沒有留言: