用 Pixpro SP360 4K 錄製立體 180 度 VR 影片

2016/12/19 下午10:38:43

比起一般360影片,正面180度的立體影片可說是沉浸感更高的影片類型,一般360只是像在一個球形螢幕裡面四周看,而立體影片會讓你身歷其境,或許一開始會有只有180度的疑慮,但其實稍微左顧右盼已經足夠,很少會有想轉到身後的時候。

PIXPRO SP360 4K是一台可以錄製超廣角的運動攝影機,也可以買兩台同時攝影,縫成360環景影片。但它其實也非常適合去錄製雙眼立體正面180度VR影片。

下面便介紹硬體設備的準備,以及影片處理的一些流程。

硬體設備

Kodak SP360 4K

SP360 4K(特別指雙機組)非常適合拿來拍攝180度VR立體影片。

  • 單機拍攝具有235度的視野。
  • 有遙控器可以同時控制兩台錄製(大約只會有1~2格時間差)。
  • 拍出來是2880x2880的魚眼原始檔,易於後期處理,甚至可以做出5760x2880的高解析影片。
  • 可能因為規格特別,還需要兩台才能拍360比較麻煩,較不受消費者青睞,價錢下殺頗大。

立體支架

有了兩台SP360 4K跟遙控器,接下來需要可以讓兩個攝影機平行拍攝的支架。

目前能找得到的專用支架都是3D列印的,一種是可以從eBay、淘寶購得,另一種是這位Mark先生的特別製作並有詳細心得解說。

本篇所使用的是淘寶購入的版本。

三軸穩定器

最後一個非常重要的設備是三軸穩定器,如果沒有三軸穩定器,你只能架在腳架上立定拍攝。

因為就算輕微地震動,都會嚴重影響觀看時的舒適度,容易暈眩出戲。

但如果有三軸穩定器,你手持著像常人一樣走路爬山都沒問題(當然還是能穩盡量穩)。

而且三軸穩定器能讓你持續保持水平,而拍攝立體VR最重要的就是保持水平,不仰不俯,是觀看的人自己要去抬頭低頭。

不過就算有三軸穩定器,還是要練習如何「轉彎」,這是會影響舒適度的一個大環節。

這裡使用的是智雲Zhiyun Crane-M,是一支可續航12小時的輕便三軸穩定器,雖然只能承重650g,但配著兩台SP360 4K恰到好處。平常就像上圖的組裝方式,收納在背包裡,出去旅遊時便可以隨時拿出來紀錄一段。

後製處理

接下來說明拍攝完的處理步驟。

攤平素材

拍完後的素材,如圖是2880x2880的魚眼影片,要先將魚眼的原始素材展開成Equirectangular(等距長方投影)。

展開的方式,嘗試過Autopano、AE的RE:lens、Nuke的CARA VR,結果仍不如官方附屬程式360stitch來得好(CARA VR很接近,但還是有些落差),可惜360stitch非常陽春,就只能縫合輸出3840x2160影片,沒有細節參數可以調整。

360stitch本意是將兩台機器拍攝的影片接成360,但我們只是拿來展開,所以便把兩個影片都設為同個影片輸出,結果如下:

注意將接縫設定為「銳利」。

疊合左右眼

將左右眼都展開後,因為要傳到youtube,所以採用Over/Under上下立體拼接:將左眼擺在上層,右眼擺在下層疊起來。

拼接完後,還必須給上一層mask去遮住不需要看到的地方,譬如後面180度範圍,以及左右眼會看到彼此鏡頭的部分。

在這邊我是直接按照影片截圖去做了一張透明PNG。

處理完的結果就是一個4096x4096的360立體影片(但後面180度是遮住的):

批次處理

許多網路上的方法都是用Premiere、Finalcut或者AE去做上述步驟的處理,但如果你拍攝很多片段,這是很耗時的事情,更何況只是簡單的兩個步驟:疊加影片->蓋上遮罩。

所以這邊我是用Python配上ffmpeg去做批次處理 (如果cmd指令夠強其實也不用進到python)

像這樣已經用stitch360輸出影片並命好名稱(這步驟避免不了,真心希望柯達可以開放command line)
另外要注意的是用stitch360輸出前可以先將左右兩眼影片拖進程式,去讓程式判斷聲音同步的誤差,通常是0~2格。

接著執行下面script(ffmpeg已經有設定PATH環境變數)

import glob, subprocess, os video_list = glob.glob("*_l.mp4") for video_file in video_list: video_name = video_file.replace("_l.mp4", "") cmd = 'ffmpeg -i {0}_l.mp4 -i {0}_r.mp4 -i mask_360.png -filter_complex "[0:v]pad=iw:ih*2[base]; [base][1:v]overlay=0:H/2:shortest=1[over]; [over][2:0]overlay=0:0[output]" -map [output] -map 0:a:0 -c:v libx264 -crf 17 -y output/{0}.mp4'.format(video_name) subprocess.call(cmd, shell=True)

整個script用意就是蒐集影片,合併並貼上遮罩輸出。

快速剪輯

一般來說到這邊,影片就完成了。

但如果你想要剪接,用一般編輯軟體,4096x4096的高解析度,又慢又會二次轉碼損傷畫質。
於是也手動一點,用ffmpeg做無編碼剪輯,雖然剪接點可能會有點小落差,不過通常這種VR立體展示影片是不會太計較,而且輸出幾秒就可以完成。

這些是照上一步驟輸出已合併的立體影片,建立一個edit.txt文字檔並把檔名跟剪接的in、out點寫上,讓script去做剪裁跟合併的依據。

edit.txt內容範例:

01 20 1:20 02 37 2:40 03 1:03 2:27 03 4:08 5:31 04 1:33 2:19

Script內容:

import subprocess, os def duration(st, et): def cnvSecs(t): if t.find(":") != -1: t_s = t.split(":") ct = int(t_s[0])*60 + int(t_s[1]) else: ct = int(t) return ct return str(cnvSecs(et) - cnvSecs(st)) def cmdEdit(filename, st, et, outputname): return "ffmpeg -ss {0} -i {1}.mp4 -t {2} -c copy -avoid_negative_ts 1 -y {3}.mp4".format(st, filename, duration(st, et), outputname) with open('edit.txt', 'r') as f: f_list = f.read().splitlines() output_list = [] for idx, l in enumerate(f_list, 1): cmds = l.split(" ") outputname = "edit_{0}".format(idx) output_list.append(outputname) subprocess.call(cmdEdit(cmds[0], cmds[1], cmds[2], outputname), shell=True) edit_list = ["file '" + s + ".mp4'\n" for s in output_list] with open('temp.txt', 'w') as f: f.write("".join(edit_list)) subprocess.call("ffmpeg -f concat -i temp.txt -c copy edited.mp4", shell=True) remove_list = [s + ".mp4" for s in output_list] remove_list.append("temp.txt") for file in remove_list: os.remove(file)

其實網路上也有些免編碼帶UI的剪輯程式可以方便使用。

另外,如果沒有要上傳到youtube需求,其實side by side的方式可以簡潔一點,因為只要4096x2048的尺寸,不需要留後面180度的黑幕,不過其實容量差不多。

這邊留有之前side by side的bat內容:

ffmpeg -i input_l.mp4 -i input_r.mp4 -i mask_180.png -filter_complex ^ "[0:v]crop=1920:1920:960:0[crop_left]; ^ [1:v]crop=1920:1920:960:0[crop_right]; ^ [crop_left]pad=iw*2:ih[base]; ^ [base][crop_right]overlay=W/2:0:shortest=1[sth]; ^ [sth][2:0]overlay=0:0[output] ^ " -map [output] -map 0:a:0 -c:v libx264 -crf 17 -y VRsbs.mp4

範例影片

最後附上最近錄製的幾段影片,youtube這邊要看原始解析度可能會很頓,所以也附上影片原始檔連結,在手機用橙子vr或者在電腦用virtual desktop選擇360 Over-under觀看。